【问题标题】:C# checking if a table exists in a database or notC#检查数据库中是否存在表
【发布时间】:2014-09-30 11:24:23
【问题描述】:

我在 SQL Server 2008 的同一个数据库中有两个表。我想将一个表的内容复制到另一个具有相同架构的空表,但是当我执行语句时

OleDbDataAdapter da = new OleDbDataAdapter("select * into dbo.leadmastersnew from dbo.leadmasters", myConnection);

它会抛出一个错误,指出该表已存在于数据库中。

我希望如果表已经存在,应该删除表,因为上面的 SQL 查询创建了表并将内容复制到它。

请推荐

我的代码是

private void button5_Click(object sender, EventArgs e)
{
     OleDbConnection myConnection = new OleDbConnection("File Name=E:\\Vivek\\ImplementUdl\\ImplementUdl\\new.udl");

     try
     {
         myConnection.Open();

         if (myConnection.State == ConnectionState.Open)
            MessageBox.Show("Connection opened successfully!");
         else
            MessageBox.Show("Connection could not be established");

         DataSet ds = new DataSet();

         OleDbDataAdapter da = new OleDbDataAdapter("select * into dbo.leadmastersnew from dbo.leadmasters", myConnection);

         da.Fill(ds);

         MessageBox.Show("Data Copied!!");
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message);
     }
     finally
     {
           myConnection.Close();
     }

     return;
}

【问题讨论】:

  • 为什么不使用临时表而不是真实表?即dbo.#leadmastersnew。它将仅在您的连接范围内可见,并在连接关闭时自动删除。
  • @AndyKorneyev 好主意,但我该如何实现它。?我是 C# 新手
  • 正如我上面提到的 - 你应该只是表名前面有#,例如dbo.#leadmastersnew。顺便说一句 - 这不是 c# 功能,而是 sql server 的功能。
  • @AndyKorneyev 感谢您的回复。但是如果表已经存在并且我想在不删除表的情况下向其中添加数据该怎么办?这只是另一个疑问。希望你不介意
  • 但是,如果您不想使用临时表,而只想插入现有表而不删除它 - 您应该使用类似 insert into dbo.leadmastersnes (column1, column2 etc...) select value1, value2 etc... from dbo.leadmasters 而不是查询,因为 select ... into tablexxx 隐式创建tablexxx 表。

标签: c# sql sql-server-2008


【解决方案1】:

如果它还不存在,我会创建一个空表,然后复制数据。如果可能,不要使用 udl 文件进行连接,而是将连接字符串存储在别处

using(var conn = new SqlConnection("<connectionstring>"))
using(var cmd = new SqlCommand(@"
                if object_id('dbo.leadmastersnew') is null
                  begin
                      select * into dbo.leadmastersnew from dbo.leadmasters where 1=2
                      alter table dbo.leadmastersnew add primary key (<key>)
                  end
                insert into dbo.leadmastersnew
                select * 
                from dbo.leadmasters lm
                where not exists(select * from dbo.leadmastersnew lmn where lm.<key> = lmn.<key>)", conn))
{
    conn.Open();
    cmd.ExecuteNonQuery();
}

请注意,在 where 子句中,您需要填写正确的 &lt;key&gt; 列。我还在新表中添加了主键约束,因为 select into 不会复制源表的主键/索引。

【讨论】:

    【解决方案2】:

    我倾向于在一条 SQL 语句中完成所有操作:

    IF OBJECT_ID(N'dbo.leadmastersnew', 'U') IS NOT NULL
        DROP TABLE dbo.leadmastersnew;
    
    SELECT  * 
    INTO    dbo.leadmastersnew 
    FROM    dbo.leadmasters;
    

    【讨论】:

    • 感谢您的回复。但是如果表已经存在并且我想在不删除表的情况下向其中添加数据怎么办?这只是另一个疑问。希望您不要介意跨度>
    【解决方案3】:

    要回答为什么 SQL 不起作用的实际问题,您收到错误的原因是因为您有以下情况:

    select * into dbo.leadmastersnew from dbo.leadmasters
    

    SQL 将其解释为创建表 leadmastersnew 的命令,然后填充它。如果您打算使用现有的解决方案,只需将 SQL 更改为以下内容:

    if object_id('dbo.leadmastersnew') is not null begin drop table dbo.leadmastersnew end select * into dbo.leadmastersnew from dbo.leadmasters
    

    这将测试该表是否存在,如果存在则删除它,然后再次创建并填充该表。这不是一种非常干净的做事方式,但如果这是你想要的,那么它会做到这一点。

    【讨论】:

      【解决方案4】:

      这个查询可能会解决您的问题

      EXISTS (SELECT * 
                       FROM INFORMATION_SCHEMA.TABLES 
                       WHERE TABLE_SCHEMA = 'TheSchema' 
                       AND  TABLE_NAME = 'TheTable'))
      

      之后,如果它返回 True 则表存在。现在您需要运行插入查询

      String query = "INSERT INTO dbo.The_table(id,username,password,email) VALUES(@id,@username,@password, @email)";
      
      SqlCommand command = new SqlCommand(query, db.Connection);
      command.Parameters.Add("@id","abc");
      command.Parameters.Add("@username","abc");
      command.Parameters.Add("@password","abc");
      command.Parameters.Add("@email","abc");
      
      command.ExecuteNonQuery();
      

      如果原始语句返回 false,您需要在运行插入查询之前运行创建表查询。创建表查询看起来很像这样。

      string queryString =  @"
      CREATE TABLE MyTable
      (
         Id  int IDENTITY(1,1) PRIMARY KEY CLUSTERED,
         Name        varchar(50) 
      )";
      
      
          SqlCommand command = new SqlCommand(
              queryString, connection);
      
          command.ExecuteNonReader();
      

      【讨论】:

      • 感谢您的回复。但是如果表已经存在并且我想在不删除表的情况下向其中添加数据怎么办?这只是另一个疑问。希望您不要介意跨度>
      • 您想清空它并添加新数据或附加数据吗?
      • @user2614235 您的具体要求是什么?如果表存在,将其清空并添加新数据?或者如果表存在插入我拥有的这个新数据,同时还保留旧数据?
      • John 如果表存在,第二个。我想在那个表中插入数据
      • 您可以简单地运行第一个查询,检查它是否存在,然后运行第二个查询,将数据插入到现有表中。你想让我用 INSERT 查询编辑我的答案吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-26
      • 1970-01-01
      • 2021-05-24
      • 2015-06-18
      • 2012-01-09
      • 2012-01-08
      • 1970-01-01
      相关资源
      最近更新 更多