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

标签 c# ms-access database-schema ddl

我有一个要求,我需要在 c# 中从 Access DB 读取查询,并检查 access db 查询是否有任何关键字,如“KEY”,如果它有关键字,我需要将其括在方括号中[]”。只是就像它是如何在 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);
    }
}

如果您删除带有查询名称的限制参数,conn.GetSchema("Views") 为每个查询返回一行。如果您查询 conn.GetSchema("Procedures") 其他类型的查询,例如不被视为查询的插入、更新和 DDL 语句,将在 row["PROCEDURE_DEFINITION"] 中返回>。

View (查询)名称在 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 查询必须作为“Views”检索,其他类型的查询作为“Procedures”;然而,这两种类型都是作为过程创建的。

关于c# - 如何检索 Access 查询的查询定义(SQL 文本)并存储回已更改的定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25486257/

相关文章:

sql - 不支持 3 个表的 JOIN 表达式

C#:映射 IDataReader.GetTableSchema() 和 DbType 枚举?

c# - Parallel.Foreach 会阻塞直到完成吗?

c# - 在运行时重新排列 WrapPanel 中的控件

java - 为什么我在连接 java 和 ms Access 时出错

ms-access - 为什么使用 postgresql odbc 驱动程序 Access 2010 会调用 IDENT_CURRENT?

postgresql - 每个客户数据库设计的模式注意事项是什么

ruby - 什么是贷款发放系统的良好模式设计?

c# - 使用 bool 参数从 C# 调用 Catalog.set_execution_parameter_value

c# - Excel 数据读取器问题、列名称和工作表选择