2014-09-30 5 views
1

У меня есть две таблицы в одной базе данных в SQL Server 2008. Я хочу скопировать содержимое таблицы в другую пустую таблицу с той же схемой, но когда я выполняю операторПроверка C#, если таблица существует в базе данных или нет

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; 
} 
+2

Почему бы вам не использовать временную таблицу вместо реальной? то есть 'dbo. # leadmastersnew'. Он будет виден только в рамках вашего подключения и автоматически опускается при закрытии соединения. –

+0

@ AndyKorneyev Хорошая идея, но как ее реализовать? Я новичок в C# – user2614235

+0

Как я уже упоминал выше - вы должны просто использовать имя таблицы, предшествующее '#', например, 'dbo. # Leadmastersnew'. Кстати, это не функция C#, а сервер sql. –

ответ

1

я был бы склонен просто сделать все это в одном операторе SQL:

IF OBJECT_ID(N'dbo.leadmastersnew', 'U') IS NOT NULL 
    DROP TABLE dbo.leadmastersnew; 

SELECT * 
INTO dbo.leadmastersnew 
FROM dbo.leadmasters; 
+0

Спасибо за ответ. Но что делать, если таблица уже существует, и я хочу добавить к ней данные без удаления таблицы? Это просто еще одно сомнение .Надеюсь, что вы не возражаете – user2614235

1

Решение вашей проблемы может быть с данным запросом

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

После этого, если он возвращает True, таблица существует. Теперь вам нужно запустить вставку Query

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(); 

Если исходный оператор возвращает ложным вам необходимо запустить создание запроса таблицы до запроса запущенных вставок. Запрос на создание таблицы выглядит примерно так.

string queryString = @" 
CREATE TABLE MyTable 
(
    Id int IDENTITY(1,1) PRIMARY KEY CLUSTERED, 
    Name  varchar(50) 
)"; 


    SqlCommand command = new SqlCommand(
     queryString, connection); 

    command.ExecuteNonReader(); 
+0

Спасибо за ответ. Но что делать, если таблица уже существует, и я хочу добавить к ней данные, не удаляя таблицу?. Это просто еще одно сомнение. Надеюсь, вы не возражаете. – user2614235

+0

Вы хотите удалить его и добавить новые данные или добавить в него данные? –

+1

@ user2614235 Каков ваш точный запрос? Если таблица существует, ее можно удалить и добавить новые данные? или Если таблица существует, вставьте эти новые данные, которые у меня есть, и сохраняя старые? –

2

Я бы создал пустую таблицу, если она еще не существует, а затем скопируйте данные. Если возможно не использовать 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(); 
} 

к сведению, что в пункте где вы должны заполнить правильные <key> столбцов. Я также добавил ограничение первичного ключа для новой таблицы, так как select in не будет копировать первичный ключ/индексы исходной таблицы.

+0

+1 для ответа на следующий вопрос довольно неплохо – HoneyBadger

1

Чтобы ответить на актуальный вопрос о том, почему 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 

Это будет тест, чтобы увидеть, существует ли таблица, уронить его, если так, то создать и заполнить таблицу снова. Это не ужасно чистый способ делать что-то, но если это то, что вы хотите, это сделает это.

Смежные вопросы