Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 查询可以在SQLServerManagementStudio 2008上运行,但不能在delphi中运行_Sql Server 2008_Delphi - Fatal编程技术网

Sql server 2008 查询可以在SQLServerManagementStudio 2008上运行,但不能在delphi中运行

Sql server 2008 查询可以在SQLServerManagementStudio 2008上运行,但不能在delphi中运行,sql-server-2008,delphi,Sql Server 2008,Delphi,我正在开发一个程序,用SQLServer更新Delphi7中表中的一些字段。 程序如下所示: sql := 'UPDATE tb_dt_contract SET ' +' id_schedule = '+quotedstr(label_id_schedule.Caption) +',start_date = '+quotedstr(formatdatetime('mm/dd/yyyy',DateTime_start.Date)) +',finish_date

我正在开发一个程序,用SQLServer更新Delphi7中表中的一些字段。 程序如下所示:

sql := 'UPDATE tb_dt_contract SET '
      +' id_schedule = '+quotedstr(label_id_schedule.Caption)
      +',start_date = '+quotedstr(formatdatetime('mm/dd/yyyy',DateTime_start.Date))
      +',finish_date = '+quotedstr(formatdatetime('mm/dd/yyyy',DateTime_finish.Date))
      +',contract_location = '+quotedstr(uppercase(Edit_location.Text))
      +',sign_date = '+quotedstr(formatdatetime('mm/dd/yyyy',DateTime_sign.Date))
      +' WHERE id = '+quotedstr(label_id.Caption);
ADOQuery1.Close;
ADOQuery1.SQL.Text := sql;
ADOQuery1.ExecSQL;
SQL := 'UPDATE tb_dt_contract SET '
      +' id_schedule = '+QUOTEDSTR(label_id_schedule.CAPTION)
      +' WHERE id = '+quotedstr(label_id.Caption);
ADOQuery1.Close;
ADOQuery1.SQL.Text := sql;
ADOQuery1.ExecSQL;

SQL := 'UPDATE tb_dt_contract SET '
      +' start_date = '+quotedstr(formatdatetime('mm/dd/yyyy',DateTime_start.Date))
      +' WHERE id = '+quotedstr(label_id.Caption);
ADOQuery1.Close;
ADOQuery1.SQL.Text := sql;
ADOQuery1.ExecSQL;

SQL := 'UPDATE tb_dt_contract SET '
      +' finish_date = '+quotedstr(formatdatetime('mm/dd/yyyy',DateTime_finish.Date))
      +' WHERE id = '+quotedstr(label_id.Caption);
ADOQuery1.Close;
ADOQuery1.SQL.Text := sql;
ADOQuery1.ExecSQL;

SQL := 'UPDATE tb_dt_contract SET '
      +' contract_location = '+quotedstr(uppercase(edit_location.Text))
      +' WHERE id = '+quotedstr(label_id.Caption);
ADOQuery1.Close;
ADOQuery1.SQL.Text := sql;
ADOQuery1.ExecSQL;

SQL := 'UPDATE tb_dt_contract SET '
      +' sign_date = '+quotedstr(formatdatetime('mm/dd/yyyy',DateTime_sign.Date))
      +' WHERE id = '+quotedstr(label_id.Caption);
ADOQuery1.Close;
ADOQuery1.SQL.Text := sql;
ADOQuery1.ExecSQL;
当我运行程序时,它会给我一个错误:“=”附近的语法不正确。但是,当我使用showmessage查看查询并在SQLServerManagement2008中运行它时,它工作得很好

然后我尝试将查询拆分为如下部分:

sql := 'UPDATE tb_dt_contract SET '
      +' id_schedule = '+quotedstr(label_id_schedule.Caption)
      +',start_date = '+quotedstr(formatdatetime('mm/dd/yyyy',DateTime_start.Date))
      +',finish_date = '+quotedstr(formatdatetime('mm/dd/yyyy',DateTime_finish.Date))
      +',contract_location = '+quotedstr(uppercase(Edit_location.Text))
      +',sign_date = '+quotedstr(formatdatetime('mm/dd/yyyy',DateTime_sign.Date))
      +' WHERE id = '+quotedstr(label_id.Caption);
ADOQuery1.Close;
ADOQuery1.SQL.Text := sql;
ADOQuery1.ExecSQL;
SQL := 'UPDATE tb_dt_contract SET '
      +' id_schedule = '+QUOTEDSTR(label_id_schedule.CAPTION)
      +' WHERE id = '+quotedstr(label_id.Caption);
