none
利用entity framwork 進行資料儲存語法問題 RRS feed

  • 問題

  • 上禮拜剛學會了用entity framwork預存程序去進行查詢

    那現在要改成 利用entities 去進行SQL 資料儲存的動作

     

    一樣先把edmx 檔案 和程式做好了連結 

    然後NEW好這個實體  之後請看在下的程式碼

     

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            Dim entities As New 語句資料庫Entities4
            Dim x As String = TextBox1.Text
            Dim y As String = TextBox2.Text
            Dim yousaywhat As String = x
            Dim IReplywhat As String = y
    
            語句資料庫Entities4.AddObject("你說什麼", yousaywhat)
            語句資料庫Entities4.AddObject("我回什麼", IReplywhat)
            語句資料庫Entities4.SaveChanges()
    
    
    
        End Sub
    

     


    我參考了書上的資料  

     

     

    語句資料庫Entities4.AddObject("你說什麼", yousaywhat)
            語句資料庫Entities4.AddObject("我回什麼", IReplywhat)
            語句資料庫Entities4.SaveChanges()
    

     

    我不曉得哪裡理解錯誤了  上面這三句 跑出了三句錯誤訊息: 參考非共用成員需物件參考 

    請教一下這邊該如何修正才能使用呢?

     

     



    • 已編輯 向恩 2012年1月20日 下午 02:23
    2012年1月20日 下午 02:23

解答

  • 試試這樣
       '按鈕Click事件
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    
      
            Dim entities As New 語句資料庫Entities4
            Dim x As String = TextBox1.Text
            Dim y As String = TextBox2.Text
    
            '依 "你說什麼"值來判斷數據有沒有重覆
               '先計算筆數
            Dim count = entities.日常用語語句表.Where(Function(ccc) ccc.你說什麼 = x).Count()
            If count = 0 Then '無數據,做新增
                Dim study As 日常用語語句表 = entities.日常用語語句表.CreateObject()
    
                study.你說什麼 = x
                study.我回什麼 = y
    
    
                entities.日常用語語句表.AddObject(study)
                entities.SaveChanges()
    
                MessageBox.Show("新增資料完成")
            Else
                MessageBox.Show("已有此數據,未新增")
            End If
    
            
    
        End Sub
    
     

    • 已標示為解答 向恩 2012年1月21日 上午 08:53
    2012年1月21日 上午 04:31

