2013-10-08 2 views
1

다음은 datagridview 항목을 테이블에 입력하는 데 사용되는 코드입니다.insert statement error vb.net

Dim X As DataGridViewRow 

    grnno = 123123 
    glocation = txtlocation.Text 
    gsupplier = txtsupplier.Text 
    greceivedby = txtreceivedby.Text 
    greceiveddate = txtreceiveddate.Text 
    grn_status = cmbstatus.SelectedItem 
    ggrossamt = txtgrossamt.Text 
    gdiscountamount = txtdiscount.Text 
    gtotalnetamount = txttotalnet.Text 
    sqlstr = "INSERT INTO POS_GRN_HDR(loc_code,supplier_code,created_by,created_Date,grn_status,gross_amt,disc_Amt,net_Amt) values('" & glocation & "','" & gsupplier & "','" & greceivedby & "','" & greceiveddate & "','" & grn_status & "'," & ggrossamt & "," & gdiscountamount & "," & gtotalnetamount & ")" 
    sqlcmd = New SqlClient.SqlCommand(sqlstr, AppsCon) 
    sqlcmd.ExecuteNonQuery() 
    For Each X In datagridItems.Rows 

     sqlstr = "INSERT INTO POS_GRN_DTL(GRN_KEY,ITEM_CODE,DESCRIPTION,TYPE,UOM,BATCH_NO,EXPIRY_DATE,RECEIVED_QTY,UNIT_PRICE,AMOUNT,DISCOUNT,NET_AMOUNT) VALUES('" & grnno & "','" & X.Cells(0).Value & "','" & X.Cells(1).Value & "','" & X.Cells(2).Value & "','" & X.Cells(3).Value & "','" & X.Cells(4).Value & "','" & X.Cells(5).Value & "','" & X.Cells(6).Value & "','" & X.Cells(7).Value & "' ,'" & X.Cells(8).Value & "','" & X.Cells(9).Value & "','" & X.Cells(10).Value & "')" 
     sqlcmd = New SqlClient.SqlCommand(sqlstr, AppsCon) 
     sqlcmd.ExecuteNonQuery() 
    Next 

오류가 2 삽입 성명에서, 그것은 오류가 지금 내가 원하는, 정수 유형 또한 데이터베이스의 정수 타입에 (6) .. x.cell에서 세포를 정수로 문자열을 변환 할 수 있습니다 작은 따옴표로 감싸는 것은 구문 오류와 같은 오류를주고, 큰 따옴표로 보면 문자열을 int로 변환 할 수 없다는 것을 물어 보는 것입니다. 내가 잘못하고있는 곳을 말해주십시오.

+0

예 연결이 열렸습니다 .. 여기에 해당 연결 코드를 추가하지 않았습니다. 앱 구성 파일에 있습니다. –

답변

1

먼저 매개 변수화 된 쿼리를 사용하십시오! 더 안전하고 읽기 쉽습니다. 문자열로 값을 전달하고 있지만 정수 여야합니다.

sqlstr = "INSERT INTO POS_GRN_HDR(loc_code,supplier_code,created_by,created_Date,grn_status,gross_amt,disc_Amt,net_Amt) _ 
values(@glocation, @gsupplier, @greceivedby, @greceiveddate, @grn_status, @ggrossamt, @gdiscountamount, @gtotalnetamount)" 

sqlcmd = New SqlClient.SqlCommand(sqlstr, AppsCon) 
sqlcmd.Parameters.AddWithValue("@glocation", glocation) 
sqlcmd.Parameters.AddWithValue("@gsupplier", gsupplier) //and so on 


For Each X In datagridItems.Rows 

    sqlstr = "INSERT INTO POS_GRN_DTL(GRN_KEY,ITEM_CODE,DESCRIPTION,TYPE,UOM,BATCH_NO,EXPIRY_DATE,RECEIVED_QTY,UNIT_PRICE,AMOUNT,DISCOUNT,NET_AMOUNT) _ 
      VALUES(@grnno, @item_code, @description, ...)" 

    sqlcmd = New SqlClient.SqlCommand(sqlstr, AppsCon) 
    sqlcmd.Parameters.AddWithValue("@grnno", grnno) 
    sqlcmd.Parameters.AddWithValue("@item_code", CType(X.Cells(0).Value, Integer)) //cast to proper type  

    sqlcmd.ExecuteNonQuery() 

