Запуск сценария SQL с использованием SMO в C # - PullRequest
0 голосов
/ 19 октября 2018

У меня проблема с запуском сценария SQL в моей программе.Это код для программы

        string databaseName = "TestDB";
        Server srv1 = new Server(@"TestServer/ABCUser");   // connects to default instance  
        srv1.ConnectionContext.LoginSecure = false;   // set to true for Windows Authentication  
        srv1.ConnectionContext.Login = "sa";
        srv1.ConnectionContext.Password = "abcde123*";
try
        {
            Console.WriteLine(srv1.Information.Version);   // connection is established  
            if(srv1.Databases[databaseName] == null)
            {
                Microsoft.SqlServer.Management.Smo.Database db;
                db = new Microsoft.SqlServer.Management.Smo.Database(srv1, databaseName);
                db.Create();
                db = srv1.Databases[databaseName];
                Console.WriteLine(db.CreateDate);
            }

            else
            {
                Console.WriteLine("DB Already Exists!");
            }
            string sqlScript = File.ReadAllText(@"D:\Projects\TrainingProject\src\TrainingDatabase\Scripts\Tables\Script01-table.sql");
            Console.WriteLine(sqlScript);
            srv1.ConnectionContext.ExecuteNonQuery(sqlScript);

        }
        catch (ConnectionFailureException e)
        {
            Console.WriteLine("Error in connecting to the sql server " + e.Message);
        }

И это SQL-скрипт

IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'FileTypes') BEGIN
CREATE TABLE FileTypes (
    FileTypeID tinyint IDENTITY(1,1) NOT NULL,
    TypeName varchar(500) NOT NULL

    CONSTRAINT PK_FileTypes PRIMARY KEY(FileTypeID)
)

IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'FileTypes')
    PRINT 'Created table FileTypes'
ELSE
    PRINT 'Failed to create table FileTypes'

END

До сих пор я проверял, что:

  1. Мне удалось получить информацию о версии сервера (соединение с сервером установлено успешно)

  2. Я могу создать базу данных из программы

  3. Сценарий работает, когда я использую его как запрос в Microsoft SQL Server Management Studio

  4. Команда Console.WriteLine(sqlScript); показывает правильный сценарий SQL

Проблема в том, что srv1.ConnectionContext.ExecuteNonQuery(sqlScript); не работает.

Кто-нибудь знает ответ?

Это вопросы стека переполнения, которые я использовал для справки: Выполнить большой SQL-скрипт (с командами GO)

1 Ответ

0 голосов
/ 19 октября 2018

Оказывается, я допустил ошибку в этой строке: srv1.ConnectionContext.ExecuteNonQuery(sqlScript);

Он создал таблицу в главной БД, когда это должно быть так:

srv1.Databases[databaseName].ExecuteNonQuery(sqlScript);
...