Установка хранимой процедуры в .NET

Моя цель — установить хранимые процедуры в файлах .sql. После некоторых исследований все рекомендовали, чтобы моя программа считывала файл .sql в строку и создавала командный объект из строки.

using System.Data.SqlClient;

public partial class ExecuteScript 
{
    static void Main(string[] args)
    {
        string sqlConnectionString = [connection string];
        string script = File.ReadAllText([.sql file path]);
        SqlConnection conn = new SqlConnection(sqlConnectionString);
        Server server = new Server(new ServerConnection(conn));
        server.ConnectionContext.ExecuteNonQuery(script);
    }
}

Вот некоторые ссылки:

  1. Как выполнить файл сценария .SQL с помощью С#
  2. https://social.msdn.microsoft.com/Forums/en-US/43e8bc3a-1132-453b-b950-09427e970f31/run-a-sql-script-file-in-c?forum=adodotnetdataproviders

Интересно, что sqlcmd.exe принимает файл .sql, а SqlClient в .NET — нет. Кто-нибудь знает, почему и как? Причина, по которой я не хочу читать файл .sql в виде строки, заключается в том, что все мои хранимые процедуры имеют комментарии вверху, и чтение их в строку превращает всю процедуру в комментарий sql. Я понимаю, что могу исправить это разными способами, но я надеялся увидеть, есть ли более простой способ. В итоге я сделал следующее, но, пожалуйста, просветите меня!

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.Arguments = "-E -d [database] -S [server\\instance] -i " + storedProcFullPath; 
startInfo.FileName = "sqlcmd.exe";
Process.Start(startInfo);

Спасибо!


person Chris Hong    schedule 18.08.2015    source источник
comment
В: sqlcmd.exe принимает файл .sql, а SqlClient в .NET — нет. A: Яблоки и апельсины - это две совершенно разные вещи! Также стоит отметить, что GO - это sqlcmd.exe - он не понимается в SQL, который вы можете вызывать из .Net (или Java JDBC, если уж на то пошло).   -  person paulsm4    schedule 18.08.2015
comment
Вопрос. Удалось ли вам прочитать файл .sql в строку и успешно использовать эту строку для создания хранимой процедуры? Как я упоминал ниже, проблема, скорее всего, заключалась в ReadAllText(). Вы должны быть в состоянии выполнить именно то, что хотите — без порождения внешней программы — с помощью других API (таких как ReadAllBytes()/GetString( ), Например).   -  person paulsm4    schedule 18.08.2015
comment
Я надеялся просто указать путь к файлу, если это было возможно. Я был удивлен, что не смог в .NET.   -  person Chris Hong    schedule 18.08.2015
comment
Прошу прощения, если мой вопрос вводит в заблуждение. Я надеюсь, что кто-нибудь может ответить, почему это не может быть похоже на server.ConnectionContext.ExecuteNonQuery (путь к файлу .sql)?   -  person Chris Hong    schedule 18.08.2015
comment
В: Почему Microsoft не написала API таким образом, который, по моему мнению, был бы действительно удобным для меня? A: 1) Потому что: они этого не сделали :). 2) Потому что вы можете легко написать 2-строчную функцию для выполнения точно такой же задачи.   -  person paulsm4    schedule 18.08.2015
comment
Спасибо. Было бы более интуитивно понятно, если бы Microsoft построила это таким образом.   -  person Chris Hong    schedule 18.08.2015


Ответы (1)


Конечно, конечно, вы можете прочитать свой файл SQL в .Net.

Проблема, с которой вы столкнулись, заключается в том, что File.ReadAllText удаляет ваш CR/LF, когда вы читаете его в строку: Как прочитать файл в строку с сохранением CR/LF?

РЕШЕНИЕ:

  1. File.ReadAllBytes() чтобы получить все байты

  2. Encoding.GetString() для преобразования байтов в строку.

ПРИМЕР:

byte[] data = File.ReadAllBytes("myfile.sql");
string text = Encoding.UTF8.GetString(data);
person paulsm4    schedule 18.08.2015
comment
Конечно, я понимаю, что есть решение для решения моей проблемы, как прочитать мой файл, но я надеялся просто указать путь к файлу. Я удивлен, что это не вариант в .NET. - person Chris Hong; 18.08.2015
comment
почему это не может быть как server.ConnectionContext.ExecuteNonQuery(путь к файлу .sql)? - person Chris Hong; 18.08.2015