我有一个要求,我需要在c#中从Access DB读取查询,并检查访问数据库查询是否有任何关键字,如“KEY”,如果它有关键字,我需要将其括在方括号“[]”中。就像在SQL中完成它一样。
有人可以建议我怎么做吗?
答案 0 :(得分: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);
}
}
如果删除带有查询名称的restrictions参数,conn.GetSchema("Views")
将为每个查询返回一行。如果您在conn.GetSchema("Procedures")
中查询row["PROCEDURE_DEFINITION"]
其他类型的查询,例如插入,更新和不被视为查询的DDL语句。
在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”检索;但是,这两种类型都是作为PROCEDURE创建的。
答案 1 :(得分:2)
当我测试@ 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
下找到它们