Delphi XE10.x FireDAC - 在查询

时间:2017-06-07 10:19:47

标签: 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) +
        ', 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

Yogi Yang

1 个答案:

答案 0 :(得分:1)

好吧最后我发现了实际问题并解决了它......

愚蠢的FireDAC查询组件不支持原始帖子中所述格式的查询。我必须根据SQL规范构建传统的Insert查询。

尽管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