我正在使用以下代码构建这个简单的查询:
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答案 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