2015-10-13 37 views
0

我有一个存储过程,在手动执行时工作正常,但当它在代码上调用时,由于超时而返回空引用异常。下面的代码:在存储过程调用中获取超时

private DataTable GetProcedure(DateTime dtStart, DateTime dtEnd) { 
     DataTable dt = new DataTable(); 
     SqlDataReader reader; 

     string cs = //Connection String, it works everywhere, no need to put the code. 
     SqlConnection sqlConnection = new SqlConnection(cs); 
     string cmdText = "ProcedureName"; 
     SqlCommand cmd = new SqlCommand(cmdText, sqlConnection); 
     cmd.CommandType = CommandType.StoredProcedure; 

     SqlParameter pFechaInicio = new SqlParameter("@dtStart", dtStart); 
     SqlParameter pFechaFin = new SqlParameter("@dtEnd", dtEnd); 
     cmd.Parameters.Add(pFechaInicio); 
     cmd.Parameters.Add(pFechaFin); 

     sqlConnection.Open(); 

     reader = cmd.ExecuteReader(); //NULL REFERENCE EXCEPTION HERE 

     dt.Load(reader); 

     sqlConnection.Close(); 

     return dt; 
} 

我做了一个手工调用存储过程具有完全相同的参数,它工作得很好(存储过程返回没有空值任何一个3行/ 2列结果

。更有甚者,这个错误开始发生1个月前,但该程序已经运行了6个月flawlesly

编辑:下面是对SP的一些信息:

SP标题:

ALTER PROCEDURE [dbo].[SPName] 
     @dtStart datetime, @dtEnd datetime 
AS 
BEGIN 
    SET NOCOUNT ON; 

select column1 as Name1, column2 as Name2 
/* doesn't matter */ 

END 

当我手动执行SP我得到的具体结果是:

column1  column2 
1.0000000 105.426890 
2.0000000 96.316330 
3.0000000 82.849690 

这里是整个错误代码:

en System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 
    en System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 
    en System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) 
    en System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) 
    en System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() 
    en System.Data.SqlClient.SqlDataReader.get_MetaData() 
    en System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) 
    en System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds, Boolean describeParameterEncryptionRequest) 
    en System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) 
    en System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) 
    en System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) 
    en System.Data.SqlClient.SqlCommand.ExecuteReader() 
    en BACK.OFERTAS.COBERTURAS.PRECIOS._01._00.StartJob.GetProcedure(DateTime dtStart, DateTime dtEnd) en C:\Users\Dell\Documents\BACK.OFERTAS.COBERTURAS.PRECIOS.01.00\StartJob.cs:línea 278 
    en BACK.OFERTAS.COBERTURAS.PRECIOS._01._00.StartJob.Start() en C:\Users\Dell\Documents\BACK.OFERTAS.COBERTURAS.PRECIOS.01.00\StartJob.cs:línea 176 

重读整个堆栈跟踪它看起来像超时?这怎么可能,SP在少于1秒内执行。

+0

你能展示你的存储过程是怎样的吗? –

+0

它没有任何意义......存储过程返回一个带有2个十进制列的select。在这种特定情况下,它返回3行,并显示正确的值。它也返回单个DataTable,只有一个选择。 –

+2

请显示例外的全文以及堆栈跟踪。 –

回答

0

我已经解决了它改变程序的TimeOut时间(默认为30秒)。

发生这种情况是因为直接在服务器上执行SP比在作业中执行SP不同。