【问题标题】:Delphi XE10.x FireDAC - Error lost connection to MySQL server during queryDelphi XE10.x FireDAC - 查询期间错误失去与 MySQL 服务器的连接
【发布时间】:2017-11-08 15:26:41
【问题描述】:

我正在使用以下代码构建这个简单的查询:

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 个字符以下。

但我仍然收到相同的错误消息。

我在这里做错了什么请指导我。

TIA

杨洋

【问题讨论】:

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

标签: mysql sql delphi firedac


【解决方案1】:

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

碰巧dumb FireDAC 的查询 组件不支持原始帖子中所述格式的查询。我必须按照 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 和数据字段数据添加单引号。

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

问候,

杨洋

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-25
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 2020-10-23
    • 1970-01-01
    • 2012-11-15
    相关资源
    最近更新 更多