【问题标题】:Calling a pre-defined Access query using ODBC in ADO.NET在 ADO.NET 中使用 ODBC 调用预定义的 Access 查询
【发布时间】: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 查询吗?

标签: c# ms-access ado.net


【解决方案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 连接工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    相关资源
    最近更新 更多