首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

VB.NET DataGridView 批次寫入資料庫:SQL 命令必須在迴圈內建構/參數化

     編輯:程式設計綜合問答

錯誤代碼


Dim a1 As String = DataGridView1.Rows(i).Cells(0).Value.ToString ' i 未定義!
Dim a2 As String = DataGridView1.Rows(i).Cells(1).Value.ToString
mycom.CommandText = "INSERT ... VALUES('" & a1 & "','" & a2 & "')" ' 在迴圈外!
For i = 0 To DataGridView1.Rows.Count
    mycom.ExecuteNonQuery() ' 反覆執行同一條 SQL,只寫入第一行資料
Next

問題

  1. `i` 在宣告變數時未定義,編譯錯誤/執行時例外。
  2. `CommandText` 在 `For` 迴圈**外部**建構,導致每次執行都是**同一組參數值**(第一行)。
  3. 字串拼接 SQL → **SQL 注入風險**、特殊字元截斷。
  4. `ExecuteReader` + `ExecuteNonQuery` 混用邏輯錯誤。

修正:參數化 + 迴圈內建構


Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Using conn As New SqlConnection("Data Source=192.168.0.12;Initial Catalog=blue;uid=sa;pwd=123")
        conn.Open()
        Dim sql As String = "INSERT INTO knitAM (col1, col2) VALUES (@v1, @v2)"
        Using cmd As New SqlCommand(sql, conn)
            cmd.Parameters.Add("@v1", SqlDbType.NVarChar)
            cmd.Parameters.Add("@v2", SqlDbType.NVarChar)

            For Each row As DataGridViewRow In DataGridView1.Rows
                If row.IsNewRow Then Continue For ' 跳過新建行
                cmd.Parameters("@v1").Value = row.Cells(0).Value?.ToString()
                cmd.Parameters("@v2").Value = row.Cells(1).Value?.ToString()
                cmd.ExecuteNonQuery()
            Next
        End Using
    End Using
    MessageBox.Show("批次存入完成")
End Sub

關鍵點

  • **`CommandText` / 參數值在迴圈內更新** (或用 `cmd.Parameters["@v1"].Value = ...`)。
  • **參數化查詢** (`@v1`, `@v2`),防注入、自動處理引號/編碼。
  • `Using` 區塊自動釋放 `Connection`/`Command`。
  • 跳過 `IsNewRow` (DataGridView 底部空白行)。
  • 大量資料 (千行以上) 考慮 `SqlBulkCopy` / `Table-Valued Parameters` / 批次 `INSERT ... VALUES (...), (...)`。

總結

DataGridView 批次入庫:**參數化 SQL + 迴圈內更新參數值 + ExecuteNonQuery**。原代碼 SQL 在迴圈外、字串拼接、變數未定義,三重錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved