2012-01-20 56 views
0

不知何故,我無法找到在新記錄插入時如何正確傳遞數據,並將第一列值發送回WCF。一切正常,但我無法傳遞數據。我錯過了什麼?將CLR觸發器的值傳遞給WCF

CLR觸發調用WCF:

public partial class Triggers 
{ 

    public static EndpointAddress endpoint = new EndpointAddress(new Uri("http://localhost:8000/services/myservice")); 
    public static WSHttpBinding httpBinding = new WSHttpBinding(); 
    public static ServiceClient.ServiceReference1.ServiceContractClient myclient = new ServiceClient.ServiceReference1.ServiceContractClient(httpBinding, endpoint); 
    public delegate void MyDelagate(String crudType); 
    [SqlProcedure()] 
    public static void SendData(String crudType) 
    { 
     myclient.UpdateOccured();//i was trying to pass the crudType value here 

    } 

    [Microsoft.SqlServer.Server.SqlTrigger(Name = "WCFTrigger", Target = "tbCR", Event = "FOR INSERT")] 
    public static void Trigger1() 
    { 

     SqlCommand cmd; 
     SqlTriggerContext myContext = SqlContext.TriggerContext; 
     SqlPipe pipe = SqlContext.Pipe; 
     SqlDataReader reader; 

     if(myContext.TriggerAction== TriggerAction.Insert) 
     { 
      using (SqlConnection conn = new SqlConnection(@"context connection=true")) 
      { 
       conn.Open(); 
       cmd = new SqlCommand(@"SELECT * FROM tbCR", conn); 
       reader = cmd.ExecuteReader(); 
       reader.Read(); 

       //get the insert value's here 
       string Name; 
       Name = (string)reader[1]; 
       reader.Dispose(); 


       switch (myContext.TriggerAction) 
       { 
        case TriggerAction.Update: 

         SendData(Name); 

         break; 

        case TriggerAction.Insert: 

         SendData(Name); 
        break; 
       } 
      } 
     } 

    } 
} 

我的服務合同:

namespace SampleService 
{ 
    class MyService : IServiceContract 
    { 
     public void UpdateOccured() 
     { 
      Console.WriteLine("Update Occured"); 
     } 

     public void InsertOccured(string Name) 
     { 
      Console.WriteLine("Insert Occured",Name); 
     } 

    } 
} 

接口:

namespace SampleService 
{ 
    [ServiceContract] 
    interface IServiceContract 
    { 
     [OperationContract] 
     void UpdateOccured(); 
     [OperationContract] 
     void InsertOccured(string Name); 
    } 
} 
+0

契約接口顯式指定'UpdateOccured'不帶任何參數。 – arootbeer

+0

Ooops對不起,這是假設爲InsertOccured的arootbeet。 – Usher

+0

@ arootbeer,改爲myclient.InsertOccured(curdType);但它引發了一種說法,即在當前上下文中不存在「curdType」。 – Usher

回答

2

你應該從實際的表即

插insertead來選擇
cmd = new SqlCommand(@"SELECT * FROM INSERTED", conn); 

另外,您應該明確指定您需要的列而不是使用*。

INSERTED和DELETED以及SQL Server創建的內存駐留表表。

More details

受影響的行刪除的表存儲副本時DELETE和UPDATE 語句。在執行DELETE或UPDATE 語句期間,行將從觸發器表中刪除並傳輸到 刪除的表。已刪除的表格和觸發器表格通常爲 沒有共同的行。

插入的表在INSERT 和UPDATE語句中存儲受影響的行的副本。在插入或更新事務期間,新插入的表和觸發器表中都會添加新的 行。插入表中的 行是觸發器 表中新行的副本。

更新事務與刪除操作類似,後跟 插入操作;先將舊行復制到已刪除的表中,然後將新行復制到觸發器表和 插入的表中。

+0

謝謝阿米特,我看到人們建議使用「選擇*從插入」的選項,但上午不太清楚它,所以我用查詢我的實際table.please糾正我,如果使用插入,仍然讀者找到適當的列? – Usher

+0

是的,像DML觸發器一樣,CLR觸發器也可以訪問這些表閱讀我發佈在更新的評論中的鏈接。 –

+0

除此之外,我的代碼中缺少什麼,它不讓我傳遞值@ myclient.UpdateOccured();我試圖做myclient。UpdateOccured(crudType); – Usher