2016-10-17 18 views
1

少し背景を先にしてください。私が働いているところでは、プログラミングツールへのアクセスが制限されています。私たちはMicrosoft Officeスイートにアクセスすることができます。したがって、より良いソリューションがあるにもかかわらず、ほとんどのプロジェクトはAccessで作成されます。私たちは最近、Visual Studio 2013へのアクセス権を取得しました。私はより多くのツールをVB.NETプロジェクトに変換することに興味があります。ODBC接続のデータをMS Accessデータベースに選択してください

私はVBAを長年使ってきたことをよく理解していますが、VB.NETへの変換は間違いなく変化しています。私はそれを理解していますが、 VB.NETに存在します。

私は次の質問につながります。

1つのデータベース、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を実行して必要に応じてデータを移動できますが、その贅沢を持っています。おそらく、私はVisual Studioに関する知識が不足しているため、このすべてが間違っていると思います。

私の最終目標を達成するより良い方法はありますか? ODBC接続のデータを参照してどこかに格納して、特定のデータセットをエンドユーザーに出力できるようにする必要があります。 DataSetまたはDataTableを使用することはできますか?プログラムが不安定になる前に、どのくらいのデータをDataSet/DataTableに保存できますか?このプロセスで使用されるデータは、時には非常に過度になる可能性があります。

通常、ユーザーはツールに4フィールドまたは5フィールドのデータを含むいくつかの基準を送信します。このツールは、約5〜7テーブルのジョインを使用して、ODBC接続データベースから適切なデータセットを取得するためにその基準を取得し、その基準を取得し、1組のデータをユーザーに返します。はい、少し余計ですが、それが必要です。

あまりにも一般的でなくてもこれを十分に説明したいと思います。私のビジネスの性質上、具体的な事例を提供することができません。

申し訳ありませんが、私はこの問題を解決するのに役立つ努力を感謝します。明確にする必要があるものがあれば教えてください。私はそれをより明確に説明しようとします。

+0

一度に扱う行の数はいくつですか? – Plutonix

+0

それはさまざまですが、全体的に見て、私が引っ張っているデータベースは大規模で、何百万ものレコードであり、時にはテーブル全体をプルする必要があります。 –

+0

2つのテーブルがデータベースに保存されている場合、なぜ更新やクエリへの挿入が機能しないのかわかりません。問題は、データソースが2つの異なるデータベースである場合です。 –

答えて

1

をあなたは参考にあなたが.NETアプリケーションからAccessデータベースエンジンに対してクエリを実行すると、あなたのクエリでODBCの参照を使用してできることを認識するかもしれませんエンジンが必要なODBC接続を実行します。実際には、これらは、その特定のクエリ用に作成された一時的な「オンザフライ」ODBCリンクテーブルです。

たちは

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

SQL Serverで[製品]という名前のテーブルを持っており、私たちは "MYDB" という名前のODBC DSNを経由しているSQL Serverインスタンスに達することができると言います。私たちは、名前のAccessテーブル[受注]

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

を照会し、SQLからの製品名で引っ張るしたい場合我々は、例えば、

[ODBC;DSN=myDb].[product] 

ようにAccessクエリからそのテーブルを参照することができます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 
01を印刷します
+0

Gord、これは私がそれを知らなかったので非常に有益な情報です。また、mmm、ベーコン!私は現在、2つのデータベースのテーブルにまだ参加しようとはしていませんが、私はそうするでしょう。私は、プロジェクト内であろうとアクセスデータベース内であろうと、ODBC接続から別のデータセットにデータを取得する必要があります。 –

+0

[ODBC; DSN = myDb]を他のものに短縮する方法はありますか? conn = New OdbcConnection( "Dsn = slic_wave; uid = username; pwd = password")と宣言された接続を作成したとします。私はまだVB.NETの仕組みの多くを学んでいるので、私の無知を許してください。 –

+0

いいえ、アクセスデータベースエンジンは、どのように構成されているか分からないため、別の.NET OdbcConnectionへの参照は機能しません。あなたの目標がODBCデータソースを照会し、結果をExcelにダンプすることで、既にAccessが広く配備されている場合は、Accessでジョブを実行することをお勧めします。特にExcelのエクスポートを行うためにAccessのCOMオートメーションを使用した場合、VB.NETアプリケーションを使用することに大きな利点はありません。 (はい、すべてのことが代わりに.NETで行うことができますが、それはアクセスの質問ではありません。) –

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 
+0

Visual StudioでODBC接続用の.NET FrameworkデータプロバイダとしてODBC接続をセットアップしていて、正常に動作しているようです。私は、その接続からデータが出てくる方法に問題があるとは思わない。 –

+0

素晴らしい!答えの第2部を見てきました。ここで、データグリッドビューをフォームに挿入することをお勧めしますか? –

+0

ここで、DataGridViewについて説明します。私はフォーム上のデータを見る必要はありません。このツールは基本的にすべてのデータをマッサージし、その基準に基づいて新しいデータセットを吐き出します。それはちょうどいくつかのデータを処理して、それを送信しているので、私はそれを見る必要はありません。 DataGridViewを使用せずにこれを行うより良い方法はありますか?私は最終結果に到達するために、複数の異なるテーブルとデータセットを使用してデータに変更する必要があります。 –