0

我遇到了引發NullReferenceException的問題。下面是代碼:調用SqlCommand.Prepare()後SqlCommand.ExecuteNonQuery()中的NullReferenceException()

using (SqlConnection connection = new SqlConnection(@"server=localhost\SQL2005;database=UintaTest;Integrated Security=SSPI;Connect Timeout=240")) 
using (SqlCommand command = new SqlCommand(@"SELECT * FROM tblCaseActual WHERE CaseID = @Param", connection)) 
{ 
    connection.Open(); 
    connection.StatisticsEnabled = true; 
    SqlParameter commandParameter = new SqlParameter 
    { 
     ParameterName = "Param", 
     SqlDbType = SqlDbType.VarChar, 
     Size = 12, 
     Value = "1-19" 
    }; 
    command.Parameters.Add(commandParameter); 

    command.Prepare(); 
    //this does not throw an exception 
    command.ExecuteNonQuery(); 

    //This throws an exception 
    command.ExecuteNonQuery(); 
} 

當第二「的ExecuteNonQuery」函數被調用拋出異常。第一次通話正常。

我看過這個msdn link但沒有幫助。這裏的代碼片段與我想要做的非常相似。我也搜索了其他有類似問題的人,但我沒有找到任何東西。

這不會發生在所有的SQL語句中,但我已經在幾個不同的數據庫和幾個不同的表格上轉載了它。

這裏是堆棧跟蹤,以及:

at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) 
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) 
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite) 
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) 
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) 
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 
at SqlCommandPrepareTest.Program.Main(String[] args) in C:\Users\jadams\Documents\Visual Studio 2010\Projects\SqlCommandPrepareTest\SqlCommandPrepareTest\Program.cs:line 33 
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 

任何幫助,將不勝感激。謝謝。

+1

你爲什麼要在SELECT命令上調用ExecuteNonQuery? –

+0

爲什麼調用它兩次? – madatanic

+0

我正在對數據庫中的視圖進行一些自動性能測試。我發佈的代碼是我正在做的更簡單的版本,仍然重現了問題。我不需要查詢的結果,所以我使用ExecuteNonQuery。也許這是我的問題,因爲如果我使用ExecuteReader,那麼它工作正常。 –

回答

0

感謝您的意見。我最終將它改爲ExecuteReader()調用。從我的測試中看來,如果您也事先準備好語句,則不能將SELECT語句與ExecuteNonQuery()調用結合使用。

第一次調用成功而第二次調用失敗的事實告訴我這可能是.NET框架中的一個錯誤。

0

.Net沒有錯誤。它由於ExecuteNonQuery不是線程安全的而導致它的原因。 使線程安全解決問題

相關問題