none
利用entity framwork對SQL server預存程序查詢語法的疑問 RRS feed

  • 問題

  • 小弟最近才開始接觸entity framwork技術 對許多技術細節不甚了解 希望這裡的大大多多指點

    首先我是用VB.NET 在開發自動回覆系統  目前基礎的思路是這樣 你說什麼建一行語句欄 去對應 我回什麼對應的語句欄 這樣的資料

    庫 我在SQL 中建好了表格 也建好了對應預存程序

    預存程序如下:

     

    CREATE PROC 查詢語句流程
    (
    @你說什麼 Varchar(50),
    @我回什麼 Varchar(50) OUTPUT)
    AS 
    BEGIN
        SELECT @我回什麼=我回什麼 FROM 語句表
        WHERE 你說什麼=@你說什麼
    END
    GO
    

     

    接著我把程式和我這個語句資料庫做好了連結 也產生了 語句資料庫Model.edmx 檔案出來了

    我曉得預存程序如果要用entity framwork調用 要先轉成對應的函數 這邊我也OK

    函數就叫做  查詢語句流程

    然後在前端程式編碼了下面的程式碼:

    Dim 你說什麼 as long= "哈瞜阿" 
    
    Dim 查詢語句流程 As ObjectParameter
        Public Function 語句查詢entities() As Long
    
            語句資料庫Context = New 語句資料庫Entities
            語句資料庫Context.ExecuteFunction(Of 日常用語語句表)("日常用語語句查詢預存程序", 查詢語句流程)
    
    
        End Function
    

    目前就卡在這裡 我現在該怎麼用 你說什麼 這個參數去連接查詢語句流程這個程序 接下來的代碼該怎麼寫?

    2012年1月14日 上午 05:22

解答

  •  



    您的預存程序撈的資料表為

    Select @IReplyWhat=我回什麼 From 語句表
    Where 你說什麼=@youSayWhat

    但您似乎要抓日常用語語句表的資料

    這樣的話DB裡查詢語句流程這個預存程序要改成

    Select @IReplyWhat=我回什麼 From 日常用語語句表
    Where 你說什麼=@youSayWhat

    吧?

    然後回第二張圖

    您的預存程序沒有回傳Entity,只做了設定參數動作

    所以EF裡,該函式請刪除,重新加入並選擇回傳"無"

     

     


    • 已標示為解答 向恩 2012年1月15日 上午 04:21
    2012年1月15日 上午 03:32

