0

当我直接在 MS-Access 上执行 SQL 查询时,它将插入记录,但是当通过 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

4 回答 4

2
Thank You! All of You..

我找到了解决方案:

上述所有查询和语法都是正确且有效的..

Important thing:

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

于 2012-12-18T10:36:27.217 回答
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;
于 2012-12-18T07:36:44.890 回答
0

有几个可能的错误

首先,您的查询包含引号。要在 Delphi 中的字符串中使用引号,您必须键入双引号来转义它,否则它会被视为字符串终止符。这将产生一个 Delphi 编译错误。

二、你Add要SQL。这意味着,如果 SQL 属性已经包含信息,则会将这条语句添加到其中,这可能会导致语句无效。这将生成一个运行时错误,由 ADO 在执行 ExecSQL 方法时生成。

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

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

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

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

于 2012-12-18T07:00:52.930 回答
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();
于 2012-12-18T07:04:16.953 回答