写入MS Access数据库的问题(Delphi)

Cra*_*aig 4 database delphi ms-access

我正在尝试从Delphi向Microsoft访问数据库写入一些代码.我从TStringGrid获取数据.第一列具有ItemID,第二列具有Quantity.我希望它循环遍历TStringGrid并将每一行保存为我的数据库中的重复行,并在每一列上保存订单ID(每个订单的订单ID保持不变,因此不需要更改).

我跑步时遇到错误

"Project Heatmat.exe引发了一个异常类EVarientInvalidArgError,并显示消息'Invalid Argument'.进程已停止."

我无法弄清楚为什么它会给我这个错误,因为你可能会看到我不是很擅长编码.任何帮助,将不胜感激!

谢谢.

procedure TCreateNewOrder.btnSaveClick(Sender: TObject);
var 
  intNumber, count : integer;
begin
  Count:= 0;
  if messagedlg ('Are you sure?', mtWarning, [mbyes, mbno], 0) = mryes then
  begin
    with HeatmatConnection.HeatmatDatabase do
    begin
      intNumber:= TBLOrder.RecordCount;
      TBLOrder.Append;

      TBLOrder['CustomerID']:= CompanyName.ItemIndex+1;
      TBLOrder['OrderID']:= intNumber +1;

      for count:= 1 to StringGrid1.RowCount-1 do
      begin
        TBLOrderedItem.Append;
        TBLOrderedItem['OrderID']:= intNumber+1;
        TBLOrderedItem['ItemID']:= StringGrid1.Cells[1, count];
        TBLOrderedItem['Quantity']:= StringGrid1.Cells[2, count];
        TBLOrderedItem.Post;
      end;
    end;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

kob*_*bik 6

TStringGrid细胞是字符串.尝试将字符串直接分配给数字字段将引发异常.

因此,一个好的做法是将值分配给通过数据库字段AsString,AsInteger,AsBoolean等...这将使正确的转换.

在您的代码中使用:

TBLOrderedItem.FieldByName('ItemID').AsString := StringGrid1.Cells[1, count];    
Run Code Online (Sandbox Code Playgroud)

同样如此Quantity.

要分配整数值,请使用:

TBLOrderedItem.FieldByName('OrderID').AsInteger := intNumber + 1;
Run Code Online (Sandbox Code Playgroud)

顺便说一下,你忘记了TBLOrder.Post:

....
TBLOrder.Append;
TBLOrder.FieldByName('CustomerID').AsInteger := CompanyName.ItemIndex + 1;
TBLOrder.FieldByName('OrderID').AsInteger := intNumber + 1;
TBLOrder.Post;
...
Run Code Online (Sandbox Code Playgroud)

最后,我还建议重命名TBLOrder,tblOrder以便它的名字不会暗示它是一个Type.