所有回覆

  • CREATE PROC 查詢語句流程
    (
    @你說什麼 Varchar(50),
    @我回什麼 Varchar(50) OUTPUT)
    AS 
    BEGIN
        SELECT @我回什麼=我回什麼 FROM 語句表
        WHERE 你說什麼=@你說什麼
    END
    GO
    
    


    參數名稱不要用中文,不然Entity framework有可能會出錯

    先改成英文

    /****** Object:  StoredProcedure [dbo].[查詢語句流程]    Script Date: 01/14/2012 14:38:31 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROC [dbo].[查詢語句流程]
    (
    @youSayWhat Varchar(50),
    @IReplyWhat Varchar(50) OUTPUT)
    AS 
    BEGIN
        SELECT @IReplyWhat=我回什麼 FROM 語句表
        WHERE 你說什麼=@youSayWhat
    END
    
    

    在前端(ASP.net WebForm)使用方法

     

    Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    
    
            Dim entities As New 語句資料庫Entities
            Dim youSayWhat As String = "哈瞜阿" '輸入參數的值
            Dim iReplyWhat As New ObjectParameter("IReplyWhat", GetType(String)) '輸出參數
    
            '執行預存程序
            entities.查詢語句流程(youSayWhat, iReplyWhat)
    
            '畫面輸出 iReplyWhat的值
            Response.Write(iReplyWhat.Value)
        End Sub
    

    您可以參考MSDN的範例:

    HOW TO:使用搭配 In 和 Out 參數的預存程序執行查詢 (Entity Framework)


    2012年1月14日 上午 06:31
  • 如果你真的剛接觸EF,

    我建議先把問題單純化,

    先透過LINQ讓程式能正常動作,

    然後花時間去了解整個EF,

    一開始就花心力在EF與SP上,

    有點操之過急。

     

    Ref:預存程序支援 (Entity Framework)


    blog.kkbruce.net
    Plurk
    Google+專頁

    春有百花秋有月,
    夏有涼風冬有雪,
    若無閒事在心頭,
    便是人間好時節。
    2012年1月14日 上午 06:32

  • Shadow And Happy Code  謝謝您的回覆  

     

    我參考了您的代碼做了點小修改

    這是我目前的資料表

    前端程式則是像以下這樣

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            GetList()
            Dim entities As New 語句資料庫Entities
            Dim youSayWhat As String = "安安" '輸入參數的值
            Dim iReplyWhat As New ObjectParameter("IReplyWhat", GetType(String)) '輸出參數
    
            '執行預存程序
            entities.查詢語句流程(youSayWhat, iReplyWhat)
    
            '畫面輸出 iReplyWhat的值
            Console.Write(iReplyWhat.Value)
    
            If iReplyWhat.Value <> 0 Then
    
                RichTextBox2.Text = iReplyWhat.Value
            End If
    
            '   Call ce()
        End Sub
    


    運作正常的話 照理說應該會得到 你好阿  打印在RichTextBox.Text上 可是 我按運行時卻沒看到任何的訊息跑出來

    我一步步去檢查代碼運行

    發現程式碼運行到

    <strong>Public Function 查詢語句流程(你說什麼 As Global.System.String, 我回什麼 As ObjectParameter) As ObjectResult(Of 日常用語語句表)
            Dim 你說什麼Parameter As ObjectParameter
            If (你說什麼 IsNot Nothing)
                你說什麼Parameter = New ObjectParameter("你說什麼", 你說什麼)
            Else
                你說什麼Parameter = New ObjectParameter("你說什麼", GetType(Global.System.String))
            End If</strong>
    


    這裡就停了

    沒有回傳 Return MyBase.ExecuteFunction(Of 日常用語語句表)("查詢語句流程", 你說什麼Parameter, 我回什麼)

    上面這行指令 請問這是怎麼回事?

    2012年1月14日 上午 11:22
  • iReplyWhat.Value 型別是字串

      If iReplyWhat.Value <> 0 Then

                RichTextBox2.Text = iReplyWhat.Value
            End If

    改成

     If iReplyWhat.Value <> "" Then

                RichTextBox2.Text = iReplyWhat.Value
            End If

    再試試看

    另外,若有修改過預存程序的話,記得要再做一次從資料庫更新,確保匯入的函式也是最新的


    2012年1月14日 下午 12:19
  • 不好意思  還是不行  能麻煩幫我看一下代碼出了什麼問題嗎?

    資料上傳至 skydriver了

    https://skydrive.live.com/redir.aspx?cid=105b2868cb2df559&resid=105B2868CB2DF559!212&parid=105B2868CB2DF559!130

    下面是SQL 的部分 

     

    2012年1月14日 下午 02:51
  • 因為您的預存程序修改後,Enity framework還要再做"從資料庫更新">"重新整理",並確保函式和對應的預存程序都是最新的

    可以參考:http://msdn.microsoft.com/zh-tw/library/cc716689(v=vs.90).aspx

    請見下圖就是您調用預存程序失敗的原因

    (不然就把edmx刪除,重新加入)

     

    另外,程式碼這樣就好了

     

      Dim entities As New 語句資料庫Entities
            Dim youSayWhat As String = "安安" '輸入參數的值
            Dim iReplyWhat As New ObjectParameter("IReplyWhat", GetType(String)) '輸出參數
    
            '執行預存程序
            entities.查詢語句流程(youSayWhat, iReplyWhat)
    
            RichTextBox1.Text = iReplyWhat.Value
            
    

    本人修改過後的專案包

     

     

     

     

     



    2012年1月14日 下午 03:35
  • 我發現我調用的資料表 連結到錯誤的資料庫 難怪我在做函式匯入匯入預存程序時 一直顯示的是中文的

    現在我修正了這個錯誤了  更新了edmx  查詢語句流程 已經有顯示出英文的 youSayWhat IReplyWhat

    可是 我按照表上的資料 更新了下面的查詢 你說什麼

     Dim youSayWhat As String = "哈瞜"

    還是沒有打印出任何資料  不曉得您有沒有這種情況 到底是哪邊還有問題呢?


    • 已編輯 向恩 2012年1月15日 上午 12:41
    2012年1月15日 上午 12:40
  • 可是 我按照表上的資料 更新了下面的查詢 你說什麼

     Dim youSayWhat As String = "哈瞜"

    還是沒有打印出任何資料  不曉得您有沒有這種情況 到底是哪邊還有問題呢?



    我這邊都是執行OK

    另外,您的預存程序為

    Select @IReplyWhat=我回什麼 From 語句表
    Where 你說什麼=@youSayWhat

     

    但您想要抓

    Select * From 日常用語語句表

    您好像抓錯了吧

    抓的資料,應該要以預存程序的語句表資料為主

     

     The blog of typewriter職人




    2012年1月15日 上午 02:48
  • 這是我的專案包

    https://skydrive.live.com/redir.aspx?cid=105b2868cb2df559&resid=105B2868CB2DF559!213&parid=105B2868CB2DF559!130

     

    以下是我安裝的SQL 版本資訊 不是sqlexpress  

     

    Microsoft SQL Server Management Studio 10.50.1617.0

    Microsoft Analysis Services 用戶端工具 10.50.1617.0

    Microsoft Data Access Components (MDAC) 6.1.7601.17514

    Microsoft MSXML 2.6 3.0 4.0 6.0 

    Microsoft Internet Explorer 8.0.7601.17514

    Microsoft .NET Framework 2.0.50727.5448

    作業系統 6.1.7601

     

     

    我安裝時用的版本是 SQL R2 develope 的版本

    我們的專案唯一的差異性 應該只有 有沒有指定實體  我這裡有指定了實體 日常用語語句表


    • 已編輯 向恩 2012年1月15日 上午 03:23
    2012年1月15日 上午 03:22
  • 我按部檢查每行代碼傳回的 VALUE  如下

    看起來的情形似乎 沒有進入到SQL 去執行 預存程序 都沒有傳回任何東西 Nothing

    2012年1月15日 上午 03:31
  •  



    您的預存程序撈的資料表為

    Select @IReplyWhat=我回什麼 From 語句表
    Where 你說什麼=@youSayWhat

    但您似乎要抓日常用語語句表的資料

    這樣的話DB裡查詢語句流程這個預存程序要改成

    Select @IReplyWhat=我回什麼 From 日常用語語句表
    Where 你說什麼=@youSayWhat

    吧?

    然後回第二張圖

    您的預存程序沒有回傳Entity,只做了設定參數動作

    所以EF裡,該函式請刪除,重新加入並選擇回傳"無"

     

     


    • 已標示為解答 向恩 2012年1月15日 上午 04:21
    2012年1月15日 上午 03:32
  • 恩  謝謝   Shadow

    按照您的指導 已經可以打印出東西了

    2012年1月15日 上午 04:20