0

これは、挿入および更新ステートメントの私のコードです。

For i = 0 To lvFabric1.Items.Count - 1

            strQ4 = ""
            strQ4 = strQ4 & "INSERT into js_det(LINE_NO, FABRIC1, FABRIC2, `DESC`) SELECT LPAD('" & i + 1 & "',2, '0'), '" & lvFabric1.Items(i).Text & "','sdf', `DESC` from rm_inv where ITEM_CODE = '" & lvFabric1.Items(i).Text & "'"

            strQ5 = ""
            strQ5 = strQ5 & "UPDATE js_det set TRAN_NO = (SELECT JS_TRAN FROM counter) where Fabric1 = '" & lvFabric1.Items(i).Text & "'"

            cmd.CommandText = strQ4
            cmd.ExecuteNonQuery()

            cmd.CommandText = strQ5
            cmd.ExecuteNonQuery()

        Next

ここでの問題は、5 回以上ループすると遅くなり、3 秒以上かかることです。このコードを高速化するにはどうすればよいですか? または別の方法がありますか?

助けてくれてありがとう。

4

1 に答える 1

3

高速化するには、次のようにすべてを一度にコミットします。

Dim sqls As New List(Of String)
For i = 0 To lvFabric1.Items.Count - 1
    sqls.Add("INSERT into js_det(LINE_NO, FABRIC1, FABRIC2, `DESC`) SELECT LPAD('" & i + 1 & "',2, '0'), '" & lvFabric1.Items(i).Text & "','sdf', `DESC` from rm_inv where ITEM_CODE = '" & lvFabric1.Items(i).Text & "'")

    sqls.Add("UPDATE js_det set TRAN_NO = (SELECT JS_TRAN FROM counter) where Fabric1 = '" & lvFabric1.Items(i).Text & "'")
Next
If sqls.Any() Then
    cmd.CommandText = sqls.Aggregate(Function(m, n) m & ";" & n)
    cmd.ExecuteNonQuery()
End If

ただし、.net で SQL クエリを実行する方法はお勧めできません。

SQL インジェクションまたは SQL 構文エラーを回避するには、SQL パラメータを使用する必要があります。

EDIT:SQLパラメータを使用 -

    Using con As New SqlConnection("My connection string..."),
        cmd As New SqlCommand(sql, con)
        cmd.CommandText = "UPDATE js_det set TRAN_NO = (SELECT JS_TRAN FROM counter) where Fabric1 = @fabric"
        Dim fabricParam = cmd.Parameters.Add("@fabric", SqlDbType.VarChar)

        con.Open()
        For i = 0 To lvFabric1.Items.Count - 1
            fabricParam.Value = lvFabric1.Items(i).Text
            cmd.ExecuteNonQuery()
        Next
        con.Close()

    End Using
于 2013-08-28T08:36:10.770 に答える