2012-06-20 30 views
0

所以我想寫一個SQL Server觸發器,將調用一個ASP.Net DLL。SQL觸發器使用ASP.Net CLR

我已經得到了一切都在說話,但我完全難住,當觸發器觸發它不能看到「插入」表?!?!

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(); 
} 

回答

3

您打開的連接cn不與觸發器共享相同的上下文。嘗試使用context connection

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只有一行。不要在你自己的代碼中犯這個錯誤。

+0

這完全解決了!謝謝一噸達米恩! – Ryan