在 ADO.NET 中使用 ODBC 调用预定义的 Access 查询
Posted
技术标签:
【中文标题】在 ADO.NET 中使用 ODBC 调用预定义的 Access 查询【英文标题】:Calling a pre-defined Access query using ODBC in ADO.NET 【发布时间】:2015-09-20 11:52:46 【问题描述】:我正在使用 c# 和 OdbcConnection
连接到 Access 数据库。在数据库内部有一个我想要运行的预定义查询(如 Sql Server 中的存储过程)。这对于旧的基于 COM 的 ADO 来说过去很容易,但它似乎在 ADO.net 中不起作用
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);
有没有办法解决它,还是我必须在 C# 代码中复制我的 Access 查询?
【问题讨论】:
cmd.CommandText = @"select * from MyAccessQuery;"; cmd.CommandType = CommandType.Text;
不起作用?
有什么理由不能使用 OleConnection 和 OleDataAdapter?
No both give invalid sql error
是的,它从我应该使用 OleDb 的地方复制了 Odbc 的东西。
您在 Access 中保存的查询是没有参数的简单 SELECT 查询吗?
【参考方案1】:
Access ODBC(和 OLEDB)接口将 Access 中保存的查询公开为视图或存储过程。它们的公开方式决定了它们可以被外部应用程序使用的方式。
使用 PARAMETERS 的 Access 中保存的 SELECT 查询被公开为视图,因此它们可以像表一样使用,例如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);
Access 中其他类型的已保存查询作为存储过程公开,因此需要使用 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 连接工作。
【讨论】:
以上是关于在 ADO.NET 中使用 ODBC 调用预定义的 Access 查询的主要内容,如果未能解决你的问题,请参考以下文章