none
OleDbDataAdapter.Update時更新找不到 TableMapping['零件資料'] 或 DataTable '零件資料'。 RRS feed

  • 問題

  • dataset修正後

    update時卻發生

    adapter傳入為dbf,下的sql也與出建立一樣

    例外詳細資訊: System.InvalidOperationException: 更新找不到 TableMapping['零件資料'] 或 DataTable '零件資料'。

    原始程式錯誤:

    行 155:        '利用Adapter將DataTable資料回存至資料庫
    行 156:
    行 157:        OleDbDataAdapter.Update(MyDataSet, "零件資料")
    行 158:      
    

    請告知如何修正

    謝謝

    2006年5月20日 下午 02:19

解答

  • 幾個觀念可能要說明一下,你並沒有張貼 Connect2AccessDB 程式碼,所以我以通論的方式描述:

    1. 不建議你在 Web 系統上使用 dbf 檔當做資料庫。我不知道你用哪個驅動程式連線,用 VFP 會好一點,用 dBaseX 的都會變獨占模式,不適合網頁用。

    2. 我碰過 dBaseX / Foxpro 的 Driver 會要求檔名為短檔名,有時中文會短路,所以 Table Name 的部份也有可能出問題。

    3. 在 Web 系統上代理執行的使用者可能為 ASPNET 帳號或是 Network Service 群組,若是沒正確設定檔案總管上的權限,例如該帳號沒有列示權限,則以 dbf 這種以目錄為單位、以檔案為表名的資料庫將無法找到資料表,所以找不到資料表也有可能是權限問題,也就是你的狀況包含太多種可能,難以推測斷定。

    建議你把相同的程式碼搬到 Windows Form 上跑看看,這也比較好除錯,而此時權限是以你目前使用者身分權限在跑,也比較清楚,而且可以除錯。

    我所知道的 DataSet 與 CommandBuilder 所用的 Adapter 應該是要同一個物件,這樣 CommandBuilder 才能正確的自動建立語法,我自己沒試過不同的物件串在一起,所以你用 Windows Form 的另一好處就是可以用除錯模式檢查,一般來說,Web 應用程式應該是透過 Form Post 將資料表內傳回來,讀出 DataSet 後,將資料表傳來的更新內容更新此時的 DataSet ,再讓 CommandBuilder 更新,因此 Adapter 也會是一致,你的作法繞了一圈,不清楚會產生怎樣的後果。

    2006年5月21日 上午 04:00
    版主

