У меня есть приложение, которое конвертирует одну базу данных в другую, и одна из функций, которые я использую, это insert_Note ниже. В этом приложении есть несколько потоков, которые вставляют разные данные в новую базу данных. Приведенный ниже код работает для ряда вставок в диапазоне от 24 до 120, но затем завершается с ошибкой:
В операторе INSERT меньше столбцов, чем значений, указанных в предложении VALUES. Количество значений в предложении VALUES должно соответствовать количеству столбцов, указанному в операторе INSERT.
Если вы посмотрите на код, то увидите, что это не может быть проблемой, поскольку код работает для некоторых вставок, но не для всех. Что еще может вызвать эту ошибку в многопоточном приложении? Любые идеи будут приветствоваться, так как я потратил три дня на это и не получил никуда!
*Public sub insert_Note
Dim sql As String
Dim cmd As New SqlClient.SqlCommand
sql = "INSERT INTO notes ("
sql &= "RefID,"
sql &= "TypeID,"
sql &= "DateEntered,"
sql &= "Username,"
sql &= "Subject,"
sql &= "Body,"
sql &= "DoNotSendToWeb,"
sql &= "Deleted,"
sql &= "SubTypeID"
sql &= ") VALUES ("
sql &= "@RefID,"
sql &= "@TypeID,"
sql &= "@DateEntered,"
sql &= "@Username,"
sql &= "@Subject,"
sql &= "@Body,"
sql &= "@DoNotSendToWeb,"
sql &= "@Deleted,"
sql &= "@SubTypeID"
sql &= ")"
cmd.CommandText = sql
cmd.Parameters.AddWithValue("@RefID", 0)
cmd.Parameters.AddWithValue("@TypeID", 0)
cmd.Parameters.AddWithValue("@DateEntered", DBNull.Value)
cmd.Parameters.AddWithValue("@Username", DBNull.Value)
cmd.Parameters.AddWithValue("@Subject", DBNull.Value)
cmd.Parameters.AddWithValue("@Body", DBNull.Value)
cmd.Parameters.AddWithValue("@DoNotSendToWeb", DBNull.Value)
cmd.Parameters.AddWithValue("@Deleted", DBNull.Value)
cmd.Parameters.AddWithValue("@SubTypeID", DBNull.Value)
Using DotNetdatabase As New DBAccessLayer.DBAccessLayer(VBDotNetConn)
Try
Dim ds As DataSet
ds = DotNetdatabase.OpenDataSetWithoutErrorMsg(cmd)
Return (0)
Catch ex As Exception
AddToErrorLog(ex.Message, "Adding Note")
Throw ex
End Try
End Using
End Function
public class DBAccessLayer
private myConnection as SqlConnection
Public Sub New(ByVal strConnectionString As String)
myConnection = New SqlConnection(strConnectionString)
End Sub
Public Function OpenDataSetWithoutErrorMsg(ByVal myCommand As SqlCommand) As DataSet
Dim MyDataSet As New DataSet
Dim myDataAdapter As SqlDataAdapter
Try
Dim blnInitiallyOpen As Boolean = True
myConnection.Open()
Do Until myConnection.State = ConnectionState.Open
Threading.Thread.Sleep(100)
Loop
myCommand.CommandTimeout = 0
myCommand.Connection = myConnection
myDataAdapter = New SqlDataAdapter(myCommand)
myDataAdapter.Fill(MyDataSet)
myConnection.Close()
Return MyDataSet
Catch e As Exception
If myConnection.State = ConnectionState.Open Then
myConnection.Close()
End If
Throw e
Return Nothing
End Try
End Function
end class*
Спасибо
Hugh
Если знания могут создавать проблемы, то не по незнанию мы будем их решать.
Исаак Азимов