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

Jay*_*man 2 c# ddl ms-access database-schema

我有一个要求,我需要在c#中从Access DB读取查询,并检查访问数据库查询是否有任何关键字,如"KEY",如果它有关键字我需要将其括在方括号"[]"中.就像它如何在SQL中完成.

有人可以建议我怎么做吗?

Oli*_*bes 5

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果使用查询名称删除restrictions参数,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();
}
Run Code Online (Sandbox Code Playgroud)

奇怪的是,OleDb CREATE DDL(数据定义语言)将查询指定为"过程",但架构表返回"VIEW_DEFINITION",并在"TABLE_NAME"列中返回查询名称.SELECT查询必须作为"Views"检索,其他类型的查询必须作为"Procedures"检索; 但是,这两种类型都创建为PROCEDURE.