2014-05-14 60 views
1

我是新LightSwitch中,我要完成以下任務:的LightSwitch執行選擇存儲過程來顯示數據

在我的分貝

我有一個存儲過程,顯示(一個選擇SP)的一些數據,怎麼能我從lightswitch中調用這個sp來顯示從sp中檢索的數據?

在此先感謝。

+0

入住這http://www.rssbus.com/kb/articles/ado-lightswitchria.rst – NullReferenceException

+0

@NullReferenceException感謝,截至目前即時通訊試試這個,它似乎真的提示 –

+0

其實,[這個MSDN文章](http://msdn.microsoft.com/en-us/library/vstudio/jj635144.aspx)是一個小更接近源,並且不涉及對第三方庫的引用。 – mdisibio

回答

1

這似乎是一個合理的任務,但Lightswitch並不容易。 只是爲了幫助你走好,這裏有一些提示:

  1. 首先,這變得更加容易,當你寫你自己的RIA服務或OData的源和你假設在你的實體完全控制。
  2. 當使用Lightswitch開箱即用時,會有一種命令模式'hack'來實現這一點,並在論壇中將其視爲已建立的模式。

簡要概述是:您可以在Lightswitch中定義一個自定義實體(或表)。它可以代表任何事物。 如果您的sp採用參數,通常建議爲參數創建列。 這個想法是,你有一個命令按鈕或被調用。在MyButton_Execute()覆蓋中,您將值插入表中(您可以撥打workspace.ApplicationData.MyCustomTable.AddNew(),設置值並致電Save_Changes())。 然後你攔截保存管道:MyCustomTable_Inserting(MyCustomTable entity)方法。在這裏,你編寫你的ado.net代碼來調用sp。然後,攻擊者可以撥打this.Details.DiscardChanges() ......您並不是真的添加了新行......您只是使用管道訪問了可以注入自定義ado代碼的點。

現在,顯示結果有點棘手。通常,想法是您的sp更新了一些基礎表,並且如果刷新了屏幕,則更新的數據將顯示在這些相關表的控件中。

要捕獲並顯示sp的實際結果,您必須進行實驗。也許你的屏幕將'MyCustomTable'顯示爲一個集合,並且如果它返回結果集,則將sp輸出捕獲到同一個實體。或者,如果它返回一行,也許你可以手動更新一些鏈接到文本框的屏幕參數....正如我所說的,Lightswitch並不容易,因爲它沒有跟蹤調用sp作爲表格實體已被修改。另外請注意,如果嘗試在ado調用完成後更新屏幕,則您將處於不同的線程中。可能你最好的選擇是在你的實際數據庫中有一張表,它接收sp的輸出,然後讓Lightswitch簡單地將結果表視爲其他表。您可能需要添加某種標識符,以便您可以過濾當前屏幕以僅顯示特定於該屏幕的sp調用結果。祝你好運。

+0

謝謝,我也在網站上和網站上找到了這個nullrefrenceexception/\ given,但是感謝提示(做命令,因爲我不能upvote) –

0

我已經找到一種方法來解決這個問題,或者至少一些網站,告訴你如何:

link1 link2

摘要:

你有你的工作通過一個RIA WCF庫繞過它(看上面的帖子),然後在lightswitch應用程序中添加這個「class」作爲參考。比讓一個對象獲得你的sp所給出的數據。

我是如何解決這個

我所做的,我做我的選擇 SP爲插入 SP和使用該SP將數據插入到一個空表。什麼,你需要做的就是創建一個不同的表爲您的SP本身去 這樣做,你可以將此代碼添加到您的數據源後:

partial void StoredProcedureDefinitions_Inserting(StoredProcedureDefinition entity) 
    { 
     using (SqlConnection connection = new SqlConnection()) 
     { 
      string connectionStringName = this.DataWorkspace.dbsMSccData.Details.Name; 

      connection.ConnectionString = 
      ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString; 

      string procedure = entity.Procedure; 
      using (SqlCommand command = new SqlCommand(procedure, connection)) 
      { 
       command.CommandType = CommandType.StoredProcedure; 

       //foreach (var item in entity.StoredProcedureParameters) 
       //{ 
       // command.Parameters.Add(
       //  new SqlParameter(item.ParameterName, item.ParameterValue)); 
       //} 

       connection.Open(); 
       command.ExecuteNonQuery(); 
      } 
     } 
     this.Details.DiscardChanges(); 
    } 

與此代碼添加到您的屏幕:

partial void Overzicht_project_telling_Created() 
    { 
     DataWorkspace dataWorkspace = new DataWorkspace(); 
     var operation = dataWorkspace.ApplicationData.StoredProcedureDefinitions.AddNew(); 

     //operation.Database = "dbMSccData"; 
     operation.Procedure = "dbo.Overzicht_Project_telling_s001"; 


     dataWorkspace.ApplicationData.SaveChanges(); 

     this.Refresh(); 
    } 

應該做的伎倆

我希望這是有用的。 -corards Corwin

+0

糾正我,如果我錯了,但這是我從你的知識中獲得的。 –

0

我發現了另一種方法來解決這個問題。我目前的解決方案大量使用SP層。所以爲了能夠獲得傳遞給LS的複雜SP的結果,我只是讓TSQL表函數運行SP。然後用簡單的select *從該函數添加SQL View。 LS允許導入視圖。工作得很好。

要強制LS將字段視爲主鍵,您可以使用ISNULL([field], - 1)。

要強制LS爲不將作爲PK使用NULLIF一個字段([場], '')