0

そこで、ASP.Net DLL を呼び出す SQL Server トリガーを作成しようとしています。

私はすべてを話しましたが、トリガーが起動したときに「挿入された」テーブルが見えないことに完全に困惑しています?!?!

Msg 6522, Level 16, State 1, Procedure etrition_train_trigger_clr35, Line 1
A .NET Framework error occurred during execution of user-defined routine or aggregate "etrition_train_trigger_clr35": 
System.Data.SqlClient.SqlException: Invalid object name 'inserted'.
System.Data.SqlClient.SqlException: 
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   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)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader()
   at CLRTrigger.CLRTrigger.SQLTriggerCall()

これが私の.Netコードです。私が言ったように、トリガー条件が満たされたときに起動しますが、何らかの理由で挿入されたテーブルを見ることができません。

public static void SQLTriggerCall()
{
    SqlTriggerContext triggContext = SqlContext.TriggerContext;
    SqlConnection cn = new SqlConnection("Server=vm260101;Database=RT_Training;uid=XXXXXX;pwd=XXXXXXX;Enlist=False;");
    cn.Open();
    SqlCommand sqlComm = cn.CreateCommand();
    SqlPipe sqlP = SqlContext.Pipe;
    SqlDataReader dr;
    sqlComm.CommandText = "SELECT stu_fee_gu, stu_fee_pay_trans_gu, amount from inserted";
    dr = sqlComm.ExecuteReader();
    String stu_fee_gu = "";
    String stu_fee_pay_trans_gu = "";
    float amount = 0;
    while (dr.Read())
    {
        stu_fee_gu = Convert.ToString(dr["stu_fee_gu"]);
        stu_fee_pay_trans_gu = Convert.ToString(dr["stu_fee_pay_trans_gu"]);
        amount = (float)Convert.ToDecimal(dr["amount"]);
    }
    cn.Close();
}
4

1 に答える 1

3

開いた接続cnは、トリガーと同じコンテキストを共有していません。コンテキスト接続を使用してみてください

SqlTriggerContextトリガー内での使用法については、以下の例を参照してください。

// Retrieve the connection that the trigger is using.
  using (SqlConnection connection
     = new SqlConnection(@"context connection=true"))
  {
     connection.Open();

     // Get the inserted row.
     command = new SqlCommand(@"SELECT * FROM INSERTED;",
                              connection);

     // Get the user name and real name of the inserted user.
     reader = command.ExecuteReader();
     reader.Read();
     //More...

もちろん、この例の残りの部分は非常に貧弱insertedです。自分のコードでその間違いをしないでください。

于 2012-06-20T14:18:09.630 に答える