Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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
Delphi XE10.x FireDAC-查询过程中与MySQL服务器的连接丢失错误_Mysql_Sql_Delphi_Firedac - Fatal编程技术网

Delphi XE10.x FireDAC-查询过程中与MySQL服务器的连接丢失错误

Delphi XE10.x FireDAC-查询过程中与MySQL服务器的连接丢失错误,mysql,sql,delphi,firedac,Mysql,Sql,Delphi,Firedac,我使用以下代码构建此简单查询: FDQuery1.SQL.Text := 'INSERT INTO album SET customer_id=' + Chr(39) + IntToStr(CustomerID) + Chr(39) + ',lab_id=' + Chr(39) + IntToStr(LabID) + Chr(39) + ', album_name_c = ' + Chr(39) + ProjectFolderName + Chr(39) + ',

我使用以下代码构建此简单查询:

FDQuery1.SQL.Text := 'INSERT INTO album SET customer_id=' + Chr(39) + IntToStr(CustomerID) + Chr(39) + ',lab_id=' + Chr(39) + IntToStr(LabID) + Chr(39) +
        ', album_name_c = ' + Chr(39) + ProjectFolderName + Chr(39) +
        ', album_name_s = ' + Chr(39) + ProjectFolderNameOnServer + Chr(39) +
        ' ,album_size=' + Chr(39) + txtAlbumSize.Text + Chr(39) +
        ', album_paper=' + Chr(39) + txtPaperFinish.Text + Chr(39) +
        ', album_cover=' + Chr(39) + txtCover.Text + Chr(39) +
        ', album_binding=' + Chr(39) + txtBinding.Text + Chr(39) +
        ', album_coating=' + Chr(39) + txtCoating.Text + Chr(39) +
        ', starts_from=' + Chr(39) + BoolToStr(chkRight.Checked) + Chr(39) +
        '; SELECT LAST_INSERT_ID() AS RecID;';
但当我调用FDQuery1.OpenOrExecute时,我会收到错误消息,如本文主题所述

当前查询长度约为299个字符

我在互联网上的某个地方读到,查询长度应该小于255个字符,因此我也尝试缩短查询,但将其长度保持在255个字符以下

但我还是收到了同样的错误信息

我在这里做错了什么请引导我

短暂性脑缺血发作


杨瑜珈

好的,我终于找到了实际问题并解决了

碰巧,dumb FireDAC的Query组件不支持原始post中所述格式的查询。我必须按照SQL规范构建传统的插入查询

尽管MySQL支持使用SET关键字的查询,而且我一直在PHP项目中使用它,所以不存在查询错误的问题

好的,在另一个论坛上,我在其他开发人员的建议/帮助下构建了一个参数化查询,并使用它,如下所示:

FDQuery1.SQL.Text := 'INSERT INTO album(customer_id, album_name_c, album_name_s, album_size, album_paper, album_cover, album_binding, album_coating, starts_from, total_files, lab_id, upload_date, album_uploaded) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?);';

        FDQuery1.Params.Items[0].AsInteger := CustomerID;
        FDQuery1.Params.Items[1].AsString := ProjectFolderName;
        FDQuery1.Params.Items[2].AsString := ProjectFolderNameOnServer;
        FDQuery1.Params.Items[3].AsString := AlbumSize;
        FDQuery1.Params.Items[4].AsString := PaperFinish;
        FDQuery1.Params.Items[5].AsString := Cover;
        FDQuery1.Params.Items[6].AsString := Binding;
        FDQuery1.Params.Items[7].AsString := Coating;

        if chkLeft.Checked then
          FDQuery1.Params.Items[8].AsString := '1'
        else
          FDQuery1.Params.Items[8].AsString := '0';

        if chkRight.Checked then
          FDQuery1.Params.Items[8].AsString := '2'
        else
          FDQuery1.Params.Items[8].AsString := '0';

        FDQuery1.Params.Items[9].AsInteger := lstFiles.Count;
        FDQuery1.Params.Items[10].AsInteger := LabID;
        FDQuery1.Params.Items[11].AsDate := Now;
        FDQuery1.Params.Items[12].AsString := '1';

        FDQuery1.Execute;
由于这个参数化查询,我不必使用Chr(39)向varchar和数据字段数据添加单引号

我希望这将帮助其他开发者解决他们可能面临的类似问题

问候,


Yogi Yang

也许这会有所帮助(这里不应该讨论查询长度,而应该讨论其执行时间)。并开始使用参数(除了保护应用程序。如果您经常执行此查询,则查询的性能可以从SQL注入中快速提高)。我无法设置连接超时,因为我正在使用Delphi编程,并且不使用某些第三方数据库管理软件。我尝试将数据插入的MySQL服务器托管在Go Daddy服务器上。若我使用select查询,我可以从服务器上获取数据,一切正常,但我无法插入或更新任何数据……嗯,那个么这里并没有太多建议。您可以“调优”
ReadTimeout
和/或
WriteTimeout
连接字符串参数,但仍有可能是服务器切断了您的连接。不过,首先我要检查为什么查询的执行需要这么长的时间(有多长时间,触发器、索引?)。如果这是一个合理的时间,我会与服务器管理员协商超时(因为FireDAC默认为足够的超时)。在任何情况下都要使用查询参数。我尝试了所有方法。该查询在任何时候都不计时。我能够使用SELECT查询从服务器检索数据。但是,当我尝试在服务器上禁用/更新数据时,它会立即崩溃,并且没有任何处理时间。我检查并再次检查了超时,但这并没有发生,因为在执行FDQuery1.OpenOrExecute时会立即抛出错误消息。