2012-03-14 17 views
4

DelphiからMicrosoft Accessデータベースに少しのコードを書き込もうとしています。私はTStringGridからデータを取得しています。最初の列にはItemIDがあり、2列目には数量があります。私はそれがTStringGridをループし、私のデータベース内のreperate行として各行を保存し、すべての列にそれとともに注文IDを保存したい(注文IDは、各注文について同じままで、変更する必要はない)。MS Accessデータベース(Delphi)への書き込みに関する問題

"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; 
+0

フィールド 'Quantity'はいくつかの数値型ですので、 'TBLOrderedItem [' Quantity ']:= StrToInt(StringGrid1.Cells [2、count]);' – ain

+4

try TBLOrderedItem.FieldByName(' Quantity ' ).AsString:= StringGrid1.Cells [2、count] '。数値の場合は 'ItemID'と同じです。ところで、あなたは 'TBLOrder.Post'を忘れています。 – kobik

+0

これはうまくいきました!このプログラムは私にとても苦痛を与えています!私はエラーの後にエラーが発生し続ける! – Craig

答えて

6

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; 
... 

は最後に、私はまた、それはだようtblOrderTBLOrderの名前を変更することをお勧め名前はそれがTypeであることを暗示していません。

関連する問題