【发布时间】:2015-06-10 22:03:21
【问题描述】:
我正在使用 C# 连接到 access 数据库并检查该数据库中是否存在表。这是我正在使用的语法,但是对于其中有很多表的一些数据库,执行需要相当长的时间。由于速度是这个过程最重要的事情,他们是不是更快的方法?
string[] tableNames = new string[4] { "One", "Two", "Three", "Four" };
for (int q = tableNames.GetLowerBound(0); q <= tableNames.GetUpperBound(0); q++)
{
foreach (DAO.TableDef tabledef in dd.TableDefs)
{
string strtable = tableNames[q];
if (tabledef.Name == strtable) { found = true; }
if (found) { dd.TableDefs.Delete(strtable); }
}
}
对于任何可能偶然发现这一点的未来旅行者,这是我使用的最终语法 --- 指数级更快!!!
Last EDIT --- 我将 Execute 语句更改为封装在 try/catch 块中,就好像数组中列出的表名实际上不存在一样,它会引发错误。
System.Data.OleDb.OleDbConnection oleconn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + PathToDatabase" + ".mdb;");
oleconn.Open();
string[] tableNames = new string[4] { "One", "Two", "Three", "Four" };
for (int q = tableNames.GetLowerBound(0); q <= tableNames.GetUpperBound(0); q++)
{
System.Data.OleDb.OleDbCommand cmd = new OleDbCommand("DROP TABLE " + tableNames[q], oleconn);
try { cmd.ExecuteNonQuery(); }
catch {}
}
oleconn.Close();
【问题讨论】:
-
只需运行
DROP TABLE [Tablename],如果存在就会删除,否则什么都不做 -
为什么你不能写一个简单的查询来检查系统对象是否存在
-
@MethodMan 删除表已经检查实体是否存在,因此之前检查它是否存在是双重检查,因此不会更快。除非他打算在表存在或不存在时做一些特别的事情,否则检查只会减慢进程。
-
我知道@Franck,但基于不必要的迭代是我问这个的原因..
-
您知道您没有将发现的变量重置为假吗?在第一次匹配之后,任何后续表都将被删除。