2016-10-17 4 views
1

Немного фона. Там, где я работаю, у нас ограниченный доступ к инструментам программирования. У нас есть доступ к Microsoft Office Suite, поэтому большинство наших проектов создаются в Access, хотя есть и более эффективные решения. Недавно мы получили доступ к Visual Studio 2013, и я заинтересован в преобразовании некоторых из наших более используемых инструментов в проекты VB.NET.Выберите данные из ODBC-соединения в базу данных MS Access

У меня хорошее понимание VBA после его использования в течение стольких лет, однако преобразование в VB.NET, безусловно, является изменением, и хотя я понимаю концепцию этого, многие из функций, которые я использовал в прошлом, не существуют в VB.NET.

Это приводит меня к следующему вопросу.

Как подключиться к одной базе данных, подключению ODBC, а затем поместить выбранные поля из таблицы в этой базе данных в таблицу в базе данных Microsoft Access?

Вот мой текущий код.

Imports System.Data.Odbc 
Imports System.Data.Odbc.OdbcCommand 
Imports System.Data.OleDb 

Public Class Form1 

    Dim conn As OdbcConnection 
    Dim connBE As OleDb.OleDbConnection 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load 
     Call Connect_SLICWave() 
     Call Connect_Backend() 

     Dim sqlInsert As String = "INSERT INTO tblUOCs (EIAC,LCN,ALC,UOC) SELECT DISTINCT Trim(EIACODXA),Trim(LSACONXB),Trim(ALTLCNXB),Trim(UOCSEIXC) FROM ALAV_XC" 
     Dim beCmd As New OleDb.OleDbCommand(sqlInsert, connBE) 

     beCmd.ExecuteNonQuery() 
    End Sub 

    Private Sub Connect_SLICWave() 
     Dim connectionString As String 

     connectionString = "Dsn=slic_wave;uid=userid;pwd=password" 
     conn = New OdbcConnection(connectionString) 
    End Sub 

    Private Sub Connect_Backend() 
     Dim connectionStringBE As String 

     connectionStringBE = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\database.accdb" 
     connBE = New OleDb.OleDbConnection(connectionStringBE) 
    End Sub 

End Class 

Очевидно, что это не сработает. Я пробовал несколько вещей, основанных на примерах в Интернете, но не смог собрать какой-либо код, который работает.

При использовании базы данных Access я бы просто привязывался к таблицам как в ODBC-подключении, так и в базе данных доступа к базе данных, а затем я мог бы использовать DoCmd для запуска SQL для перемещения данных по мере необходимости, однако с VB.NET я не есть это роскошь. Возможно, я все это ошибаюсь из-за отсутствия знаний в Visual Studio.

Есть ли лучший способ достичь конечной цели? Мне нужно иметь возможность ссылаться на данные в ODBC-соединении, а затем хранить его где-нибудь, чтобы я мог выводить конкретный набор данных конечному пользователю. Может/должен использовать DataSet или DataTable? Сколько данных может храниться в DataSet/DataTable до того, как программа станет нестабильной? Данные, используемые в этом процессе, могут быть чрезмерно чрезмерными.

Обычно пользователь отправляет инструменту некоторые критерии с 4 или 5 полями данных. Затем инструмент развернется и примет эти критерии, чтобы получить надлежащий набор данных из подключенной базы данных ODBC, используя объединения примерно на 5-7 таблицах и возвращает один набор данных пользователю. Да, это немного чрезмерно, но это требование.

Надеюсь, я объясню это достаточно хорошо, не будучи слишком общим. Характер моего бизнеса не позволяет предоставить конкретные примеры.

Извините за то, что вы долготерпели, и я ценю любые усилия, которые помогают мне решить эту проблему. Если есть что-то, что нужно уточнить, дайте мне знать, и я попытаюсь объяснить это более четко.

+0

Сколько строк вы имеете в виду одновременно? – Plutonix

+0

Это варьируется, но в целом база данных, из которой я вытягиваюсь, большой, миллионы записей, а иногда мне нужно вытащить целую таблицу, которая может привести к более чем ста тысячам строк. –

+0

Если две таблицы находятся в базе данных сохранения, то я не понимаю, почему обновление или вставка запроса не будут работать. Проблема в том, что источником данных являются две разные базы данных. –

ответ

1

Вы можете найти полезным иметь в виду, что при выполнении запроса к базе данных Access Engine из приложения .NET вы можете использовать ссылки ODBC в запросах и тому двигатель выполнит необходимые подключения ODBC для вас. По сути, это временные «на лету» связанные таблицы ODBC, созданные для этого конкретного запроса.

Скажем, у нас есть таблица с именем [продукт] в SQL Server

id name 
-- ----- 
1 bacon 
2 tofu 

и мы можем достичь этого экземпляра SQL Server через ODBC DSN с именем "MyDB". Мы можем ссылаться на эту таблицу из запроса Access в

[ODBC;DSN=myDb].[product] 

Так, например, если мы хотим, чтобы запросить таблицу Access с именем [Заказы]

OrderID ProductID Qty Units OrderDate 
------- --------- --- ----- ---------- 
     1   1 3 pound 2016-10-17 

