如何检索Access查询的查询定义(SQL文本)并存储更改后的定义?

本文关键字:查询 定义 存储 SQL Access 何检索 检索 文本 | 更新日期: 2023-09-27 18:19:23

我有一个要求,我需要在c#中读取Access DB查询,并检查Access DB查询是否有任何关键字,如"KEY",如果它有关键字,我需要将其括在方括号"[]"中。就像在SQL中那样。

谁能告诉我该怎么做?

如何检索Access查询的查询定义(SQL文本)并存储更改后的定义?

可以像这样检索查询文本:

string connString =  @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:'...'myDB.mdb";
using (var conn = new OleDbConnection(connString )) {
    conn.Open();
    string[] restrictions = new string[] { null, null, "myQuery" };
    DataTable schema = conn.GetSchema("Views", restrictions);
    if (schema.Rows.Count > 0) {
        DataRow row = schema.Rows[0];
        string queryText = (string)row["VIEW_DEFINITION"];
        Console.WriteLine(queryText);
    }
}

如果删除带有查询名称的constraints参数,conn.GetSchema("Views")将为每个查询返回一行。如果你查询conn.GetSchema("Procedures"),其他类型的查询,如插入,更新和DDL语句,不被认为是查询返回row["PROCEDURE_DEFINITION"]

视图(查询)名称在row["TABLE_NAME"]返回,过程名称在row["PROCEDURE_NAME"]返回。


你可以像这样更新查询:

using (var conn = new OleDbConnection(connString)) {
    conn.Open();
    var cmd = new OleDbCommand("DROP PROCEDURE myQuery", conn);
    cmd.ExecuteNonQuery();
    cmd = new OleDbCommand("CREATE PROCEDURE myQuery AS SELECT * FROM myTable", conn);
    cmd.ExecuteNonQuery();
}

奇怪的是,OleDb CREATE DDL(数据定义语言)将查询指定为'过程',但模式表返回'VIEW_DEFINITION',查询名称在列'TABLE_NAME'中返回。SELECT查询必须作为"视图"检索,其他类型的查询必须作为"过程"检索;但是,这两种类型都是作为procedure创建的。

当我测试@ Olivier Jacot-Descombes提供的答案时,我无法检索所有查询文本表示。因此,我应用了一些其他的方法,你打开现有的Ms Access数据库实例并读取存储在其中的查询。

下面是我使用的类:

public class MsAccess
{
    private Microsoft.Office.Interop.Access._Application _oAccess;
    public MsAccess(string path)
    {
        _oAccess = (Microsoft.Office.Interop.Access._Application)System.Runtime.InteropServices.Marshal.BindToMoniker(path);
    }
    public string ReturnSqlQueryText(string queryName)
    {
        string queryDef = null;
        var qdefs = _oAccess.CurrentDb().QueryDefs;
        foreach (QueryDef qdef in qdefs)
        {
            if(qdef.Name.Equals(queryName))
                queryDef = qdef.SQL;
        }
        return queryDef;
    }
}

使用此代码可能需要添加使用Microsoft.Office.Interop.Access.DaoMicrosoft.Office.Interop.Access(15.0.0.0),您可以在参考菜单

Extension下找到它们。