写入 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 tblOrdertblOrderItem 之前。如果orderIdorederItems 中的外键(应该如此),它将不起作用(因为未插入orderId) 4. 将orderid 设为自动增量/身份/计数器 - 所以没有需要intNumber + 1 【参考方案1】:

TStringGrid 单元格是字符串。尝试将字符串直接分配给数字字段将引发异常。

所以一个好的做法是通过AsStringAsIntegerAsBoolean 等为数据库字段分配值......这将进行正确的转换。

在您的代码中使用:

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 以进行数据库连接所需的文件

带有 MS Access 2010 数据库的 Delphi FireDAC。为啥它将 ACE 转换为 Jet?

MS-ACCESS 写入冲突问题

delphi SQL查询并显示