从ODBC连接中选择数据到MS Access数据库

时间:2016-10-17 16:05:06

标签: vb.net ms-access

首先是一点背景。在我工作的地方,我们只能有限地使用编程工具。我们可以访问Microsoft Office套件,因此我们的大多数项目都是在Access中创建的,即使有更好的解决方案。我们最近获得了访问Visual Studio 2013的权限,我有兴趣将一些使用较多的工具转换为VB.NET项目。

使用它多年后我对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连接和后端Access数据库中的表,然后我可以使用DoCmd运行SQL来根据需要移动数据,但是使用VB.NET我不会这样做。有这种奢侈。也许由于我对Visual Studio缺乏了解,我认为这一切都是错误的。

有没有更好的方法来实现我的最终目标?我需要能够引用ODBC连接中的数据,然后将其存储在某处,以便我可以将特定数据集输出到最终用户。可以/我应该使用DataSet还是DataTable?在程序变得不稳定之前,DataSet / DataTable中可以存储多少数据?这个过程中使用的数据有时会非常过分。

通常,用户会向工具发送一些标准,其中包含4或5个字段的数据。然后,该工具将转向并采用该条件,使用约5到7个表上的连接从ODBC连接的数据库中获取正确的数据集,并将一组数据返回给用户。是的,它有点过分,但这是要求。

我希望我能够很好地解释这一点,而不是太一般。我的业务性质阻止提供具体的例子。

很抱歉被纵横,我感谢任何帮助我解决这个问题的努力。如果有任何需要澄清的内容,请告诉我,我会尝试更清楚地解释一下。

3 个答案:

答案 0 :(得分:1)

您可能会发现,当您从.NET应用程序对Access数据库引擎运行查询时,可以在查询中使用ODBC引用,并且引擎将为您执行所需的ODBC连接。实际上,这些是为该特定查询创建的临时“动态”ODBC链接表。

假设我们在SQL Server中有一个名为[product]的表

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

我们可以通过名为“myDb”的ODBC DSN访问该SQL Server实例。我们可以从Access查询中引用该表作为

[ODBC;DSN=myDb].[product]

因此,例如,如果我们要查询名为[Orders]

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

并从名为[product]的SQL Server表中提取产品名称,我们可以在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

答案 1 :(得分:0)

首先,我需要询问SLICWave ODBC连接的原始来源。它仍然在Access中,或者您是否正在从Sql Server或类似的东西中提取? ODBC将把命令语句传递给原始源,如果您现在使用的是Sql Server,而不是Access,那么一些SQL语法将会改变。

对于问题的其余部分,我假设您执行的SQL将会起作用。如果事实证明您需要帮助将其转换为SQL Server的T-SQL,请打开一个仅限于该特定问题的单独问题。

这样,我现在要限制我的范围:

  

我需要能够引用ODBC连接中的数据并...将特定数据集输出到最终用户。

您要做的是在表单上添加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

答案 2 :(得分:0)

Imports System.Data.OleDb

Public Class Form1

    Public con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\stores\Stock.accdb")
  
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        con.Open()
        Dim sql As String = "SELECT * FROM Stock"
        Dim dt As New DataTable
        Dim cmd As New OleDbCommand(sql, con)
        Dim da As New OleDbDataAdapter(cmd)
        da.Fill(dt)
        DGV.DataSource = dt
        con.Close()
    End Sub

End Class