我正在尝试从 Delphi 向 Microsoft Access 数据库写入一些代码。我从 TStringGrid 获取数据。第一列有 ItemID,第二列有数量。我希望它遍历 TStringGrid 并将每一行保存为数据库中的重复行,并将订单 ID 保存在每一列上(每个订单的订单 ID 保持相同,因此不需要更改)。
运行时出现错误
"Project Heatmat.exe raised an exception class EVarientInvalidArgError with message 'Invalid Argument'. Process Stopped."
我不明白为什么它会给我这个错误,而且你可能会看到我还不太擅长编码。任何帮助将不胜感激!
谢谢。
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;
最佳答案
TStringGrid
单元格是字符串。尝试将字符串直接分配给数字字段将引发异常。
因此,一个好的做法是通过 AsString
、AsInteger
、AsBoolean
等为数据库字段赋值...这将使正确的转换。
在您的代码中使用:
TBLOrderedItem.FieldByName('ItemID').AsString := StringGrid1.Cells[1, count];
数量
也是如此。
要分配一个整数值使用:
TBLOrderedItem.FieldByName('OrderID').AsInteger := intNumber + 1;
顺便说一句,你忘记了 TBLOrder.Post
即:
....
TBLOrder.Append;
TBLOrder.FieldByName('CustomerID').AsInteger := CompanyName.ItemIndex + 1;
TBLOrder.FieldByName('OrderID').AsInteger := intNumber + 1;
TBLOrder.Post;
...
最后,我还建议将 TBLOrder
重命名为 tblOrder
,这样它的名称就不会暗示它是一个 Type
。
关于database - 写入 MS Access 数据库 (Delphi) 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9702443/