2015-12-23 4 views
0

Добрый день,Загрузка таблицы Access в DataSet .NET

Я использую OleDbDataAdapter в VB.NET для загрузки результатов запроса в наборе данных.

Однако, когда я просматриваю код, он загружает столбцы только в набор данных, а не в строки запроса.

Я сделал короткий тест, экспортировав этот результат запроса в отдельную БД доступа, а затем попытался загрузить его, и он работал правильно.

Я не уверен, поддерживает ли команда для Заполнение поддерживает загрузку результатов запроса?

Это код, я использую, чтобы загрузить таблицу 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

@Steve не повезло. Те же результаты. Просто загружает столбцы. Я проверил и перепроверял Access. В этом наборе данных есть данные. Имеет около 2292 записей. Это может быть проблема? –

+0

Я только когда-либо использовал DataAdapter.Fill, перейдя в DataTable. Если вы передадите DataTable, это сработает? –

ответ

1

Не рекомендуется иметь try-catch, не проверяя, что такое сообщение об ошибке, например. MessageBox.Show (ex.Messasge). Вы пробовали это или полностью вывели код из try-catch, чтобы узнать, выбрано ли исключение?

PLease попробуйте использовать следующий код с соответствующими изменениями в строке подключения и имени таблицы. Надеемся, что данные будут возвращены или будет выбрано исключение.

Еще одна вещь, если имена полей имеют пробелы в них, например. Сначала вам может понадобиться сделать что-то вроде SELECT [Имя] ... и, наконец, если какие-либо поля reserve words, например Date, вы должны обернуть их в [].

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 вы должны использовать оператор %. Простое замещение выполняет эту работу.

Так что в основном то, что я сделал, я нашел фактический запрос за View, который у меня был. Я получил представление «Определение» (что является досадным запросом, который охватывает 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 –

Смежные вопросы