通过 C# 和 SMO 检查和删除现有表
Posted
技术标签:
【中文标题】通过 C# 和 SMO 检查和删除现有表【英文标题】:Checking for and dropping an existing table via C# and SMO 【发布时间】:2010-10-30 00:36:12 【问题描述】:我正在尝试按名称查找 SQL 表,如果存在则删除它。这一切都需要在 C# 中使用 SMO 完成。
为了更复杂一点,该表还有一个除“dbo”之外的架构。
最终表格将通过 SMO 重新创建(我有这个工作),但我必须确保它不存在,然后才能重新创建它。
我看到的所有示例似乎都是在同一上下文中创建然后删除表。在我的情况下,该表将在之前的会话中创建和填充。
【问题讨论】:
【参考方案1】:第一个问题是,为什么不能使用 DDL 删除和重新创建?
回答你的问题:
Table table = new Table(myDatabase, "MyTable", "MySchema");
【讨论】:
感谢您的回答。我实际上走的是相同的路线,但路径不同: myTable.Schema = "MySchema" 表结构本身是通过解析 XML 模式动态确定的。【参考方案2】:难道您不能将您的 DROP TABLE 语句包装在一个 try/catch 块中,并丢弃发生的任何错误吗?
反正判断表是否存在的sql是:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TableName]') AND type in (N'U'))
【讨论】:
使用错误进行程序流控制与我的想法背道而驰。感谢您的回复。 好吧,如果您不喜欢 Try/Catch,您不能先使用我提供的 IF EXISTS 进行检查吗?【参考方案3】:var connection = new SqlConnection(connectionString);
var server = new Server(new ServerConnection(connection));
db = server.Databases["YourFavDB"];
db.Tables["YourHatedTable"].Drop();
【讨论】:
唯一一个回答这个问题的人,直到现在还没有一个赞成票。 SO有正义吗? 这里没有提到架构。根据您的环境,假设架构是 dbo 可能是完全合理的,也可能是危险的 好答案,我认为 DropIfExists() 会更好【参考方案4】:我认为最好的方法是:
Microsoft.SqlServer.Management.Smo.Database myDataBase = myServer.Databases["myDataBaseName"];
bool tableExists= myDataBase.Tables.Contains("myTable");
if (tableExists)
myDataBase.Tables["myTable"].Drop();
【讨论】:
这绝对应该是这个问题的公认答案。以上是关于通过 C# 和 SMO 检查和删除现有表的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# 中使用 SMO 使用 FILE STREAM 备份和恢复数据库