写入 MS Access 数据库 (Delphi) 的问题
Posted
技术标签:
【中文标题】写入 MS Access 数据库 (Delphi) 的问题【英文标题】:Problems with writing to a MS Access Database (Delphi) 【发布时间】:2012-03-14 12:58:33 【问题描述】:我正在尝试将一些代码从 Delphi 写入 Microsoft 访问数据库。我正在从 TStringGrid 获取数据。第一列是 ItemID,第二列是 Quantity。我希望它遍历 TStringGrid 并将每一行保存为我的数据库中的重复行,并将订单 ID 与它一起保存在每一列(每个订单的订单 ID 保持相同,因此不需要更改) .
运行时出现错误提示
“项目 Heatmat.exe 引发异常类 EVarientInvalidArgError 并带有消息‘无效参数’。进程已停止。”
我不知道为什么它给了我这个错误,你可能会看到我还不太擅长编码。任何帮助将不胜感激!
谢谢。
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;
【问题讨论】:
我会怀疑该字段Quantity
是某种数字类型,所以试试TBLOrderedItem['Quantity']:= StrToInt(StringGrid1.Cells[2, count]);
试试TBLOrderedItem.FieldByName('Quantity').AsString := StringGrid1.Cells[2, count]
。 ItemID
也是如此,如果它是数字的话。顺便说一句,你忘了TBLOrder.Post
。
谢谢,这似乎奏效了!这个程序让我很痛苦!我不断出错!
1.你使用什么样的组件(TblOrder
& tblOrderItem
)? 2.什么时候出错:第一次循环迭代,还是随机迭代? 3. 在事务中进行,post
tblOrder
在tblOrderItem
之前。如果orderId
是orederItems
中的外键(应该如此),它将不起作用(因为未插入orderId
) 4. 将orderid
设为自动增量/身份/计数器 - 所以没有需要intNumber + 1
。
【参考方案1】:
TStringGrid
单元格是字符串。尝试将字符串直接分配给数字字段将引发异常。
所以一个好的做法是通过AsString
、AsInteger
、AsBoolean
等为数据库字段分配值......这将进行正确的转换。
在您的代码中使用:
TBLOrderedItem.FieldByName('ItemID').AsString := StringGrid1.Cells[1, count];
Quantity
也是如此。
要分配整数值,请使用:
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
。
【讨论】:
以上是关于写入 MS Access 数据库 (Delphi) 的问题的主要内容,如果未能解决你的问题,请参考以下文章
使用 Delphi 将文本文件加载到 MS ACCESS TABLE
在 Delphi 中的不同数据库中的 MS Access 连接表
使用 ms access 2007 和 ado 部署 delphi 2010 以进行数据库连接所需的文件