调用SqlCommand.Prepare()后SqlCommand.ExecuteNonQuery()中的NullReferenceException

时间:2012-05-15 18:05:29

标签: c# .net prepared-statement nullreferenceexception sqlcommand

我遇到了抛出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)

任何帮助将不胜感激。感谢。

2 个答案:

答案 0 :(得分:0)

感谢您的评论。我最终将其更改为ExecuteReader()调用。从我的测试来看,如果您还预先准备好语句,似乎不能将SELECT语句与ExecuteNonQuery()调用结合使用。

第一次调用成功而第二次调用失败的事实告诉我这可能是.NET框架中的一个错误。

答案 1 :(得分:0)

.Net没有错误。 它导致因为ExecuteNonQuery不是线程安全的。 使其解决问题的线程安全