Инсталиране на съхранена процедура в .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 скрипт файл с помощта на c#
  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 не. О: Ябълки и портокали - това са две напълно различни неща! Също така си струва да се отбележи, че 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 по начин, който смятам, че би бил наистина удобен за мен? О: 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