и тянуть в названиях с SQL таблица сервера с именем [продукт], мы можем сделать это в VB.NET:

Dim myConnectionString As String = 
     "Provider=Microsoft.ACE.OLEDB.12.0;" + 
     "Data Source=C:\Users\Public\Database1.accdb;" 
Using conn As New OleDbConnection(myConnectionString) 
    conn.Open() 
    Dim sql As String = 
     "SELECT p.name, o.Qty, o.Units " + 
     "FROM " + 
      "Orders o " + 
      "INNER JOIN " + 
      "[ODBC;DSN=myDb].[product] p " + 
       "ON p.id = o.ProductID" 
    Using cmd As New OleDbCommand(sql, conn) 
     Using rdr As OleDbDataReader = cmd.ExecuteReader 
      While rdr.Read 
       Console.WriteLine("{0} {1}(s) of {2} ", rdr("Qty"), rdr("Units"), rdr("name")) 
      End While 
     End Using 
    End Using 
End Using 

который печатает

3 pound(s) of bacon 
+0

Горд, это очень полезная информация, поскольку я не знал об этом. Кроме того, ммм, бекон! В настоящее время я не собираюсь присоединяться к таблицам из двух баз данных, но я буду, так что это будет полезно по этой линии. Мне нужно получить данные из ODBC-соединения в другой набор данных, будь то в рамках проекта или в базе данных Access, и это может помочь мне туда добраться. –

+0

Есть ли другой способ сократить [ODBC; DSN = myDb] во что-то еще? Скажем, я создал соединение, которое было объявлено как conn = New OdbcConnection («Dsn = slic_wave; uid = username; pwd = password»). Могу ли я использовать [conn]. [Product], или это не работает? Пожалуйста, простите мое невежество, поскольку я все еще хорошо разбираюсь в том, как работает VB.NET. –

+0

Нет, ссылка на отдельный .NET OdbcConnection не будет работать, потому что Access Database Engine не будет знать, как он настроен. Если ваша цель - запросить источник данных ODBC, а затем вывести результаты в Excel, и если у вас уже есть широко распространенный доступ, я бы рекомендовал просто выполнять работу с Access. Я не вижу огромных преимуществ при использовании приложения VB.NET, особенно если вы закончили использование автоматизации COM Access для экспорта Excel. (Да, все это можно было бы сделать в .NET вместо этого, но это не было бы вопросом доступа.) –

0

Прежде всего, мне нужно спросить об исходном источнике для вашего SLICWave ODBC-соединения. Является ли он все еще в Access, или вы, возможно, вытаскиваете его из Sql Server или аналогичного на данный момент? ODBC собирается передать ваш командный оператор исходному источнику, и если вы используете Sql Server сейчас, вместо Access, некоторые синтаксисы SQL будут изменены на вас.

В оставшейся части вопроса я предполагаю, что SQL, который у вас будет, будет работать, если он будет выполнен. Если окажется, что вам нужна помощь в преобразовании этого в T-SQL для SQL Server, откройте отдельный вопрос, ограниченный этой конкретной проблемой.

что из пути, я теперь собираюсь ограничить свою сферу с этим утверждением:

Мне нужно, чтобы иметь возможность обращаться к данным в связи ODBC и ... выходного конкретной dataset для конечного пользователя.

То, что вы хотите сделать, это поставить DataGridView контроль на форме (я буду использовать имя по умолчанию DataGridView1 на данный момент). Затем сделайте вид кода выглядеть следующим образом:

Imports System.Data.Odbc 
Imports System.Data.Odbc.OdbcCommand 
Imports System.Data.OleDb 

Public Class Form1 

    Private Property SLICWaveConnectionString As String = "Dsn=slic_wave;uid=userid;pwd=password" 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load 
     Dim sql As String = "SELECT DISTINCT Trim(EIACODXA),Trim(LSACONXB),Trim(ALTLCNXB),Trim(UOCSEIXC) FROM ALAV_XC" 
     Dim dt As New DataTable 
     Using cn As New OleDb.OleDbConnection(SLICWaveConnectionString), _ 
       cmd As New OleDb.OleDbCommand(sql, cn) 
       da As New OleDb.OleDbDataAdapter(cmd) 

       da.Fill(dt) 
     End Using 
     DataGridView1.DataSource = dt 
    End Sub 

End Class 
+0

У меня есть настройка соединения ODBC в Visual Studio в качестве поставщика данных .NET Framework для подключения ODBC и, похоже, работает нормально. Я не думаю, что у меня есть проблемы с тем, как данные поступают из этой связи. –

+0

Отлично! Вы посмотрели на вторую часть ответа, где я предлагаю ввести datagridview в форму? –

+0

Итак, вот что в DataGridView. Мне не нужно видеть данные в форме. Инструмент в основном массирует все данные и выплескивает новый набор данных, основанный на критериях. Это просто делает хруст данных, а затем отправляет их, поэтому мне никогда не нужно их видеть. Есть ли лучший способ сделать это без использования DataGridView? У меня есть куча модификаций, которые необходимо внести в данные, используя несколько разных таблиц и наборов данных, чтобы добраться до моего конечного результата. –

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