解决方法保留字

时间:2015-10-05 15:46:47

标签: sql ado ms-access-2013 delphi-xe8

我有一个名为Candidates的表格,其中包含字段C_IDC_SurnameC_NamesC_Gender。单词NAMES在Microsoft Jet 4.0中保留,因此SQL语句SELECT C_Names AS Names不起作用。是否有任何解决方法可以使用名称作为标识符?

注意:我的连接方法是ADO。

更新

看到没有提供的答案有效,这是我的完整SQL语句:

SELECT
  C.C_ID AS ID,
  StrConv(C.C_Surname, 3) AS Surname,
  StrConv(C.C_Names, 3) AS Name,
  Sum(V.V_ClassA * M.M_Multiplier) AS ClassA,
  Sum(V.V_ClassB * M.M_Multiplier) AS ClassB,
  Sum(V.V_ClassC * M.M_Multiplier) AS ClassC
FROM
  ((Candidates AS C
    INNER JOIN Votes AS V ON C.C_ID = V.C_ID)
    INNER JOIN Parties AS P ON V.P_ID = P.P_ID)
    INNER JOIN Multiplier AS M ON P.P_Type = M.P_Type
GROUP BY
  C.C_ID,
  C.C_Surname,
  C.C_Names
ORDER BY
  Sum(V.V_ClassA * M.M_Multiplier) DESC,
  Sum(V.V_ClassB * M.M_Multiplier) DESC,
  Sum(V.V_ClassC * M.M_Multiplier) DESC;

实施代码

begin
  with dmBKElections.qryTallyVotes, SQL do
    begin
      Clear;
      Add('SELECT');
      Add('  C.C_ID AS ID,');
      Add('  StrConv(C.C_Surname, 3) AS Surname,');
      Add('  StrConv(C.C_Names, 3) AS Name,');
      Add('  Sum(V.V_ClassA * M.M_Multiplier) AS ClassA,');
      Add('  Sum(V.V_ClassB * M.M_Multiplier) AS ClassB,');
      Add('  Sum(V.V_ClassC * M.M_Multiplier) AS ClassC');
      Add('FROM');
      Add('  ((Candidates AS C');
      Add('    INNER JOIN Votes AS V ON C.C_ID = V.C_ID)');
      Add('    INNER JOIN Parties AS P ON V.P_ID = P.P_ID)');
      Add('    INNER JOIN Multiplier AS M ON P.P_Type = M.P_Type');
      Add('GROUP BY');
      Add('  C.C_ID,');
      Add('  StrConv(C.C_Surname, 3),');
      Add('  StrConv(C.C_Names, 3)');
      Add('ORDER BY');
      Add('  Sum(V.V_ClassA * M.M_Multiplier) DESC,');
      Add('  Sum(V.V_ClassB * M.M_Multiplier) DESC,');
      Add('  Sum(V.V_ClassC * M.M_Multiplier) DESC;');
      Open;
    end;
end;

当我改变

Add('  StrConv(C.C_Names, 3) AS Name,');

Add('  StrConv(C.C_Names, 3) AS [Names],');

我收到错误:

项目BKElections_P.exe引发异常类$ C0000005,并在0x0062ee2a处发出消息'访问冲突:读取地址0x000000e2'。

2 个答案:

答案 0 :(得分:0)

如果您使用SQL Server或MySQL,则必须有两个选择:

SELECT Fieldname as "Name" ...

这是ANSI

OR

SELECT Fieldname as [Name]

这是SQL Server和MS Access

在MySQL上你可以使用:

SELECT Fieldname as ´Name´

但是你有可能在.NET中而不是在SQL中得到错误吗? 如果您将列重命名为" name",只有在某些情况下您想要访问具有保留名称的列时,您才会收到此错误。

所以在ADO.NET中你可以尝试:

rst![Name]
rst.Fields("Name")

或者最好的想法:给我们一个代码示例。 请在SSMS中尝试SQL。

答案 1 :(得分:0)

您应该将任何保留字包装在方括号中,如下所示:

[Name]而不是Name