2012-03-22 12 views
2

CLRトリガーがあり、これはストアドプロシージャをBeginInvokeで呼び出します。ストアドプロシージャでは、SqlCommanを呼び出そうとしますが、次のようになります。要求された操作には、SQL Server実行スレッドが必要です。現在のスレッドは、ユーザーコードまたは他の非SQL Serverエンジンコードによって開始されました。CLRストアドプロシージャにはSQL Server実行スレッドが必要

私はSPでこのことをしなければならず、待機のためにBeginInvokeでSPを呼び出さなければなりません。

コード:

[SqlProcedure()] 
public static void MySendData(String crudType, String sourceTable, ...) { 
    SqlCommand sqlDeleteComm; 

    String temp = String.Empty; 

    using(SqlConnection conn = new SqlConnection("context connection=true")) { 

     sqlDeleteComm = new SqlCommand("DELETE FROM #TEMP_TABLE"); 
     sqlDeleteComm.Connection = conn; 

     try { 
      conn.Open(); 
      sqlDeleteComm.ExecuteNonQuery(); 
      conn.Close(); 
     } catch(Exception ex) { 
      // --- here --- 
      // The requested operation requires a Sql Server execution thread. The current thread was started by user code or other non-Sql Server engine code. 
     } 
    } 
    ... 
} 

[Microsoft.SqlServer.Server.SqlTrigger(Name = "MyTrigger", Target = "MyTable", Event = "FOR UPDATE, INSERT, DELETE")] 
public static void MyTrigger() { 
    SqlTriggerContext myContext = SqlContext.TriggerContext; 
    MyDelagate d; 
    SqlCommand sqlComm; 
    SqlDataReader reader; 

    if(connection.State != ConnectionState.Open) { 
     connection.Open(); 
    } 

    switch(myContext.TriggerAction) { 
     case TriggerAction.Update: 
      sqlComm = new SqlCommand("SELECT X, Y FROM Inserted"); 
      sqlComm.Connection = connection; 

      reader = sqlComm.ExecuteReader(); 
      try { 
       reader.Read(); 
       d = new MyDelagate(MySendData); 
       d.BeginInvoke("Update", "MyTable", (Int32)reader[ 0 ], (Int32)reader[ 1 ], null, null); 
      } catch(Exception ex) { 
      } finally { 
       reader.Close(); 
      } 
      break; 
      ... 
    } 
} 

どうでしたI、SPでSQLクエリを呼び出すことすべてのために?

答えて

1

スレッドの外部でコンテキスト接続を使用することはできません。SQL ServerはCLRコードを実行します。これはサーバーの信頼性を保証するためです - SQL ServerはカスタムCLRホスティングを使用していますが、自分のスレッドをまったく回転させることはできませんでした。コンテキストSqlConnectionで標準のADO.NET SqlCommandを使用してMySendDataMyTriggerからT-SQLに呼び出すことはできますが、別のスレッドで実行する方法はありません。データベースレベルで非同期/並列化が本当に必要な場合は、SQL Server Brokerを調べてください。

関連する問題