2012-03-14 1 views
4

Delphi에서 Microsoft Access 데이터베이스에 약간의 코드를 작성하려고합니다. TStringGrid에서 데이터를 가져옵니다. 첫 번째 열에는 ItemID가 있고 두 번째 열에는 Quantity가 있습니다. 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'도 마찬가지입니다. BTW, 당신은'TBLOrder.Post'를 잊고 있습니다. – kobik

+0

감사합니다 이것이 효과가있는 것 같습니다! 이 프로그램은 나를 고통스럽게 만들고있다. 오류가 발생하면 계속 오류가 발생합니다! – Craig

답변

6

TStringGrid 세포는 문자열입니다. 숫자 필드에 문자열을 직접 할당하면 예외가 발생합니다.

AsString, AsInteger, AsBoolean 등을 통해 데이터베이스 필드에 값을 할당하는 것이 좋습니다. 그러면 올바른 변환이 이루어집니다. 코드의 사용에서

는 :

TBLOrderedItem.FieldByName('ItemID').AsString := StringGrid1.Cells[1, count];  

동일 Quantity 마찬가지입니다.

정수 값 사용을 지정하려면 :

.... 
TBLOrder.Append; 
TBLOrder.FieldByName('CustomerID').AsInteger := CompanyName.ItemIndex + 1; 
TBLOrder.FieldByName('OrderID').AsInteger := intNumber + 1; 
TBLOrder.Post; 
... 

마지막으로, 나는 또한 그래서 있다는 TBLOrdertblOrder에 이름을 바꾸려면 제안 : BTW

TBLOrderedItem.FieldByName('OrderID').AsInteger := intNumber + 1; 

을, 당신은 TBLOrder.Post 즉 잊고있다 이름은 Type임을 암시하지 않습니다.

관련 문제