Next 
+0

안녕 gzaxx, @ gsupplier, @ grnno와 같은 변수를 a로 선언해야합니다. Dim 문 또는 런타임 중에 만들어 질 것입니다. 내가 매개 변수와 함께 작동하는 것을 알지 못합니다. 따라서이 바보 같은 의심이들 것입니다. –

+0

'@ parameter_name'은 SQL 명령에 대한 마크 업입니다 (나중에 어떤 값을 어디에 넣고 어떤 형식으로 넣을 지 알고 있어야합니다). 명령 문자열 안에 넣는다. – gzaxx

0

단일 인용 부호 ''

예를 들어 (및 게시물 당에만 x.cell를 참조하는 (6)) " & X.Cells(6).Value & "

sqlstr = "INSERT INTO POS_GRN_DTL(GRN_KEY,ITEM_CODE,DESCRIPTION,TYPE,UOM,BATCH_NO,EXPIRY_DATE,RECEIVED_QTY,UNIT_PRICE,AMOUNT,DISCOUNT,NET_AMOUNT) VALUES('" & grnno & "','" & X.Cells(0).Value & "','" & X.Cells(1).Value & "','" & X.Cells(2).Value & "','" & X.Cells(3).Value & "','" & X.Cells(4).Value & "','" & X.Cells(5).Value & "', " & X.Cells(6).Value & ",'" & X.Cells(7).Value & "' ,'" & X.Cells(8).Value & "','" & X.Cells(9).Value & "','" & X.Cells(10).Value & "')" 

를 사용 또한 cast it해야 할 수도가 (가정 제거 항상)

" & CInt(X.Cells(6).Value) &"

을 숫자 값을 가질거야 난 당신이 SQL을 알고 가정합니다 내가 njection 및 데이터베이스를 업데이트하는이 방법은 일반적으로 지금 '나쁜 관행'을 '구식'하고 당신에게 should use parameters instead을 ... 널 가능성이 있으므로

업데이트 (당신이에 원하는 이, 당신은 내가 VB 사람이 아니에요으로)

dim cellSix as integer 
if IsNothing(X.Cells(6).Value then 
    cellSix = 0 
else 
    cellSix = CInt(X.Cells(6).Value) 
end if 

sqlstr = "INSERT INTO POS_GRN_DTL(GRN_KEY,ITEM_CODE,DESCRIPTION,TYPE,UOM,BATCH_NO,EXPIRY_DATE,RECEIVED_QTY,UNIT_PRICE,AMOUNT,DISCOUNT,NET_AMOUNT) VALUES('" & grnno & "','" & X.Cells(0).Value & "','" & X.Cells(1).Value & "','" & X.Cells(2).Value & "','" & X.Cells(3).Value & "','" & X.Cells(4).Value & "','" & X.Cells(5).Value & "', " & cellSix & ",'" & X.Cells(7).Value & "' ,'" & X.Cells(8).Value & "','" & X.Cells(9).Value & "','" & X.Cells(10).Value & "')" 

을 테스트하지 뭔가를 (사용할 수 또는 코드가 짧은 당신이 IIF

cellSix = IIf(isnothing(CInt(X.Cells(6).Value)), 0, CInt(X.Cells(6).Value)) 
를 사용할 수 유지)의 경우 0 일
+0

hi dave, 작은 따옴표를 제거해도 작동하지만 그 셀에 값이있는 경우에만 값이 있습니다. ''와 같은 오류가 발생하므로 해당 셀에 값이없는 경우에도 cuint를 사용해야합니다. –

+0

@vimalvasudevan 가치가 없다면 어떻게 될 것으로 예상됩니까? 무엇을 데이터베이스에 삽입해야합니까? – Dave

+0

, 값이 없으면 0과 같은 기본값을 삽입해야합니다. –