【问题标题】:Checking for and dropping an existing table via C# and SMO通过 C# 和 SMO 检查和删除现有表
【发布时间】:2010-10-30 00:36:12
【问题描述】:

我正在尝试按名称查找 SQL 表,如果存在则删除它。这一切都需要在 C# 中使用 SMO 完成。

为了更复杂一点,该表还有一个除“dbo”之外的架构。

最终表格将通过 SMO 重新创建(我有这个工作),但我必须确保它不存在,然后才能重新创建它。

我看到的所有示例似乎都是在同一上下文中创建然后删除表。在我的情况下,该表将在之前的会话中创建和填充。

【问题讨论】:

    标签: c# 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();
    }
    

    【讨论】:

    • 这绝对应该是这个问题的公认答案。
    猜你喜欢
    • 2012-07-30
    • 2012-03-07
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 2017-05-17
    相关资源
    最近更新 更多