2013-12-15 4 views
0

Привет Я пытаюсь вставить данные в базу данных Navision из DataTable. Этот DataTable содержит около 5000 записей, если количество записей меньше, чем работает, но количество записей составляет около 5000. Я получаю эту ошибку.ODBC - не удалось выделить дескриптор среды

ERROR - unable to allocate an environment handle. 

Это код, я использую

Public Function InsertToHHTTransferLine(ByVal dtTransferLn As DataTable, ByVal hhtNumber As String) As Integer 
    Dim result As Integer 
    Dim cn As OdbcConnection 
    Dim dtTransferLine As DataTable 
    cn = New OdbcConnection(ConnStr) 
    Dim SqlStr As String = "" 
    Try 
    cn.Open() 
    dtTransferLine = dtTransferLn 
    Dim DocType As String 
    DocType = "Purchase" 
    Dim cmd As OdbcCommand 
    Dim hhtNo As String 
    hhtNo = hhtNumber 
    If dtTransferLine.Rows.Count > 0 Then 
    For i As Integer = 0 To dtTransferLine.Rows.Count - 1 
    If dtTransferLine.Rows(i)("DOC_TYPE").ToString() = "0" Then 
    DocType = "Purchase" 

    End If 
    If dtTransferLine.Rows(i)("DOC_TYPE").ToString() = "1" Then 
    DocType = "Transfer Receipt" 

    End If 
    If dtTransferLine.Rows(i)("DOC_TYPE").ToString() = "2" Then 
    DocType = "Transfer Shipment" 

    End If 
    If dtTransferLine.Rows(i)("DOC_TYPE").ToString() = "3" Then 
    DocType = "Stock Count" 

    End If 
    Try 
    SqlStr = "INSERT INTO ""HHT & Navision Line""(""Document Type"",""Document No_"",""HHT No_"",""Line No_"",""Item No_"",""Document Quantity"",""Scan Quantity"",""Unit Price"",""Posted"") VALUES('" & DocType & "','" & dtTransferLine.Rows(i)("DOC_NO").ToString() & "','" & hhtNo & "','" & dtTransferLine.Rows(i)("LINE_NO").ToString() & "','" & dtTransferLine.Rows(i)("ITEM_NO").ToString() & "'," & dtTransferLine.Rows(i)("DOC_QTY").ToString() & "," & dtTransferLine.Rows(i)("SCAN_QTY").ToString() & "," & dtTransferLine.Rows(i)("UNIT_PRICE").ToString() & ",0)" 
    cmd = New OdbcCommand(SqlStr, cn) 
    result = cmd.ExecuteNonQuery() 
    Catch ex As Exception 
    If (ex.Message.IndexOf("Illegal duplicate key") <> -1) Then 
    CreateLog(SqlStr, "User1", "Duplicate()", ex.Message) 
    Else 
    CreateLog(SqlStr, "User1", "Other()", ex.Message) 
    End If 
    'CreateLog(SqlStr, "User1", "Other()", ex.Message) 
    End Try 

    Next 
    End If 
    Catch ex As Exception 

    CreateLog(SqlStr, "User1", "InsertToHHTTransferLine()", ex.Message) 
    result = -1 
    Finally 
    cn.Close() 
    cn.Dispose() 
    End Try 

    Return result 
End Function 

ответ

0

Может быть, что «ЦМД» переменные должны быть расположены перед созданием новых? По крайней мере, это единственное, что я вижу в коде, где вы потребляете ресурсы в цикле, в зависимости от количества записей.

В любом случае это должно быть легко идентифицировать с помощью отладчика, просто выяснить, что строка дает вам ошибку, и это приведет вас к ответу.

Смежные вопросы