2015-12-23 38 views
0

好日子,加載Access表到DataSet中的.NET

我使用OleDbDataAdapter的VB.NET中對查詢結果加載到數據集。

但是,當我遍歷代碼時,它僅將列加載到數據集中,而不是查詢中的行。

我做了一個簡單的測試,將該查詢結果導出到一個單獨的Access數據庫中,然後嘗試加載它並正常工作。

我不確定填充的命令是否支持加載查詢結果?

這是我使用加載了Access表中的代碼:

Dim dsAccess As New DataSet 
    Dim da As OleDb.OleDbDataAdapter 

    Try 
     If conAccess.State = ConnectionState.Open Then 
      sql = "SELECT * FROM " & strTblName 
      da = New OleDb.OleDbDataAdapter(sql, conAccess) 


      da.Fill(dsAccess, strTblName) 
     Else 
      Return False 
     End If 
    Catch ex As System.Exception 
     Return False 
    Finally 
     da = Nothing 
    End Try 

注意,我已經編輯了這個問題,以顯示我的「查詢」的實際表結構。

enter image description here

這就是我想上執行選擇查詢。

查詢的設計視圖:

enter image description here

希望這有助於診斷這個問題!

+0

你顯示的東西看起來不錯。該表中有行嗎?嘗試FILL()而不傳遞表名,這會改變結果嗎? – Steve

+0

@沒有運氣。相同的結果。只需加載列。我在Access中檢查並重新檢查。該查詢集中有數據。大約有2292條記錄。這可能是一個問題嗎? –

+0

我只通過傳入一個DataTable來使用DataAdapter.Fill。如果你傳遞一個DataTable,它是否工作? –

回答

1

如果不檢查錯誤信息是什麼,例如嘗試一次try-catch並不是一個好主意, MessageBox.Show(ex.Messasge)。您是否嘗試過這種方式,或者將代碼完全從try-catch中取出以查看是否拋出了異常?

請嘗試通過適當修改連接字符串和表名嘗試以下代碼。希望數據被返回或引發異常。

還有一件事,如果字段名中有空格,例如名字你可能需要做一些像SELECT [名字] ...最後,如果任何字段是reserve words像日期,你應該包裝在[]。

Public Sub SimpleDemo() 
    Dim dt As New DataTable 
    Dim strTblName As String = "SomeTable" 
    Using cn As New OleDb.OleDbConnection With 
     { 
      .ConnectionString = "Your connection string goes here" 
     } 
     Using cmd As New OleDb.OleDbCommand With 
      { 
       .Connection = cn, 
       .CommandText = "SELECT * FROM " & strTblName 
      } 
      cn.Open() 
      dt.Load(cmd.ExecuteReader) 
     End Using 
    End Using 

    MessageBox.Show(dt.Rows.Count.ToString) 
End Sub 
+0

凱倫你好,謝謝你的回覆。我確實試着在try-catch之外執行代碼,然後我通過了它。它沒有拋出任何錯誤。我也檢查了'Err.Description'和'Err.Number'都是空的。我將把你的代碼放入我的修改中,並儘快報告結果。 –

+0

您可以發佈您的SQL語句,也不要使用Err.Description或Err.Number,而應使用try-catch使用ex.Message。 –

+0

這是SQL語句我有'sql = SELECT * FROM EmailAddress'。我已經使用過上面的代碼,但這些行還沒有填充到「DataTable」中。只有這些列正在填充。我開始認爲_how_表中可能存在一個問題,該表是在Access內部構建的。這本質上是一個查詢......所以也許這可能是一個問題?此外,代碼沒有拋出任何異常(它工作正常)。 –

0

好吧,經過很多研究,我終於找到了一種方法來加載表。我在這裏發佈這個,所以遇到此問題的其他人可以使用!

反正我發現了什麼是,當您使用Microsoft Access,該OleDbAdapter不喜歡的是,Like語句使用*通配符的事實。我發現在使用OleDbAdapter時必須使用%運算符。一個簡單的替代做這個工作。

所以基本上我所做的是,我發現了查看後面的實際查詢。我得到了它的視圖定義(這是討厭的查詢,包含Like,從那裏我只做了一個簡單的替換)。

下面的代碼(發佈此對大家有所幫助別人節省一些時間):

   Dim dtMeta As DataTable = conAccess.GetSchema("Tables") 

       If drTableType.Length > 0 Then 
        If drTableType(0).Item("TABLE_TYPE") = "VIEW" Then 
         dtMeta = Nothing 
         dtMeta = conAccess.GetSchema("Views") 
         drTable = dtMeta.Select("TABLE_NAME='" & strTblName & "'") 
         If drTable.Length > 0 Then 
          strOriginalQuery = drTable(0).Item("VIEW_DEFINITION").ToString() 
          strModifiedQuery = strOriginalQuery.Replace("*", "%") 

          Dim myCommand As OleDbCommand = New OleDbCommand() 
          myCommand.CommandText = strModifiedQuery 
          da = New OleDbDataAdapter(myCommand.CommandText, conAccess) 
          da.Fill(dsAccess, strTblName) 
         End If 
        Else 
         da.Fill(dsAccess, strTblName) 
        End If 
       End If 

被採用的GetSchema方法來獲取表的名字出來,然後再下來,我再次使用的方法檢索Views集合,從這裏我能夠得到具有實際查詢背後的ViewDefinition

+1

沒有看到它是來自代碼的視圖,如果我有,我會指示你到我寫在這裏的MSDN代碼示例https://code.msdn.microsoft.com/Execute-SQL-statements-aa3015b5 –