2013-02-18 53 views
0

我有一些我繼承的SqlAdapter代碼。我不得不承認,代碼通常運行得非常好,但最近有一種方法真的很奇怪。當我連接SQL Server Profiler時,它顯示存儲過程被調用,但所有發送的參數都是NULL。我正在努力追查這件事。VB SqlAdapter批量更新:InsertCommand向存儲過程發送「NULL」

傳遞給oSqlAdapter對象的數據集具有我想要插入的所有正確數據。 oSqlAdapter.InsertCommand具有正確的存儲過程名稱和所有正確的參數。我tripple檢查參數的順序和類型以及參數和列名稱的拼寫。我可以錯過什麼?

代碼:

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

你檢查過行嗎?也許這是空的?你有沒有添加行到表? – 2013-02-18 20:58:30

+0

「我傳遞給oSqlAdapter對象的數據集具有我想要插入的所有正確數據。」是。 – Jerry 2013-02-18 21:04:03

+0

他們都是整數?也許你有一個類型問題,因爲proc將所有4個參數的類型指定爲一個整數。 – darin 2013-02-18 21:23:12

回答

0

我發現了這個錯誤! (這也是個鬼鬼祟祟的人)

顯然,數據源通過同一表單上的另一個用戶控件附加到Infragistics控件。這是數據綁定到這個相同的數據源。 infragistics控制重新取消一切。有人(早在我來到這裏之前)一直在直接將項目寫入infragistics控件(而不是數據源本身),所以當您調用.Update()方法時,控件會在實際更新完成之前攔截該命令並數據源中的數據會被破壞。

我很感謝大家的建議,我希望這能夠在不久的將來幫助別人。

僅供參考,如果你沒有在幕後破壞你的數據源的東西,上面的代碼片段確實有效。

0

在公用Sub AddParameter(),你設置的值不了了之。

.Value()= Nothing

+0

這是在批量更新期間從DataRow傳遞給它的實際值的佔位符。 – Jerry 2013-02-18 23:12:22