2011-06-06 37 views
0

我有一個CLR存儲過程,我想從C#異步執行。異步函數不執行sql CLR存儲過程

代碼如下:

private delegate void GeneratePayrollDelegate(string payProcessID); 

public void GeneratePayroll(string payProcessID) 
    { 
     GeneratePayrollDelegate del = new GeneratePayrollDelegate(GeneratePayrollAsync); 
     del.BeginInvoke(payProcessID, null, null); 
    } 

public void GeneratePayrollAsync(string payProcessID) 
    { 
     try 
     { 
      using (SqlConnection connection = new SqlConnection(DLConnectionStringHelper.GetConnectionString() + "; async=true;")) 
      { 
       using (SqlCommand cmd = new SqlCommand("proc_GeneratePayroll", connection)) 
       {       
        cmd.CommandTimeout = 3600; 
        cmd.CommandType = CommandType.StoredProcedure; 

        connection.Open(); 
        cmd.ExecuteNonQuery(); 
        connection.Close(); 
       } 
      } 
     } 
     catch (Exception ex) { _Exceptions.ManageExceptions(ex); } 
    } 

此存儲過程成功執行,如果它從SQL運行。

當它從上面的代碼執行時,當嘗試通過作爲參數發送的ID檢索行時,CLR存儲過程中沒有任何行。

需要幫助!

+3

並且錯誤是? – Jodrell 2011-06-06 09:24:26

+0

在CLR過程中,其中一個函數正在採取一些與此payprocessID相關的必需信息,它不返回任何行。 當我嘗試檢索位置0的行時,它會給出範圍異常 – Boomer 2011-06-06 09:28:16

+0

因此,它仍然可以成功執行,但是會得到意想不到的結果?編輯問題會更好。 – Jodrell 2011-06-06 09:34:55

回答

1

您正在致電cmd.ExecuteNonQuery();您應該撥打BeginExecuteReader代替以獲得結果,因爲示例代碼可以是這樣的

private void Asynchronous(IAsyncResult asyncResult) 
{ 
       System.Data.SqlClient.SqlDataReader reader; 
       try 
       { 
        System.Data.SqlClient.SqlCommand command = 
         asyncResult.AsyncState as System.Data.SqlClient.SqlCommand; 
        reader = command.EndExecuteReader(asyncResult); 
        while (reader.Read()) 
        { 

        } 
        reader.Close(); 
       } 
       catch 
       { 
       } 
} 

public void GeneratePayrollAsync(string payProcessID) 
{ 
    try 
    { 
     using (SqlConnection connection = new SqlConnection("ConnectionString")) 
     { 
      using (SqlCommand command = new SqlCommand("proc_GeneratePayroll", connection)) 
      { 
       command.CommandTimeout = 3600; 
       command.CommandType = CommandType.StoredProcedure; 
       //Set Your stored procedure parameter here 
       connection.Open(); 
       command.BeginExecuteReader(Asynchronous, command, CommandBehavior.Default); 

      } 
     } 
    } 
    catch (Exception ex) { } 
}