2012-01-20 7 views
1

C#文字列としてMicrosoft Accessクエリの結果を引き出し:そうように私は、C#からMicrosoft Accessを自動化しています

using Microsoft.Office.Interop.Access; 

static void Main(string[] args) 
{ 
    Application ap = new Application(); 

    ap.OpenCurrentDatabase("C:\\location.accdb", true); 
    ap.DoCmd.WhateverIFeelLike(); 
    ap.CloseCurrentDatabase(); 
} 

は私がここでやりたいことはアクセス内に保存された選択クエリのいずれかとリターンを実行していますこの値は、文字列配列または文字列配列のいずれかです。

は、私はこのような何かしたい:

string[] myQueryResult = ap.DoCmd.OpenQuery("qryFoo"); 

は明らかにこれは動作しませんが、私が探していますこの種のもの。回避策として、クエリ結果をCSVファイルにエクスポートし、Filehelpersを使用してこれをC#の配列にインポートすることを考えていますが、もっと直接的なルートがあることを祈ってここで最初に質問しました。

ありがとうございました

+0

がhttp://stackoverflow.com/questions/1458786/how-to-programmatically-retrieve-query-を見てみましょう、アクセス相互運用機能を必要としません全文のテキスト。 –

答えて

2

OleDbを使用する可能性があります。 64ビットマシンでは、プラットフォームのターゲットとして "x86"を使用してプロジェクトを構築する必要があります。これは、Jetドライバが32ビットであるためです。これが機能するために

const string DatabasePath = @"C:\DbPath\MyDatabase.mdb"; 
const string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + 
           DatabasePath; 

using (OleDbConnection cnn = new OleDbConnection(ConnectionString)) { 
    string query = "SELECT * FROM qryFoo"; 
    using (OleDbCommand cmd = new OleDbCommand(query, cnn)) { 
     cnn.Open(); 
     using (OleDbDataReader reader = cmd.ExecuteReader()) { 
      int employeeIdOrdinal = reader.GetOrdinal("EmployeeID"); 
      int nameOrdinal = reader.GetOrdinal("Name"); 
      int salaryOrdinal = reader.GetOrdinal("Salary"); 
      while (reader.Read()) { 
       Console.WriteLine("EmployeeID = {0}", reader.GetInt32(employeeIdOrdinal)); 
       Console.WriteLine("Name = {0}", reader.GetString(nameOrdinal)); 
       if (!reader.IsDBNull(salaryOrdinal)) { 
        Console.WriteLine("Salary = {0}", reader.GetDouble(salaryOrdinal)); 
       } 
       Console.WriteLine("---------------"); 
      } 
     } 
    } 
} 

ただしusing System.Data.OleDb;

+0

これはまさに私が探していたものです、ありがとう=) – JMK

関連する問題