通过 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# 检查 MS Access 报告中现有标签的宽度

将现有数据库加入可用性组

SMO 等效于 SET HADR OFF

如何在 C# 中使用 SMO 使用 FILE STREAM 备份和恢复数据库

无法通过 C# 中的 OleDB 从 Microsoft Access 中删除表的所有行

通过 django 将 db 与现有表同步以获取现有模式表,并自动更新表的几列和其余列