2015-09-20 19 views
1

我正在使用c#和OdbcConnection連接到Access數據庫。在數據庫內部有一個我想運行的預定義查詢(就像Sql Server中的存儲過程)。過去,這是與舊的基於COM的ADO死很容易,但它似乎並沒有在ADO.net在ADO.NET中使用ODBC調用預定義的Access查詢

OdbcConnection conn = AccessConnect.Connect(); 
var cmd = conn.CreateCommand(); 
cmd.CommandText = @"MyAccessQuery;"; 
cmd.CommandType = CommandType.StoredProcedure; 
var da = new OdbcDataAdapter(cmd); 
var ds = new DataSet(); 
da.Fill(ds); 

工作有沒有捷徑可走的還是我將不得不重複我的Access查詢中C#代碼?

+0

'cmd.CommandText = @「select * from MyAccessQuery;」;「; cmd.CommandType = CommandType.Text;'不起作用? – rene

+1

爲什麼你不能使用OleConnection和OleDataAdapter的任何原因? – rene

+0

沒有兩個都給無效的sql錯誤 –

回答

2

Access ODBC(和OLEDB)接口將Access中保存的查詢顯示爲Views或Stored Procedures。它們如何暴露決定了它們可以被外部應用程序使用的方式。

在Access中保存的SELECT查詢不使用使用參數公開爲Views,因此它們可以像表一樣使用,例如,

string sql = "SELECT * FROM mySavedSelectQuery WHERE id <= 3"; 
using (var cmd = new OdbcCommand(sql, con)) 
{ 
    cmd.CommandType = System.Data.CommandType.Text; 
    using (var da = new OdbcDataAdapter(cmd)) 
    { 
     var dt = new System.Data.DataTable(); 
     da.Fill(dt); 
     Console.WriteLine("DataTable contains {0} row(s)", dt.Rows.Count); 
    } 
} 

其他類型的訪問保存的查詢公開爲存儲過程,所以需要使用ODBC {CALL ...}語法被調用,像這樣:

string sql = "{CALL mySavedParameterQuery (?)}"; 
using (var cmd = new OdbcCommand(sql, con)) 
{ 
    cmd.CommandType = System.Data.CommandType.StoredProcedure; 
    // set parameter values (if any) in the order that they appear 
    //  in the PARAMETERS list of the saved query 
    cmd.Parameters.Add("?", OdbcType.Int).Value = 3; 
    using (var da = new OdbcDataAdapter(cmd)) 
    { 
     var dt = new System.Data.DataTable(); 
     da.Fill(dt); 
     Console.WriteLine("DataTable contains {0} row(s)", dt.Rows.Count); 
    } 
} 

注意,在兩者的在上述情況下,與從外部應用程序(C#,VB.NET,Java等)針對Access數據庫的任何查詢一樣,都有一些限制。例如,某些Access內置函數可能不可用,並且保存的調用用戶定義函數(用VBA編寫)的Access查詢將無法通過直接的ODBC或OLEDB連接工作。

相關問題