【问题标题】:How use the insert query using parameters?如何使用带参数的插入查询?
【发布时间】:2011-12-29 12:13:27
【问题描述】:

当我尝试使用此查询时,我收到一条错误消息,指出 Perameter 电子邮件不存在,我确信变量:email、login_pass、payment_method、operateur 有效且存在。

SQLQuery2.sql.Text := 'INSERT INTO registered (email,login_pass,payment_method,operateur) VALUES (":email",":login_pass",":payment_method",":avecpuce")';
SQLQuery2.ParamByName('email').AsString := email;
SQLQuery2.ParamByName('login_pass').AsString := login_pass;
SQLQuery2.ParamByName('payment_method').AsString := payment_method;
SQLQuery2.ParamByName('avecpuce').AsString := avecpuce;
SQLQuery2.ExecSQL(true);

我尝试删除引号,但我明白了

您的 Sql 语法有错误,请查看与您的 SQL 服务器相对应的手册以获取正确的语法以在附近使用 ':email,:login_pass,:payment_method,:avecpuce)' 在第 1 行

上面的插入查询如何使用参数?

【问题讨论】:

  • 你连接的是什么类型的数据库?是MySql、SQL Server等吗?
  • SQLQuery2 是什么类型 - 它是 TQuery 还是 TADOQuery?
  • 不是 Tquery 也不是 Tadoquery,而是 TSQLQuery。 @codeulike

标签: sql delphi delphi-2010


【解决方案1】:

来自TSQLQuery.ExecSQL 文档:

ExecDirect 表示不需要准备查询 在执行之前。这个参数可以设置为true,如果查询 不包含任何参数。

所以如果代码使用

SQLQuery2.ExecSQL(true);

这意味着将不支持参数。

但是因为你使用参数,所以就使用

SQLQuery2.ExecSQL;

并删除参数周围的引号。

【讨论】:

    【解决方案2】:

    去掉引号:

    SQLQuery2.sql.Text := 'INSERT INTO registered (email,login_pass,payment_method,operateur)
       VALUES (:email, :login_pass, :payment_method, :avecpuce)';
    

    【讨论】:

    • 您的 Sql 语法有错误,请查看与您的 SQL 服务器相对应的手册,以在第 1 行的 ':email,:login_pass,:payment_method,:avecpuce)' 附近使用正确的语法
    • SQL 语法完美(我使用的是 Firebird)。我只能猜测你的情况有什么问题,可能是你应该使用不同的符号作为参数前缀('?'或'@'而不是':')。
    • 是的,纠正了语法问题,但我仍然收到错误 EDatabase Error 'SQLQuery2: parameter 'email' not found'
    • 当我使用引号时也是同样的错误。谢谢你的回复!
    【解决方案3】:

    找到答案了!

    MySQLQuery2.SQL.Clear;
    MySQLQuery2.SQL.Add('INSERT INTO COUNTRY (NAME, CAPITAL, POPULATION)');
    MySQLQuery2.SQL.Add('VALUES (:Name, :Capital, :Population)');
    MySQLQuery2.Params[0].AsString := 'Lichtenstein';
    MySQLQuery2.Params[1].AsString := 'Vaduz';
    MySQLQuery2.Params[2].AsInteger := 420000;
    MySQLQuery2.ExecSQL;
    

    谢谢大家!!

    【讨论】:

    • 你的答案就是我的答案 :) 很高兴我能帮上忙
    • 如果您已经阅读了 mjn 的答案,您会节省一天的时间,也可以省去自己发布答案的麻烦。
    • mjn 答案对我不起作用,问题不仅在于 execSQL,还在于查询字符串本身,这不应该像我在回答中提到的那样,而是应该输入通过使用 MySQLQuery.SQL.Add 。感谢 mjn 发布有关 execSQL 真假问题的帮助。
    • @Rafik Bari: SQLQuery2.sql.Text := ... 和 SQLQuery2.sql.Clear; ... SQL.Add 两者都做同样的事情。
    • 好的!谢谢你无论如何你的回答也对我帮助太大了!
    【解决方案4】:

    您通常不引用参数,只引用文字。所以而不是:

    VALUES (":email",":login_pass",":payment_method",":avecpuce")
    

    试试:

    VALUES (:email,:login_pass,:payment_method,:avecpuce)
    

    【讨论】:

    • 您的 Sql 语法有错误,请查看与您的 SQL 服务器相对应的手册,以在第 1 行的 ':email,:login_pass,:payment_method,:avecpuce)' 附近使用正确的语法
    • 奇怪了,看看有没有异常的空白字符? (手动重新输入查询,无需复制/粘贴)
    【解决方案5】:

    您不应在参数名称周围使用引号。

    如果您的 TSQLQuery 已分配连接并且 ParamCheck 为真并且您分配了 TSQLQuery.CommandText,则会自动为您生成参数。

    将查询分配给 TSQLQuery.SQL.Text 时不会生成参数。

    您可以通过调用 TSQLQuery.Params.ParseSQL 为您生成参数:

    SQLQuery2.Params.ParseSQL(SQLQuery2.SQL.Text, True);
    

    或者您可以通过调用 TSQLQuery.Params.AddParameter 自己添加它们。

    【讨论】:

      猜你喜欢
      • 2018-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      相关资源
      最近更新 更多