"语法错误插入语句"在使用Delphi6的MS-Access上

时间:2012-12-18 06:53:32

标签: sql delphi ms-access

当我直接在MS-Access上执行SQL Query时,它会插入Record,但是当通过Delphi中的TADOQuery组件时,显示上面的错误。我的代码中的错误是什么?

这是我的代码:

strQuery := 'INSERT INTO MAS_User_Master
            (First_Name, Middle_Name, Last_Name, User_Name, Password, Mobile_No, 
             Email_Id, Security_Question, Security_Answer, Is_Admin, Is_Deleted,
             Created_By, Created_Date) 
            VALUES
            ('Adam', 'G.', 'James', 'adam', 'ada23',9999599990,
             'adam@yahoo.com', 'what', 'yes', -1, 0,
             'admin', Now())'

qryExec.SQL.Add(strQuery);
qryExec.ExecSQL();

编辑:

以上strQuery值在运行时复制。创建我在代码下面使用的语句:

strQuery := 'INSERT INTO MAS_User_Master ' +
                  '(First_Name, Middle_Name, Last_Name, User_Name, Password, Mobile_No, Email_Id, '+
                  'Security_Question, Security_Answer, Is_Admin, Is_Deleted, Created_By, Created_Date) '+
                  'VALUES (''' + UserRec.FirstName + ''', ''' + UserRec.MiddleName +
                  ''', ''' + UserRec.LastName + ''', ''' +  UserRec.UserName + ''', ''' + UserRec.Password +
                  ''',' + UserRec.MobileNubmer + ', ''' + UserRec.EmailId + ''', '+
                  '''' + UserRec.SecurityQuestion + ''', ''' + UserRec.SecurityAnswer + ''', ' +
                  UserRec.IsAdmin + ', 0, '''+ g_strUserName + ''', Now())';

4 个答案:

答案 0 :(得分:2)

qryExec.Paramcheck := true;
qryExec.SQL.Text := 'INSERT INTO MAS_User_Master '
            +'(First_Name, Middle_Name, Last_Name, User_Name, [Password], Mobile_No, '
            +' Email_Id, Security_Question, Security_Answer, Is_Admin, Is_Deleted,'
            +' Created_By, Created_Date)'
            +'VALUES'
            +'(:fn, :mn, :ln, :un, :pw,:mno,'
            +' :em, :q, :an, :isad, :isDel,'
            +' :cb, :cd)';
qryExec.Parameters.ParamByName('fn').Value := 'Adam';
qryExec.Parameters.ParamByName('mn').Value := 'G.';
qryExec.Parameters.ParamByName('ln').Value := 'James';
qryExec.Parameters.ParamByName('un').Value := 'adam';
qryExec.Parameters.ParamByName('pw').Value := 'ada23';
qryExec.Parameters.ParamByName('mno').Value := 9999599990;
qryExec.Parameters.ParamByName('em').Value := 'adam@yahoo.com';
qryExec.Parameters.ParamByName('q').Value := 'what';
qryExec.Parameters.ParamByName('an').Value := 'yes';
qryExec.Parameters.ParamByName('isad').Value := -1;
qryExec.Parameters.ParamByName('isdel').Value := 0;
qryExec.Parameters.ParamByName('cb').Value := 'admin';
qryExec.Parameters.ParamByName('cd').Value := Now();
qryExec.ExecSQL();

另一种方式可能是:

AdoDataset.CommandText :='Select * from MAS_User_Master where 1=0';
AdoDataset.Append;
Adodataset.FieldByName('First_Name').Value := 'Adam';
// and so on
Adodataset.Post;

答案 1 :(得分:2)

Thank You! All of You..

我找到了解决方案:

所有以上查询和语法都正确且正常工作..

Important thing:

我在 MS-Access数据库中有一个 字段 命名为“ PASSWORD ”。 Delphi保留了这个词,所以我们不能使用它们。我更改了Field的名称和所有正常工作......

答案 2 :(得分:0)

有几个可能的错误

首先,您的查询包含引号。要在Delphi中使用字符串中的引号,必须键入双引号以对其进行转义,否则将其视为字符串终止符。这将生成Delphi编译错误。

其次,你Add到SQL。这意味着,如果SQL属性已包含信息,则会向其添加此语句,从而可能导致语句无效。这将生成运行时错误,由ADO在执行ExecSQL方法时生成。

您可以做的其他事情,不会直接解决您的问题,但让您的生活更轻松,您的项目更易于维护:

使用对象检查器编辑SQL属性。您不需要转义引号,可以轻松添加换行符,并且可以在Access to test中执行相同的查询。 您可以对需要执行的每个语句使用TADOQuery(或者更确切地说是TADOCommand用于插入和更新语句),因此您无需更新SQL本身。

要在语句中使用“变量值”,可以使用命令的 Parameters

为了确保它们不会妨碍,在设计时阻止表单的站点,您可以将命令放在数据模块上。

答案 3 :(得分:0)

在Delphi中,您应该使用双引号将一个引号插入到字符串中。 确保qryExec.SQL为空。只需在qryExec.SQL.Clear之前qryExec.SQL.Add。 另外Now()是Delphi函数,因此您应该将Now()的结果转换为字符串以将其放入SQL查询中。

strQuery := 'INSERT INTO MAS_User_Master (First_Name, Middle_Name, Last_Name, User_Name, Password, Mobile_No, Email_Id, Security_Question, Security_Answer, Is_Admin, Is_Deleted, Created_By, Created_Date) VALUES (''Adam'', ''G.'', ''James'', ''adam'', ''ada23'',9999599990, ''adam@yahoo.com'', ''what'', ''yes'', -1, 0, ''admin'', '''+DateToStr(Now())+''' )';

qryExec.SQL.Add(strQuery);
qryExec.ExecSQL();