在 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 查询的主要内容,如果未能解决你的问题,请参考以下文章

Ado.NET SqlDataReader详解

ado.net总结

ado.net简介

ado.net是啥意思?

ssis

如何将参数传递给 ssis 中的 ado.net 源?