2014-07-08 39 views
0

我用他對實體框架執行SQL query代碼:爲什麼我的SQL查詢不能通過實體框架工作?

using (var db = new VSServicesEntities()) 
      {     
       const string selectCmd = @"if exists (Select top 1 IsUserOn From ServiceMembers Where ServiceCode={0} and Number={1}) 
          Select isnull(IsUserOn,0) IsUserOn 
          From ServiceMembers Where ServiceCode={0} and Number={1} 
          else 
          Select Null IsUserOn"; 
       var data = db.ServiceMembers.SqlQuery(selectCmd, "A", 091242535970).ToList(); 
       if (data.Any()) 
       { 

        var serviceMember = data.First().IsUserOn; 
       if (serviceMember.ToString() == "") 
        label1.Text = ""; 
       else 
        label1.Text = (serviceMember.ToString() == "True" ? "On" : "Off"); 
       } 
    } 

,但它給了我一個例外:

必須聲明標量變量「@ServiceCode」。

但我給的價值ServiceCode= A,有什麼問題?

編輯2:我編輯在上面我的查詢,但現在它給了我另一個異常:

數據讀取器與指定的「VSServicesModel.ServiceMember」不兼容。 「ServiceCode」類型的成員在數據讀取器中沒有對應的列,名稱相同

但是我的列名恰好是:ServiceCode !!問題是什麼??

+1

在字符串 – thepirat000

+0

中使用「{0}」而不是「@ServiceCode」和「{1}」而不是「@Number」嘗試查看文檔http://msdn.microsoft.com /en-us/library/gg679117%28v=vs.113%29.aspx – luke2012

回答

0

您還沒有正確地傳遞參數:

var data = db.ServiceMembers.SqlQuery(selectCmd, 
    new SqlParameter("@ServiceCode", "A"), 
    new SqlParameter("@Number", 091242535970)).ToList(); 

編輯

的類型EF將嘗試分配給dataServiceMembers的元件的(假設ServiceMember)的類型。您返回的唯一字段是IsON,它與您引用的屬性IsUserOn不匹配。嘗試改爲:

Select isnull(IsUserOn,0) AS IsUserON 
... 
Select Null AS IsUserON 

請注意,其他屬性將不會填充,除非您從具有匹配名稱的查詢中返回它們。

編輯你已經改變了你的sql查詢 - 綁定與[email protected] and [email protected]正常工作。猜測,Reader抱怨的原因是因爲您只返回一列(IsUserON),並試圖將其綁定到您的完整ServiceMember類。或者返回所有列(特別是主鍵,大概爲ServiceCode),或者也可以使用屬性IsUserON創建一個新類,然後使用泛型重載db.SqlQuery<MyNewPoco>(cmd, ...)來綁定它。

+0

它給我這個錯誤:數據讀取器與指定的'VSServicesModel.ServiceMember'不兼容。類型爲'ServiceCode'的成員在數據閱讀器中沒有相應的列,名稱相同。但我的列在SQL Server的名稱是完全ServiceCode!什麼問題?? :( – pejman

+0

我照你說的去做,但它給了我這個例外 – pejman

相關問題