从列表中向SQL添加10000多行时VB.Net冻结

时间:2017-04-18 04:37:14

标签: sql json vb.net web-services ado.net

我正在运行RESTful API服务,该服务从服务器获取数据作为JSON字符串。正在选择大约20000行。

Dim js As New JavaScriptSerializer()
Dim prodlist As List(Of Product) = js.Deserialize(Of List(Of Product))(JSONreturn)

列表产品列表中填充了20000行。检查计数并手动验证列表。

我需要在客户端计算机中插入这些行。但是,在插入行时,它会在插入大约600-700行后冻结或停止。下面是我用于插入的代码。

For Each item As Product In prodlist
                    Dim SPName As String = "someSPname"
                    With connectionstring

                        .Clear()
                        .Parameters("@itemnumber", SqlDbType.VarChar, ParameterDirection.Input, , item.itemnumber
                        .Parameters("@itemtype", SqlDbType.VarChar, ParameterDirection.Input, , item.itemtype)
                        .Parameters("@DESCRIPTION", SqlDbType.VarChar, ParameterDirection.Input, , item.DESCRIPTION)
                        .Execute(SPName)                                                        

                    End With
                Next

不会抛出任何错误。它每次插入大约600-700行后就会冻结。

批量插入不是一种选择。我该如何解决这个问题?

更新:添加连接类。很确定这没有问题:

    Public Class ConnectionClass


    Public ReadOnly Property ConnectionString() As String
        Get
            Return GetConfiguration()
        End Get
    End Property

    Public Sub Parameters(ByVal param_name As String, ByVal type As SqlDbType, ByVal direction As ParameterDirection, Optional param_size As Int32 = Nothing, Optional param_value As Object = Nothing)
            Dim sqlParam As SqlParameter = Nothing
            Try

                sqlParam = New SqlParameter(param_name, type)
                sqlParam.Size = param_size
                sqlParam.Direction = direction
                sqlParam.Value = param_value
                Lstparam.Add(sqlParam)
            Finally
                If sqlParam IsNot Nothing Then
                    sqlParam = Nothing
                End If
            End Try
        End Sub


    Public Sub Execute(ByVal strSpName As String, Optional ByVal Type As CommandType = CommandType.StoredProcedure)

            Try
                sqlcmd = New SqlCommand()
                sqlcmd.Connection = connection
                ''Setting the timeout to 50 mins as setup in the previous application
                sqlcmd.CommandTimeout = 3000
                If transaction IsNot Nothing Then
                    sqlcmd.Transaction = transaction
                End If
                sqlcmd.CommandType = Type
                sqlcmd.CommandText = strSpName

                For Each argument As SqlParameter In Lstparam 
                    sqlcmd.Parameters.Add(argument)
                Next
                For introw As Integer = 0 To sqlcmd.Parameters.Count - 1
                    If sqlcmd.Parameters.Item(introw).ParameterName.Contains("Parameter") Then
                        sqlcmd.Parameters.Item(introw).ParameterName = String.Empty


  End If
            Next
            sqlcmd.ExecuteNonQuery()
        Catch ex As Exception
            Throw
        End Try
    End Sub



Public Sub Clear()
        ClearParameters()
        Lstparam.Clear()
    End Sub


Public Sub ClearParameters()
        If Not sqlcmd Is Nothing Then
            Do Until sqlcmd.Parameters.Count = 0
                sqlcmd.Parameters.Clear()
            Loop
        End If
    End Sub







    Public Function GetConfiguration() As String
        Dim sbConnectionString As New StringBuilder
        With sbConnectionString
            .Append("Data Source=")
            .Append(ServerName)
            .Append(";")
            .Append("Initial Catalog =")
            .Append(DatabaseName)
            .Append(";")
            .Append("User ID =")
            .Append(UserName)
            .Append(";")
            .Append("Password =")
            .Append(UserPassword)
        End With
        Return sbConnectionString.ToString()
    End Function

    Public Function CreateClientConnection() As SqlConnection

        Dim connectionString As String

        Try
            connectionString = GetConfiguration()
            Dim substrings() As String = connectionString.ToUpper.Split(";")
            Dim substrings1() As String = connection.ConnectionString.ToUpper.Split(";")
            If Not (connection.State = ConnectionState.Open) Then

                connection.ConnectionString = connectionString
                connection.Open()
            ElseIf Not (Trim(substrings(0)) = Trim(substrings1(0))) Then


                If connection IsNot Nothing Then
                    connection.Dispose()
                End If
                connection.ConnectionString = connectionString
                connection.Open()
            End If
            Return connection
        Catch ex As Exception
            If connection IsNot Nothing Then
                connection.Dispose()
            End If
            Throw ex
        End Try

    End Function


End Class

0 个答案:

没有答案