ADOQuery1.Close;
ADOQuery1.SQL.Text := sql;
ADOQuery1.ExecSQL;

SQL := 'UPDATE tb_dt_contract SET '
      +' start_date = '+quotedstr(formatdatetime('mm/dd/yyyy',DateTime_start.Date))
      +' WHERE id = '+quotedstr(label_id.Caption);
ADOQuery1.Close;
ADOQuery1.SQL.Text := sql;
ADOQuery1.ExecSQL;

SQL := 'UPDATE tb_dt_contract SET '
      +' finish_date = '+quotedstr(formatdatetime('mm/dd/yyyy',DateTime_finish.Date))
      +' WHERE id = '+quotedstr(label_id.Caption);
ADOQuery1.Close;
ADOQuery1.SQL.Text := sql;
ADOQuery1.ExecSQL;

SQL := 'UPDATE tb_dt_contract SET '
      +' contract_location = '+quotedstr(uppercase(edit_location.Text))
      +' WHERE id = '+quotedstr(label_id.Caption);
ADOQuery1.Close;
ADOQuery1.SQL.Text := sql;
ADOQuery1.ExecSQL;

SQL := 'UPDATE tb_dt_contract SET '
      +' sign_date = '+quotedstr(formatdatetime('mm/dd/yyyy',DateTime_sign.Date))
      +' WHERE id = '+quotedstr(label_id.Caption);
ADOQuery1.Close;
ADOQuery1.SQL.Text := sql;
ADOQuery1.ExecSQL;

然后我发现它只在更新日期类型字段时触发错误。我开发了其他程序来使用类似的查询更新不同的表,效果很好。。我试图关闭项目并重新打开它,但它仍然给我那个错误消息。请告诉我应该怎么做。

为了避免转换和创建与数据库无关的保存查询,您应该使用参数,如果使用多次,还可以加快操作

  Adoquery1.SQL.Text := 'UPDATE tb_dt_contract SET finish_date=:df where WHERE id =:id';
  // in some cases it may be necessary to add  the three comented lines
  //Adoquery1.Parameters.ParseSQL(Adoquery1.SQL.Text,true);
  //Adoquery1.Parameters.ParamByName('df').DataType := ftDateTime;
  //Adoquery1.Parameters.ParamByName('id').DataType := ftInteger;
  Adoquery1.Parameters.ParamByName('df').Value :=DateTime_finish.Date;
  Adoquery1.Parameters.ParamByName('ID').Value :=StrToInt(label_id.Caption);
  Adoquery1.ExecSQL;
我知道了!(更像是我的同事)


显然在替换了FormatDateTime之后('mm/dd/yyyyy'和datetostr,并将shortdateformat设置为'mm/dd/yyyy',查询工作正常。但我想知道为什么会这样?我认为这些命令也可以做同样的事情?

Bummi,可能需要添加一个事实,即在设置SQL之前必须将Adoquery.ParamCheck设置为Truetext@whosrdaddy谢谢,确实会让它更舒适mCheck默认值为true,您可以将其与Adoquery.ParamCheck:=false一起使用,并自行执行:Adoquery1.Parameters.ParseSQL(Adoquery1.SQL.Text,true);Adoquery1.Parameters.ParamByName('df')。数据类型:=ftDateTime;….Bummi-我认为ID应该是(var)char,不需要使用参数。但是请注意,“mm/dd/yyyy”不是一种可靠的格式(它可以切换月份和日期)。以后使用'yyyymmdd'。哦?我可以在sql server中编辑日期格式吗?我使用了mm/dd/yyyy,因为我认为这是sql server中用于日期时间的格式?没有。这不是一个有效的假设。'yyyymmdd'是iso,所以应该可以安全使用。不要这样做。按照Bummi说的方式进行。区别可能是您没有设置日期分隔符,仅ShortDateFormat这是因为不带formatsettings的DateToStr使用本地化的计算机设置,而您的数据库可能喜欢也可能不喜欢该格式。使用FormatDateTime(YYYYMMD),消除歧义:考虑01 / 02 / 03,对于世界上的一些人来说,这是1月2日2003,但对于其他人来说,第一的Healual2003,甚至一些人会说2001,Healual第三。YyYYMMD是通用的。20030201总是Huruuri 2003的第一。