首先是一点背景。在我工作的地方,我们只能有限地使用编程工具。我们可以访问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连接的数据库中获取正确的数据集,并将一组数据返回给用户。是的,它有点过分,但这是要求。
我希望我能够很好地解释这一点,而不是太一般。我的业务性质阻止提供具体的例子。
很抱歉被纵横,我感谢任何帮助我解决这个问题的努力。如果有任何需要澄清的内容,请告诉我,我会尝试更清楚地解释一下。
答案 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