Каковы ограничения T-SQL, которые могут быть выполнены объектом System.Data.SqlClient.SqlCommand?

#.net #sql-server #tsql #migration #sqlcommand

#.net #sql-сервер #tsql #миграция #sqlcommand

Вопрос:

У меня есть некоторый Transact-SQL, который выглядит следующим образом, может ли он быть выполнен через объект SqlCommand или мне нужно начать изучать объекты управления Sql?

 BEGIN TRANSACTION
BEGIN TRY

    IF NOT EXISTS
    (
        SELECT * 
        FROM INFORMATION_SCHEMA.TABLES 
        WHERE TABLE_CATALOG = (SELECT DB_NAME())
        AND TABLE_NAME = 'SchemaVersion'
    )
        BEGIN
            Print 'Migrating up...'

            CREATE TABLE SchemaVersion (
                Id INT IDENTITY(1,1) NOT NULL,
                Version INT NOT NULL,
                CONSTRAINT PK_SchemaVersion PRIMARY KEY CLUSTERED (
                    Id ASC
                )
            )

            INSERT INTO SchemaVersion (Version) VALUES(1)

            PRINT 'Migrated from 0 to 1'
        END
    ELSE IF (SELECT Version FROM SchemaVersion) = 1
        BEGIN
            Print 'Migrating down...'

            DROP TABLE Dia_SchemaVersion

            PRINT 'Migrated from 1 to 0'
        END
     ELSE
        PRINT 'Not migrating...'

    COMMIT TRANSACTION;

END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION
END CATCH
  

Ответ №1:

Да, это может быть выполнено SqlCommand — самым простым способом было бы поместить это в хранимую процедуру и выполнить ее.

С какими проблемами вы сталкиваетесь?

Что касается изучения SSMS — если вы разрабатываете на SQL Server, это неплохая идея.

Комментарии:

1. Никаких особых проблем, я просто хотел избежать неправильного пути.

Ответ №2:

Просто оберните это в хранимую процедуру и вызовите ее с помощью SqlCommand .Метод ExecuteNonQuery(). Вы можете «прослушивать» печатные сообщения из вашего .Сетевой код путем обработки события информационного сообщения SqlConnection. Это также помогает установить для свойства FireInfoMessageEventOnUserErrors соединения значение true.

Комментарии:

1. Это отличный совет по поводу InfoMessage, спасибо! Жаль, что я использую System.Data. Общие классы.

Ответ №3:

Вам нужно понимать ADO.NET и как работают объекты, в первую очередь

  1. Подключение
  2. Команда
  3. Транзакция
  4. DataReader
  5. Набор данных
  6. DataDapter

Объект Command может принимать любой запрос, совместимый с SQL (ANSI SQL). Если вы собираетесь выполнять транзакции, я предлагаю вам обрабатывать транзакции

  1. Через ADO.NET Транзакция…вот некоторое чтение
  2. Вместо этого вызовите хранимую процедуру из объекта command, вместо того чтобы передавать ее как часть SQL.