如何检索Access查询的查询定义(SQL文本)并存储更改后的定义?
本文关键字:查询 定义 存储 SQL Access 何检索 检索 文本 | 更新日期: 2023-09-27 18:19:23
我有一个要求,我需要在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);
}
}
如果删除带有查询名称的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.Dao
和Microsoft.Office.Interop.Access
(15.0.0.0),您可以在参考菜单
Extension
下找到它们。