删除表的最快方法(如果存在)
Posted
技术标签:
【中文标题】删除表的最快方法(如果存在)【英文标题】:Fastest Way To Delete Table (If Exists) 【发布时间】: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,但基于不必要的迭代是我问这个的原因..
您知道您没有将发现的变量重置为假吗?在第一次匹配之后,任何后续表都将被删除。
【参考方案1】:
反转循环(伪代码):
foreach (DAO.TableDef tabledef in dd.TableDefs)
if (tabledef.Name in tablearray )
dd.TableDefs.Delete(strtable);
【讨论】:
【参考方案2】:我认为与其检查 C# 应用程序,不如使用您的 ado.net 运行以下查询。
IF OBJECT_ID (N'mytablename', N'U') IS NOT NULL
DROP TABLE 'mytablename'
因为它会在您使用 ado.net 时加载元数据,而不是使用执行非查询执行简单查询。
【讨论】:
我不知道 OBJECT_ID 和该语法可以用于 MS-Access 数据库。但考虑到发帖人接受了你的回答,那我可能错了。 (cc: @Steve) 这是 T-SQL 代码。它不适用于 Access SQL。 @GordThompson Uhm 疑似【参考方案3】:您可以使用Drop Table
删除表。
它的语法是
if exists (select * from login where name = 'prishu' and pass='prishu')
drop table login
更多信息请使用link
检查this link also
【讨论】:
我们谈论的是 MS-Access 数据库。你试过那个语法吗?以上是关于删除表的最快方法(如果存在)的主要内容,如果未能解决你的问题,请参考以下文章