2012-06-20 2 views
0

Итак, я пытаюсь написать триггер SQL Server, который вызовет библиотеку ASP.Net.SQL Trigger using 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

Это полностью исправлено! спасибо тонну Damien! – Ryan