所有回覆

  • 你只要做一件事,就是確定 MyDataSet 中確實存在有 "零件資料" 這個表 .
    2006年5月20日 下午 03:00
    版主
  • 你有在程式碼中加入 OleDbCommandBuilder 這個類別嗎?

    直接用 Update 而非使用 UpdateCommand 時,需要透過 xxxCommandBuilder 來自動替你建立 UpdateCommand 進行更新、新增、刪除等指令。

    2006年5月21日 上午 01:41
    版主
  •  Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
            Dim MyDataSet As DataSet = GetDataSet()

            '修改第二列中的欄位『』
            MyDataSet.Tables(0).Rows(0).BeginEdit()
            MyDataSet.Tables(0).Rows(0).Item("零件名稱") = "24123123"
            MyDataSet.Tables(0).Rows(0).EndEdit()

            MyDataSet.Tables(0).Rows(0).AcceptChanges()
            '將修改後的 DataTable 資料填入 DataGrid

            Me.DataGrid1.DataSource = MyDataSet
            Session("MyDataSet") = MyDataSet
            Me.DataGrid1.DataBind()
        End Sub

        Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
            'Dim MyDataSet As DataSet = GetDataSet()
            Dim MyDataSet As DataSet = Session("MyDataSet")

            Dim OleDbDataAdapter As System.Data.OleDb.OleDbDataAdapter

            '重新建立Adapter

            OleDbDataAdapter = Connect2AccessDB("C:\Inetpub\wwwroot\零件資料.dbf", "select 零件代號,零件名稱,裁決價 from 零件資料 ORDER BY 零件代號;")

            '自動建立回存用的SQL指令
            Dim cmdBuder As New Data.OleDb.OleDbCommandBuilder(OleDbDataAdapter)

            '利用Adapter將DataTable資料回存至資料庫

            OleDbDataAdapter.Update(MyDataSet)
            Me.DataGrid1.DataSource = MyDataSet
            Me.DataGrid1.DataBind()
        End Sub
    本來是再度呼叫 reload程式段

    但前幾次都失敗

    我就於修改資料後直接將dataset指定給session

    於更新時拿來用(螢幕datagrid資料已修正)

    若datagrid顯示資料已完成修正,表示dataset是最新的

    直接設定給新的dataset,最回adapter使用,應該是合理

    執行時就沒有錯誤,但資料表格仍無修正更新(於重新reload資料時又跑原有資料)

    真不知如何處理?因為我是從pc 應用程式(fox)想學網頁資料庫

    現發現網路資料更新真的是很複雜

    其實我覺得datagrid已經有指定的資料來源也有adapter,就應該原路套用回歸

    原資料來源就好,何必要轉來轉去,把事情整個複雜化

    或許是我比較笨吧!

     

    2006年5月21日 上午 03:41
  • 幾個觀念可能要說明一下,你並沒有張貼 Connect2AccessDB 程式碼,所以我以通論的方式描述:

    1. 不建議你在 Web 系統上使用 dbf 檔當做資料庫。我不知道你用哪個驅動程式連線,用 VFP 會好一點,用 dBaseX 的都會變獨占模式,不適合網頁用。

    2. 我碰過 dBaseX / Foxpro 的 Driver 會要求檔名為短檔名,有時中文會短路,所以 Table Name 的部份也有可能出問題。

    3. 在 Web 系統上代理執行的使用者可能為 ASPNET 帳號或是 Network Service 群組,若是沒正確設定檔案總管上的權限,例如該帳號沒有列示權限,則以 dbf 這種以目錄為單位、以檔案為表名的資料庫將無法找到資料表,所以找不到資料表也有可能是權限問題,也就是你的狀況包含太多種可能,難以推測斷定。

    建議你把相同的程式碼搬到 Windows Form 上跑看看,這也比較好除錯,而此時權限是以你目前使用者身分權限在跑,也比較清楚,而且可以除錯。

    我所知道的 DataSet 與 CommandBuilder 所用的 Adapter 應該是要同一個物件,這樣 CommandBuilder 才能正確的自動建立語法,我自己沒試過不同的物件串在一起,所以你用 Windows Form 的另一好處就是可以用除錯模式檢查,一般來說,Web 應用程式應該是透過 Form Post 將資料表內傳回來,讀出 DataSet 後,將資料表傳來的更新內容更新此時的 DataSet ,再讓 CommandBuilder 更新,因此 Adapter 也會是一致,你的作法繞了一圈,不清楚會產生怎樣的後果。

    2006年5月21日 上午 04:00
    版主
  • 謝謝您的回覆與講解

    因為我前端(pc 系統試用visual foxpro 8.0發展製造體系),系統已建置完成也使用約1年多,該有的功能也發展好了(bom,訂單系統,庫存管制,mrp2,差勤,客戶管理)

    有一些資料老闆說要貼於內部網頁上,讓大家能用ie就可看到基本資料,有一些指標性地數據,老闆希望能於網頁上輸入(如營業目標,QA,QC等等),重要的是不能花錢!所以我才會就現有資料庫硬頭皮上場

    我看一些書也說OLE或OBDC可輕易連接與使用,所以就承接下此專案(原專案負責人離職了)

    近來一兩週按書操課,已可以連到資料表格,也可顯示資料於DATAGRID,但於修改資料上可是碰到大麻煩!

    一般書裡都是使用ACCESS,且講的也很複雜有籠統,舉的例題也很含糊,或許是太複雜所以無法簡單明瞭的定義出結論,或許我太笨!

      Function Connect2AccessDB(ByVal FilePath As String, ByVal SQL As String) As System.Data.OleDb.OleDbDataAdapter
            '宣告連線物件
            Dim conn As System.Data.OleDb.OleDbConnection
            '建立連線字串
            Dim connStr As String = "Provider=Microsoft OLE DB provider for visual foxpro; Data Source=" & FilePath & ";Persist Security Info=false"

            '建立連線物件實體
            conn = New System.Data.OleDb.OleDbConnection(connStr)
            '建立DataAdapter作為取得資料的通路
            Dim DataAdapter As New System.Data.OleDb.OleDbDataAdapter(SQL, conn)
            Connect2AccessDB = DataAdapter
        End Function

    所以要請各位先進協助了!

    不過各位忙!請看看就好!有興趣再提示一下!別勉強!畢竟各位是靠腦力!上班還要費神的!

    2006年5月21日 上午 09:51
  • ?

    我以前用的 dbf 都是以目錄為資料庫名,以檔名為表格名。

    我記得你前面傳進來的變數是 path\filename.dbf ,與我所知道的不符。

    你試過只用 path 傳進來嗎或是改用 dbc 傳進來嗎?

    另外你的 oledb 連線字串哪抄來的,我一般是用 odbc 去連,我搜尋了一下 Foxpro 的 oledb 連線字串,並沒有你使用的 Microsoft OLE DB provider for visual foxpro:

    http://www.codeproject.com/database/connectionstrings.asp

    OLE DB Provider for Visual FoxPro

    strConnect = "Provider=vfpoledb; Data Source=C:\\DatabasePath\\MyDatabase.dbc;"

    http://www.connectionstrings.com/

  •  Database container (.DBC):
    "Provider=vfpoledb.1;Data Source=C:\MyDbFolder\MyDbContainer.dbc;Collating Sequence=machine"
  •  Free table directory:
    "Provider=vfpoledb.1;Data Source=C:\MyDataDirectory\;Collating Sequence=general"
  • OleDB 連線字串參考:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fox7help/html/dggrfOLEDBProviderforVisualFoxPro.asp

     

2006年5月21日 上午 10:32
版主
  • 謝謝您的關心與貼文

    我剛剛試了

    1.檔名改成英文

    2.改用dbc

    3.指定路徑不帶檔案

    所得到的結果都是改將資料直接修改於dataset(螢幕上)

    更新時也無錯誤發生

    但重新載入資料表格卻還是原始資料

    不過整個流程

    1.載入資料表格及將資料表現於datagrid

    2.強制修改資料(datagrid資料也更正)

    3.更新原始資料表格(無錯誤)

    4.再載入原資料,剛剛修正的資料卻恢復原始狀態

    以上

    載入資料表格,顯示資料於datagrid上

    修改資料然後在datagrid看得到修改成功

    將datagrid的dataset反饋回adapter藉以更新資料表格

    但重新載入資料時卻還是不變

    所以可以確認地是有聯通資料表格,但將資料反饋時並無實際寫入原始資料表格

    以上謝謝,我還在努力尋找中!

    再次地跟您說謝謝!

     

    2006年5月21日 下午 12:53
  • 畫面上有更新,資料庫沒更新,又沒錯誤訊息,應該就是你只有更新到你原先的 DataSet ,並沒有正確將 DataSet 寫回資料庫。
    2006年5月21日 下午 03:35
    版主