我有一些我继承的SqlAdapter代码。我必须承认,代码通常运行得很好,但有一种方法最近真的很奇怪。当我附加SQL Server Profiler时,它显示调用存储过程,但发送的所有参数都是NULL。我正要努力追踪这一点。
我传递给oSqlAdapter对象的数据集包含我要插入的所有正确数据。 oSqlAdapter.InsertCommand具有正确的存储过程名称和所有正确的参数。我已经检查了参数的顺序和类型以及参数和列名的拼写。我可以错过什么?
代码:
Dim rows as DataRow() = myDataSet.Tables(0).Select(Nothing, Nothing, _
DataViewRowState.Added)
... Create oSqlAdapter and connect the currentConnectionObject ...
With oSqlAdapter
.InsertCommand = New SqlCommand()
.InsertCommand.CommandText = "myStoredProc"
.InsertCommand.CommandType = CommandType.StoredProcedure
.InsertCommand.Connection = currentConnectionObject
AddParameter(.InsertCommand, "@Parm1", ParameterDirection.Input, "MyColumn1")
AddParameter(.InsertCommand, "@Parm2", ParameterDirection.Input, "MyColumn2")
AddParameter(.InsertCommand, "@Parm3", ParameterDirection.Input, "MyColumn3")
AddParameter(.InsertCommand, "@ResultCode", ParameterDirection.Output, "MyResult")
.Update(rows) '<--- Crashes here. When I connect Profiler, I see that
' the update did send the parameters, but the values
' are always NULL, never the values in the DataRows.
End With
oSqlAdapter = Nothing
AddParameter逻辑如下:
Public Sub AddParameter(cmd As SqlCommand, parmName As String, _
dir as ParameterDirectoni, colName as String)
Dim oParm As SqlParameter = New SqlParameter(parmName, SqlDbType.Int)
With oParm
.Direction = dir
.Value() = Nothing
.SourceColumn = colName
End With
cmd.Parameters.Add(oParm)
oParm = Nothing
End Sub
答案 0 :(得分:0)
在Public Sub AddParameter()中,您将值设置为空。
.Value()=没什么
答案 1 :(得分:0)
我发现了BUG! (这也是偷偷摸摸的)
显然,数据源通过同一表单上的另一个用户控件附加到Infragistics控件。它被数据绑定到同一个数据源。 infragistics控制重新使一切都无效。有人(早在我到这里之前)已经将项目直接写入infragistics控件(而不是数据源本身),所以当你调用.Update()方法时,控件会在实际更新通过之前截取命令。数据源中的数据会被破坏。
我感谢大家的建议,我希望这可以在不久的将来帮助其他人。
作为参考, IF 你没有在幕后破坏你的数据源的东西,上面的代码片段确实有效。