Inserir dados de um arquivo .SQL no SqlServer pelo c#

O problema que eu tinha que resolver era o seguinte: carregar um banco de dados a partir de uma serie de arquivos “*.sql”.
Abrir cada arquivo (que no caso era de algumas centenas) não é viável e executar o comando citado no post “Como importar um arquivo SQL (.sql) grande no Sqlserver” centenas de vezes também não.

Por este motivo montei um console aplication que executa os comandos no banco de dados.
O motivo de ser realizado desta maneira é que entre os arquivos alguns eram grandes, e quando eu tentava executar o arquivo completo de uma unica vez, ele dava erro. Por isso quebrei o código nas linhas de INSERT e fiz a inserção um a um.

Apeasar de tudo achei o desempenho surpreendente. Com certeza não é mais rapido mas atende muito bem.

Exemplo do conteúdo do arquivo SQL usado

SET IDENTITY_INSERT dbo.Country ON;
INSERT INTO Country ([Id],[Title],[Acronym]) VALUES (1,'Venezuela','VE');
INSERT INTO Country ([Id],[Title],[Acronym]) VALUES (5,'Colombia','CO');
INSERT INTO Country ([Id],[Title],[Acronym]) VALUES (7,'Bolivia','BO');
INSERT INTO Country ([Id],[Title],[Acronym]) VALUES (8,'Costa Rica','CR');
INSERT INTO Country ([Id],[Title],[Acronym]) VALUES (9,'Dominican Rep.','DO');
SET IDENTITY_INSERT dbo.Country OFF;

Código realizado
[erro 1] Tentativa foi de ler linha a linhas, mas algumas querys continham textos com quebra de linha nos campos. Logicamente isso gerava um problema grave na gravação de dados. Pois o comando SQL era interrompido.
[erro 2] Ainda lendo linha a linha, descobrir se a próxima linha ainda era um comando da linha anterior. Isso gerou um código considerável e ainda assim achava casos que não atendia.

A solução foi a descrita abaixo. (Não é elegante, mas é funcional)

using System;
using System.IO;
using System.Linq;
namespace UpdateDatabase
{
    class Program
    {
        static void Main(string[] args)
        {
            string linha;
            string sqlCommandBegin = String.Empty ;
            int count = 0;
            using (YourEntities context = new YourEntities())
            {
                string[] fileEntries = Directory.GetFiles("C:\\Import");
                foreach (string fileName in fileEntries)
                {
                    StreamReader file = new StreamReader(fileName);
                    string[] stringSeparators = new string[] { "INSERT INTO" };
                    string[] split = file.ReadToEnd().Split(stringSeparators, StringSplitOptions.None);
                    foreach (string commandLine in split)
                    {
                        if (count == 0)
                        {
                            sqlCommandBegin = "use YourDataBaseName; " + commandLine;
                        }
                        else
                        {
                            if (count != split.Count())
                            {
                                linha = commandLine.Replace("\"", "\\\"");
                                var linhasAfetadas = context.Database.ExecuteSqlCommand(sqlCommandBegin + " INSERT INTO " + linha);
                            }
                        }
                        count++;
                    }
                    Console.WriteLine("Linhas afetadas: " + count + " - File: " + fileName);
                    count = 0;
                }
                Console.ReadKey(); //Somente para ele parar ao final do processo.
            }
        }
    }
}

Qualquer dúvidas ou dicas, entre em contato: leandrolt@gmail.com

Leave a Reply

Your email address will not be published. Required fields are marked *