所有回覆

  • Step 1. 您要先利用語句資料庫Entities把日常語句表物件Create出來

    Step2. 設定該物件成員的屬性值

    Step 3.再用 語句資料庫Entities4.日常語句實體集.AddObject() 去加入該物件才對

     

    附上北風資料庫Sample Code僅供參考:

    Dim entities As New NorthwindChineseEntities()
    Dim c As Category = entities.Categories.CreateObject()
    c.CategoryName = "Hello"
    c.Description = "World"
    entities.Categories.AddObject(c)
    entities.SaveChanges()

     

    也可以參考MSDN的新刪修範例

    http://msdn.microsoft.com/zh-tw/library/bb386870.aspx

     

     



    2012年1月20日 下午 03:32
  • 謝謝   Shadow 依照你的指導 我修改了我的代碼 已經可以使用了

    代碼修改如下

     

     

      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
    
    
            Dim entities As New 語句資料庫Entities4
    
            Dim study As 日常用語語句表 = entities.日常用語語句表.CreateObject()
    
            Dim x As String = TextBox1.Text
    
            Dim y As String = TextBox2.Text
    
            study.你說什麼 = x
    
            study.我回什麼 = y
    
    
    
            entities.日常用語語句表.AddObject(study)
    
            entities.SaveChanges()
    
            Console.WriteLine("新增資料完成")
    
            MessageBox.Show("新增資料完成")
    
            Console.Read()
    
    
    
        End Sub
    

     

    不過還有一個問題想請教一下  就是我現在能存入資料了  

    但我不想要儲存到重複的資料  

    SQL 裡面的日常用語語句表 這個TABLE 的你說什麼欄 我有下了PRIMARY 的指令過

    在SQL 裡面直接儲存是沒問題  但現在用entities的技術去編寫前端程式  不曉得 可不可以在儲存前

    先做個預置判讀有無先儲存過這筆資料  然後在寫進SQL裡去  這個要怎麼做呢?

     



    • 已編輯 向恩 2012年1月21日 上午 03:26
    2012年1月21日 上午 03:25
  • 試試這樣
       '按鈕Click事件
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    
      
            Dim entities As New 語句資料庫Entities4
            Dim x As String = TextBox1.Text
            Dim y As String = TextBox2.Text
    
            '依 "你說什麼"值來判斷數據有沒有重覆
               '先計算筆數
            Dim count = entities.日常用語語句表.Where(Function(ccc) ccc.你說什麼 = x).Count()
            If count = 0 Then '無數據,做新增
                Dim study As 日常用語語句表 = entities.日常用語語句表.CreateObject()
    
                study.你說什麼 = x
                study.我回什麼 = y
    
    
                entities.日常用語語句表.AddObject(study)
                entities.SaveChanges()
    
                MessageBox.Show("新增資料完成")
            Else
                MessageBox.Show("已有此數據,未新增")
            End If
    
            
    
        End Sub
    
     

    • 已標示為解答 向恩 2012年1月21日 上午 08:53
    2012年1月21日 上午 04:31
  • 謝謝 SHANDOW可以使用了
    2012年1月21日 上午 08:54
  • 不好意思  突然想到 上個問題有一個延續的問題想問

    先看一下我這裡編寫的程式碼:

     

      Dim entities As New 語句資料庫Entities4
            Dim youSayWhat As String = "歐嗨優" '輸入參數的值
            Dim iReplyWhat As New ObjectParameter("IReplyWhat", GetType(String)) '輸出參數
    
            '執行預存程序
            entities.查詢語句流程(youSayWhat, iReplyWhat)
    
            '畫面輸出 iReplyWhat的值
            Console.Write(iReplyWhat.Value)
    
            If iReplyWhat.Value > "" Then
    
                RichTextBox1.Text = iReplyWhat.Value
    
            ElseIf iReplyWhat.Value = "" Then
    
                Dim Nostudy As 未回應的語句 = entities.未回應的語句.CreateObject()
                Nostudy.未儲存過的語句 = youSayWhat
                entities.未回應的語句.AddObject(Nostudy)
                entities.SaveChanges()
                MessageBox.Show("這句沒學過喔")
    
            End If
    
    

     


    我想把我建在預存程序去查詢日常用語語句表 沒有<你說什麼>欄資料的 這裡建一個判讀 如果沒有的話

    儲存到另一個表 未回應的語句表內 的為儲存過的語句中 像上面這樣 可是我寫這樣在跑的時候 歐嗨優

    是我沒建立過的資料  它沒有跑下來

     

    ElseIf iReplyWhat.Value = "" Then
    
                Dim Nostudy As 未回應的語句 = entities.未回應的語句.CreateObject()
                Nostudy.未儲存過的語句 = youSayWhat
                entities.未回應的語句.AddObject(Nostudy)
                entities.SaveChanges()
                MessageBox.Show("這句沒學過喔")
    
            End If
    

     

    跑下面這一段的程式  這是怎麼一回事呢? 該怎麼修改


    • 已編輯 向恩 2012年1月21日 上午 09:23
    2012年1月21日 上午 09:22
  • 可能是iReplyWhat.Value型別問題或您的判斷句寫錯了

    試試改成以下粗體字

     

    If Convert.ToString(iReplyWhat.Value) <> "" Then
    
                RichTextBox1.Text = iReplyWhat.Value
    
            ElseIf Convert.ToString(iReplyWhat.Value) = "" Then
    
                '...新增(略
                MessageBox.Show("這句沒學過喔")
    
            End If
    

     

     



    2012年1月21日 上午 11:12
  • 嗨 SHandow 按照你的指導 我做了點修正  可是沒有反應  資料也沒有儲存進去表格裡面

    上面是EDMX

    以下是程式碼:

       Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
            Dim entities As New 語句資料庫Entities4
            Dim youSayWhat As String = "歐嗨優" '輸入參數的值
            Dim iReplyWhat As New ObjectParameter("IReplyWhat", GetType(String)) '輸出參數
    
            '執行預存程序
            entities.查詢語句流程(youSayWhat, iReplyWhat)
    
            '畫面輸出 iReplyWhat的值
            Console.Write(iReplyWhat.Value)
    
            If Convert.ToString(iReplyWhat.Value) <> "" Then
    
                RichTextBox1.Text = iReplyWhat.Value
    
            ElseIf Convert.ToString(iReplyWhat.Value) = "" Then
    
                Dim Nostudy As 未回應的語句 = entities.未回應的語句.CreateObject()
                Nostudy.未儲存過的語句 = youSayWhat
                entities.未回應的語句.AddObject(Nostudy)
                entities.SaveChanges()
                MessageBox.Show("這句沒學過喔")
    
            End If
    
            '   Call ce()
    
        End Sub
    

    不曉得哪邊還有問題 ?

     

     

    2012年1月21日 下午 12:02
  •  

       Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
            Dim entities As New 語句資料庫Entities4
            Dim youSayWhat As String = "歐嗨優" '輸入參數的值
            Dim iReplyWhat As New ObjectParameter("IReplyWhat", GetType(String)) '輸出參數
    
            '執行預存程序
            entities.查詢語句流程(youSayWhat, iReplyWhat)
    
            '畫面輸出 iReplyWhat的值
            Console.Write(iReplyWhat.Value)
    
            If Convert.ToString(iReplyWhat.Value) <> "" Then
    
                RichTextBox1.Text = iReplyWhat.Value
    
            ElseIf Convert.ToString(iReplyWhat.Value) = "" Then
    
                Dim Nostudy As 未回應的語句 = entities.未回應的語句.CreateObject()
                Nostudy.未儲存過的語句 = youSayWhat
                entities.未回應的語句.AddObject(Nostudy)
                entities.SaveChanges()
                MessageBox.Show("這句沒學過喔")
    
            End If
    
            '   Call ce()
    
        End Sub
    

    不曉得哪邊還有問題 ?

     

     

     


    我試了一下您的代碼,是可以跑的(除了句子數量欄位不知道是不是identity該不該自行給值)

    請您下中斷點或檢查一下 Console.Write(iReplyWhat.Value) 輸出了什麼值?

    不然就改用Else再試試

    Else
       Dim Nostudy As 未回應的語句 = entities.未回應的語句.CreateObject()
                Nostudy.未儲存過的語句 = youSayWhat
                entities.未回應的語句.AddObject(Nostudy)
                entities.SaveChanges()
                MessageBox.Show("這句沒學過喔")

            End If

     





    2012年1月21日 下午 12:25
  • 沒有任何值輸出

     

    句子數量欄位  我是設置讓它自動增長的 identity

    目前的問題好像不是在判讀上 而是entities 感覺沒有儲存到SQL裡 卡再下面這一行 

     entities.SaveChanges()

    就沒跑下去了

    • 已編輯 向恩 2012年1月21日 下午 02:50
    2012年1月21日 下午 02:47
  •  

    句子數量欄位  我是設置讓它自動增長的 identity

    目前的問題好像不是在判讀上 而是entities 感覺沒有儲存到SQL裡 卡再下面這一行 

     entities.SaveChanges()

    就沒跑下去了


    那有錯誤訊息嗎?

    看來只好一層一層地檢查了

     

    1. 請先把 未回應的語句 從EDMX中刪除,再重新加入Build專案(請先確保.config裡的連線字串正確)

    2. 再單獨執行

     Dim entities As New 語句資料庫Entities4 

    Dim Nostudy As 未回應的語句 = entities.未回應的語句.CreateObject()
      Nostudy.未儲存過的語句 = "歐嗨優"
      entities.未回應的語句.AddObject(Nostudy)
    entities.SaveChanges()

    試試看有沒有新增至DB中

    3. 再不行的話,請把專案包丟上來我研究看看





    2012年1月21日 下午 03:07
  • 未回應的語句 從EDMX中刪除,再重新加入Build專案 一樣沒用

    也沒有出現任何的錯誤訊息

    我上傳到SKYDRIVE了

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

    麻煩你了
    • 已編輯 向恩 2012年1月21日 下午 04:02
    2012年1月21日 下午 04:02
  • 我試了一下,我的操作步驟

    先把app.config的連線字串  語句資料庫Entities4 的Data Source=(local)改成Data Source=.\sqlexpress 因為我是使用SQL 2008 Sqlexpress版

    然後到EDMX裡把Entity刪除只剩

    日常用語語句表、未回應的語句

    然後一執行,確實沒有MessageBox.Show出現,但一點擊按鈕是有新增資料到我的DB

    後來我是到EDMX把 未回應的語句 這個Entity刪除,重新從DB加入後,再執行程式就正常了

    以下是我改過的專案包,您拿去試試吧

    http://files.dotblogs.com.tw/shadow/1201/201212203854459.rar



    2012年1月21日 下午 04:42
  • 不好意思 我試了您的專案包還是不行 之後我看了您的操作步驟 

    我是把整個DB砍掉 app.config也整個砍掉 在重新加入語句資料庫

    新增資料那個部分是沒有問題  按鈕按下去它可以判斷有無這學習筆資料

    不過未回應的語句  

    Dim youSayWhat As String = "歐嗨優"

    這句是日常用語語句表沒有的資料 

     ElseIf Convert.ToString(iReplyWhat.Value) = "" Then

                Dim Nostudy As 未回應的語句 = entities.未回應的語句.CreateObject()

                Nostudy.未儲存過的語句 = youSayWhat

                entities.未回應的語句.AddObject(Nostudy)

                entities.SaveChanges() 

    情況還是沒有改變 依然只執行到SaveChanges 

    歐嗨優還是沒存入 未回應的語句  不曉得您未回應的語句 真的有存入資料了嗎?

    因為我的還是不行

    2012年1月21日 下午 11:19
  • 我在資料庫另建了一個新的資料表  然後在更新模型已經可以使用了

    我改成使用另一個新的資料表

    以下是目前我的使用畫面

    我發現好像跟那個鑰匙 的圖案出現有關  應該是未儲存過的語句我有下到PRIMARY KEY 的指令 導致無法寫入資料

    2012年1月21日 下午 11:40
  • 剛剛又下載您的專案包回來研究,我發現您的 未回應的語句資料表似乎在DB中沒有指定PK

    導致您的EDMX在產生 未回應的語句Entity時候發生找不到主索引鍵(圖表才會出現兩個鑰匙,可以用VS的XML開啟方式開啟EDMX就看得到此錯誤訊息),於是 未回應的語句就被創建成唯讀資料表

    看您要不要試試在DB中給 未回應的語句的 句子數量欄位設定PK,EDMX中該Entity刪除再重新加入,應該就可以了

    不然就得再看一下您DB裡 未回應的語句的Create table語法

     

     

     







    2012年1月22日 上午 03:13
  • 恩恩 那應該是我句子數量沒有設定PK的關係 難怪會出現那兩個鑰匙。

    想請問一下要看Create table語法 要下什麼語法才能看阿?

    目前我已經開始在使用這幾個表格也開始存了一些資料進去

    但有一些問題想提出來討論一下  就是我之前不是用SQL 存資料的時候

    我把資料存在txt上 加上資料流讀取器 重點是搜索的資料可以有允許有一些文字不在

    比如

    我資料是這樣存入的   你說什麼 : 你好嗎??    我回什麼 :恩 不錯阿

    路人甲: 你好嗎

    AI: 恩 不錯阿

    少了兩個問號 但依然能匹配到資料  不曉得這部分的功能是如何實現的

    我曉得SQL裡似乎有模糊搜索的功能 這個東西該怎麼使用 感覺可以實現比上面這個例子

    更強大的功能  不曉得可不可以請您分享一下經驗



    • 已編輯 向恩 2012年1月23日 上午 11:25
    2012年1月23日 上午 07:28