Недавно столкнулся со следующей проблемой: в моей программе нужно выполнять набор sql-скриптов, которые содержатся в файлах *.sql, на базе данных MS SQL Server 2005. Каждый такой скрипт в отдельности содержит инструкции по созданию таблиц, хранимых процедур, обновления данных и т.п., и т.д.
В этом случае использование привычных объектов SqlCommand и SqlDataAdapter приводит к генерации исключения времени выполнения со следующей ошибкой "Incorrect syntax near 'GO'". Это происходит из-за того, что в T-SQL на самом деле нет такой иструкции, но Query Analyzer разбирает запросы и интерпретирует комманду 'GO' как комманду отправки пакета комманд на сервер.
Один из вариантов решения проблемы состоит в использовании утилиты, идущей в поставке MS SQL Server, osql.exe. К сожалению, такой вариант не всегда является приемлемым.
Далее я привожу более простой вариант решения проблемы с использованием сборок MS SQL Server:
using System.Data.SqlClient;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
namespace MyProject.Sql
{
public class SampleSql
{
public static void ExcuteSql(string command, string connectionString)
{
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
var server = new Server(new ServerConnection(connection));
server.ConnectionContext.ExecuteNonQuery(command);
server.ConnectionContext.Disconnect();
}
}
}
}
Для выполнения данного кода необходимо подключить к проекту следующие сборки:
Вот собственно и все. Удачного вам программирования :)