結論から言うと、System.Data.OleDb と ADO で Microsoft Access に接続すると同等の処理ができます。元々、ADO で可能だった処理を System.Data.OleDb で可能かどうか確認し、System.Data.Odbc でとこまで同じ事が可能か試してみました。 結果的に、System.Data.Odbc では ODBC の動的接続では処理不可で、DSN を作成すると可能でした。 テスト用コード
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Odbc;
using System.Data.OleDb;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace OdbcAccessTest {
public partial class Form1 : Form {
// *************************************
// System.Data.Odbc
// *************************************
private OdbcConnection myCon;
private OdbcCommand myCommand;
private OdbcDataReader myReader;
// *************************************
// System.Data.OleDb
// *************************************
private OleDbConnection myConAccess;
// *************************************
// ADO
// *************************************
private dynamic objAdoCon;
public Form1() {
InitializeComponent();
}
// *************************************
// System.Data.Odbc で Access データの読み込み
// *************************************
private void button1_Click(object sender, EventArgs e) {
string myQuery = "SELECT * from 社員マスタ";
using (myCommand = new OdbcCommand()) {
// 実行する為に必要な情報をセット
myCommand.CommandText = myQuery;
myCommand.Connection = myCon;
using (myReader = myCommand.ExecuteReader()) {
// 読み出し
while (myReader.Read()) {
// 文字列
Console.Write(GetValue(myReader, "社員コード") + " : ");
Console.Write(GetValue(myReader, "氏名") + " : ");
Console.Write(GetValue(myReader, "フリガナ") + " : ");
// 整数
Console.Write(GetValue(myReader, "給与") + " : ");
Console.Write(GetValue(myReader, "手当") + " : ");
// 日付
Console.Write(GetValue(myReader, "作成日") + " : ");
Console.Write(GetValue(myReader, "更新日") + " : ");
Console.WriteLine();
}
myReader.Close();
}
}
}
// *************************************
// テスト用簡易列データ取得
// *************************************
private string GetValue(OdbcDataReader myReader, string p) {
string ret = "";
int fld = 0;
// 指定された列名より、テーブル内での定義順序番号を取得
fld = myReader.GetOrdinal(p);
// 定義順序番号より、NULL かどうかをチェック
if (myReader.IsDBNull(fld)) {
ret = "";
}
else {
// NULL でなければ内容をオブジェクトとして取りだして文字列化する
ret = myReader.GetValue(fld).ToString();
}
// 列の値を返す
return ret;
}
// *************************************
// 接続処理
// *************************************
private void Form1_Load(object sender, EventArgs e) {
// *************************************
// System.Data.Odbc
// *************************************
OdbcConnectionStringBuilder builder = new OdbcConnectionStringBuilder();
builder.Driver = "Microsoft Access Driver (*.mdb, *.accdb)";
builder.Add("dbq", @"C:\tmp\販売管理C.accdb");
// 内容を確認
Console.WriteLine(builder.ConnectionString);
// 新しい OdbcConnection オブジェクトを作成
myCon = new OdbcConnection();
// 接続文字列を設定
myCon.ConnectionString = builder.ConnectionString;
// 接続を開く
try {
myCon.Open();
}
catch (OdbcException ex) {
MessageBox.Show(this, "接続エラーです:" + ex.Message);
}
// *************************************
// System.Data.OleDb
// *************************************
myConAccess = new OleDbConnection();
myConAccess.ConnectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};", @"C:\tmp\販売管理C.accdb");
// 接続を開く
try {
myConAccess.Open();
}
catch (Exception ex) {
MessageBox.Show(this, "接続エラーです:" + ex.Message);
}
// *************************************
// ADO
// *************************************
objAdoCon = Activator.CreateInstance(Type.GetTypeFromProgID("ADODB.Connection"));
string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\tmp\001\販売管理C.accdb;";
try {
objAdoCon.Open(connectionString);
}
catch (Exception ex) {
MessageBox.Show(this, ex.Message);
}
}
// *************************************
// 接続解除
// *************************************
private void Form1_FormClosed(object sender, FormClosedEventArgs e) {
myCon.Close();
myConAccess.Close();
objAdoCon.Close();
}
// *************************************
// System.Data.OleDb
// *************************************
private void button2_Click(object sender, EventArgs e) {
string myQuery;
myQuery = @"select * into [Excel 8.0;DATABASE=c:\tmp\販売管理C.xls].商品マスタ_OleDb from 商品マスタ";
//myQuery = @"select * into [Excel 12.0 xml;DATABASE=c:\tmp\販売管理C.xlsx].商品マスタ_OleDb from 商品マスタ";
//myQuery = @"select * into [;DATABASE=C:\tmp\データベース1.accdb].商品マスタ_OleDb from 商品マスタ";
//myQuery = @"select * into [;DATABASE=C:\tmp\データベース1.mdb].商品マスタ_OleDb from 商品マスタ";
//myQuery = @"select * into [ODBC;DSN=SQS64;Database=lightbox;UID=sa;PWD=password].商品マスタ_OleDb from 商品マスタ";
//myQuery = @"select * into [ODBC;DSN=SQS32;Database=lightbox;UID=sa;PWD=password].商品マスタ_OleDb from 商品マスタ";
//myQuery = @"select * into [ODBC;DSN=MYSQL32;Database=lightbox;UID=root;PWD=password].商品マスタ_OleDb from 商品マスタ";
//myQuery = @"select * into [ODBC;Driver={SQL Server Native Client 11.0};server=layla;database=lightbox;uid=sa;pwd=password].商品マスタ_OleDb from 商品マスタ";
//myQuery = @"select * into [ODBC;Driver={MySQL ODBC 5.3 Unicode Driver};server=layla;database=lightbox;uid=root;pwd=password].商品マスタ_OleDb from 商品マスタ";
using (OleDbCommand myCommand = new OleDbCommand()) {
// *********************
// 接続
// *********************
try {
// コマンドオブジェクトに接続をセット
myCommand.Connection = myConAccess;
myCommand.CommandText = myQuery;
myCommand.ExecuteNonQuery();
}
catch (Exception ex) {
MessageBox.Show(this, ex.Message);
}
}
}
// *************************************
// System.Data.Odbc
// *************************************
private void button3_Click(object sender, EventArgs e) {
string myQuery;
myQuery = @"select * into [Excel 8.0;DATABASE=c:\tmp\販売管理C.xls].商品マスタ_Odbc from 商品マスタ";
//myQuery = @"select * into [Excel 12.0 xml;DATABASE=c:\tmp\販売管理C.xlsx].商品マスタ_Odbc from 商品マスタ";
//myQuery = @"select * into [;DATABASE=C:\tmp\データベース1.accdb].商品マスタ_Odbc from 商品マスタ";
//myQuery = @"select * into [;DATABASE=C:\tmp\データベース1.mdb].商品マスタ_Odbc from 商品マスタ";
//myQuery = @"select * into [ODBC;DSN=SQS64;Database=lightbox;UID=sa;PWD=password].商品マスタ_Odbc from 商品マスタ";
//myQuery = @"select * into [ODBC;DSN=SQS32;Database=lightbox;UID=sa;PWD=password].商品マスタ_Odbc from 商品マスタ";
//myQuery = @"select * into [ODBC;DSN=MYSQL32;Database=lightbox;UID=root;PWD=password].商品マスタ_Odbc from 商品マスタ";
using (myCommand = new OdbcCommand()) {
try {
// コマンドオブジェクトに接続をセット
myCommand.Connection = myCon;
myCommand.CommandText = myQuery;
myCommand.ExecuteNonQuery();
}
catch (Exception ex) {
MessageBox.Show(this, ex.Message);
}
}
}
// *************************************
// ADO を使う場合
// *************************************
private void button4_Click(object sender, EventArgs e) {
string myQuery;
myQuery = @"select * into [Excel 8.0;DATABASE=c:\tmp\販売管理C.xls].商品マスタ_ADO from 商品マスタ";
//myQuery = @"select * into [Excel 12.0 xml;DATABASE=c:\tmp\販売管理C.xlsx].商品マスタ_ADO from 商品マスタ";
//myQuery = @"select * into [;DATABASE=C:\tmp\データベース1.accdb].商品マスタ_ADO from 商品マスタ";
//myQuery = @"select * into [;DATABASE=C:\tmp\データベース1.mdb].商品マスタ_ADO from 商品マスタ";
//myQuery = @"select * into [ODBC;DSN=SQS64;Database=lightbox;UID=sa;PWD=password].商品マスタ_ADO from 商品マスタ";
//myQuery = @"select * into [ODBC;DSN=SQS32;Database=lightbox;UID=sa;PWD=password].商品マスタ_ADO from 商品マスタ";
//myQuery = @"select * into [ODBC;DSN=MYSQL32;Database=lightbox;UID=root;PWD=password].商品マスタ_ADO from 商品マスタ";
//myQuery = @"select * into [ODBC;Driver={SQL Server Native Client 11.0};server=layla;database=lightbox;uid=sa;pwd=password].商品マスタ_ADO from 商品マスタ";
//myQuery = @"select * into [ODBC;Driver={MySQL ODBC 5.3 Unicode Driver};server=layla;database=lightbox;uid=root;pwd=password].商品マスタ_ADO from 商品マスタ";
try {
objAdoCon.Execute(myQuery);
}
catch (Exception ex) {
MessageBox.Show(this, ex.Message);
}
}
}
}
ここでは、into 側の表で使用していますが、from 側の表でも使用できるはずです。エクスポートは高速で実行されますが、キーの定義はエクスポートされないので、後から定義する必要があります。 SQL 一覧
@"select * into [Excel 8.0;DATABASE=c:\tmp\販売管理C.xls].商品マスタ_ADO from 商品マスタ";
@"select * into [Excel 12.0 xml;DATABASE=c:\tmp\販売管理C.xlsx].商品マスタ_ADO from 商品マスタ";
@"select * into [;DATABASE=C:\tmp\データベース1.accdb].商品マスタ_ADO from 商品マスタ";
@"select * into [;DATABASE=C:\tmp\データベース1.mdb].商品マスタ_ADO from 商品マスタ";
@"select * into [ODBC;DSN=SQS64;Database=lightbox;UID=sa;PWD=password].商品マスタ_ADO from 商品マスタ";
@"select * into [ODBC;DSN=SQS32;Database=lightbox;UID=sa;PWD=password].商品マスタ_ADO from 商品マスタ";
@"select * into [ODBC;DSN=MYSQL32;Database=lightbox;UID=root;PWD=password].商品マスタ_ADO from 商品マスタ";
@"select * into [ODBC;Driver={SQL Server Native Client 11.0};server=layla;database=lightbox;uid=sa;pwd=password].商品マスタ_ADO from 商品マスタ";
@"select * into [ODBC;Driver={MySQL ODBC 5.3 Unicode Driver};server=layla;database=lightbox;uid=root;pwd=password].商品マスタ_ADO from 商品マスタ";
外部参照部分一覧
[Excel 8.0;DATABASE=c:\tmp\販売管理C.xls].テーブル名
[Excel 12.0 xml;DATABASE=c:\tmp\販売管理C.xlsx].テーブル名
[;DATABASE=C:\tmp\データベース1.accdb].テーブル名
[;DATABASE=C:\tmp\データベース1.mdb].テーブル名
[ODBC;DSN=SQS64;Database=lightbox;UID=sa;PWD=password].テーブル名
[ODBC;DSN=SQS32;Database=lightbox;UID=sa;PWD=password].テーブル名
[ODBC;DSN=MYSQL32;Database=lightbox;UID=root;PWD=password].テーブル名
[ODBC;Driver={SQL Server Native Client 11.0};server=layla;database=lightbox;uid=sa;pwd=password].テーブル名
[ODBC;Driver={MySQL ODBC 5.3 Unicode Driver};server=layla;database=lightbox;uid=root;pwd=password].テーブル名
Excel と Microsoft Access は特殊ですが、ODBC は同じ書式なので他の DB にも使用可能なはずです。接続パラメータは、実際 DSN を作成してから、レジストリを見れば必要なものが全て書かれています。 ▼ エクスポートでは使えませんが、以下は Excel を ODBC で定義した場合の例ですPHP で ODBC 接続するとなると、上記データを使って以下のようになります
$ms_excel = "./data/syain.xls";
$ms_excel = realpath($ms_excel);
$excel_dir = dirname($ms_excel);
$connect_string = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};dbq={$ms_excel};DefaultDir={$excel_dir};FIL=Excel 8.0;DriverID=790";$user="";$pass="";
|
|
【VS(C#)の最新記事】
- Replit : cs-list
- C# : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する
- C#( Form ) : ウインドウ枠の無い吹き出しの作成
- C# のタプル( Visual Studio 2017 でテスト )
- C# : インターネット上の JSON ファイルのフォーマットを クラスとして定義して1行でオブジェクト化して使用する
- C# の文法的文字列処理
- C# : System.Data.Odbc によるデータベースのテーブルからのデータ取得処理( サンプルの SQL は MySQL 用です )
- C# : Excel を データベースとして DataGridView に読み込む
- C# : dynamic 型 による Excel へのアクセス
- C# : フォームを表示せずに、通知領域にアイコンを表示させる常駐プログラム
- Microsoft Access に対してSQLを入力してその結果を DataGridView に表示する最も簡単なコード
- C# : System.Data.Odbc データ取得(SELECT)処理( MySQL ) : ※ using 無し( Dispose 実行 )
- C# : SQL 文を外部テキストにして、String.Format でデータ部分を置き換えて利用する
- C# コンソールアプリを AN HTTPD で実行
- C# : SQLServer( SQLExpress ) の SMO を使用してテーブルの CREATE TABLE 文 を取得する
- C# : DataGridView に TKMP.DLL の IMAP(POP3) で受信したメールを非同期に表示する( 添付ファイルも取得 )
- C# : TKMP.DLLを使った、メール送信テンプレート
- C# と VB.net : TKMP.DLL を使って IMAP でメール本文の一覧を取得する( コンソール )
- C# でDataTable と DataSource を使用して、DataGridView にデータを表示するテンプレート( 行をダブルクリックしてダイアログを表示して行データを処理 )
- (C#) / VS2010 または VS2012 : TKMP.DLL(3.1.2 または 3.1.8)を使った、『さくらインターネット』用メール送信テンプレート


PHP で ODBC 接続するとなると、上記データを使って以下のようになります




