2012-04-25 4 views
3

У меня есть база данных из 270 тыс. Строк с первичным ключом mid и столбец value, и у меня есть текстовый файл с серединой и значениями. Теперь я хотел бы обновить таблицу таким образом, чтобы каждое значение было присвоено правильной середине.Массовое обновление SQL Server C#

Мой текущий подход - чтение текстового файла с C# и обновление строки в таблице для каждой прочитанной строки. Должен быть более быстрый способ делать то, что я чувствую .. любые идеи?

EDIT: В таблице есть другие столбцы, поэтому мне действительно нужен метод для обновления в зависимости от середины.

+0

SqlBulkCopy во временную таблицу или вы можете попробовать ОБНОВИТЬ с TVP. –

ответ

7

Вы можете использовать мастер импорта и экспорта SQL Server:

http://msdn.microsoft.com/en-us/library/ms141209.aspx

В качестве альтернативы вы можете использовать Заявление BULK TSQL:

BULK 
INSERT YourTable 
FROM 'c:\YourTextFile.txt' 
WITH 
(
FIELDTERMINATOR = ',', 
ROWTERMINATOR = '\n' 
) 
GO 


SELECT * FROM YourTable 
GO 

Предполагая, что вы распределяете на запятую разделителем. Если вы используете другой символ, например пробел, измените FIELDTERMINATOR на соответствующий символ.

Edit (Для получения обновления из моего комментария):

UPDATE RealTable 
SET value = tt.value 
FROM 
    RealTable r 
INNER JOIN temp_table tt ON r.mid = tt.mid 
+0

Спасибо. Если я прав, это не будет обновляться, но вставляется в таблицу, верно? Я редактировал свой вопрос с дополнительной информацией, мои извинения. Как насчет использования вашего метода для создания новой таблицы, а затем присоединиться к ним в середине? – Freek8

+0

@ Freek8 - ах, я вижу. Да, это будет вставляться из текстового файла. Вы можете сохранить эти результаты во временной таблице (используя предоставленный BULK-запрос), а затем использовать инструкцию UPDATE на основе таблицы temp –

+0

@ Freek8 - теперь я включил SQL, необходимый для достижения этого в моем ответе. Вам нужно будет соответствующим образом скопировать имена таблиц. –

1

ли вы повторно использовать SqlCommand?

struct Item 
    { 
     public int mid; 
     public int value; 
    } 

    public int Update(string connectionstring) 
    { 
     int res = 0; 
     using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand()) 
     using (cmd.Connection = new System.Data.SqlClient.SqlConnection(connectionstring)) 
     { 
      cmd.CommandText = @"UPDATE [table] SET [value] = @value WHERE [mid] = @mid;"; 
      cmd.CommandType = CommandType.Text; 
      System.Data.SqlClient.SqlParameter mid = cmd.Parameters.Add("@mid", SqlDbType.VarChar); 
      System.Data.SqlClient.SqlParameter value = cmd.Parameters.Add("@value", SqlDbType.VarChar); 
      try 
      { 
       cmd.Connection.Open(); 
       foreach (Item item in GetItems("pathttothefile")) 
       { 
        mid.Value = item.mid; 
        value.Value = item.value; 
        res += cmd.ExecuteNonQuery(); 
       } 
      } 
      catch (Exception) 
      { 
       throw; 
      } 
      finally 
      { 
       cmd.Connection.Close(); 
      } 
     } 
     return res; 
    } 

    IEnumerable<Item> GetItems(string path) 
    { 
     string[] line; 
     foreach (var item in System.IO.File.ReadLines(path)) 
     { 
      line = item.Split(','); 
      yield return new Item() { mid = int.Parse(line[0]), value = int.Parse(line[1]) }; 
     } 
    } 
+0

Да, я повторно использую 'sqlcommand', но он все еще занимает очень много времени – Freek8

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