我有一个将一个数据库转换为另一个数据库的应用程序,我使用的其中一个函数是下面的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*
谢谢,
休 如果知识可能会产生问题,那么我们无法解决这些问题。
Isaac Asimov
答案 0 :(得分:3)
休:
我如何解决这个问题:
1)在catch中,特别是捕获插入中较少列的错误。然后记录命令文本和参数值/或手动调查。如果您没有在那里看到问题,请将该日志记录的结果发布到您的问题中。如果你确实看到了问题,那么选择我的答案:) - >我想知道,如果像@Body这样的参数是空字符串而不是null,该怎么办? insert语句会是什么样的?
2)我是db程序员。此代码属于存储过程。更容易调试。
3)您是否能够将事件缩小到一组数据?
4)使用Yellowfog的逻辑 - 是否有一个触发器,或者同样重要的是 - 其他一些代码在连接中被触发 - 按顺序发生,你可能会产生错误,但一旦冒泡到任何地方你看到它使它看起来像这个代码?我知道,当我确定一段代码不能引起特殊异常时,我是对的,我只是在查看错误的代码。
5)使用sql server profiler查看实际执行的语句。我要添加的事件是:TSQL-SQL:StmtCompleted& SQL:StmtStarting,错误和警告:所有这些。最简单的方法是在流量尽可能小的盒子上进行此操作。这个page可能会帮助您入门。