C # Чтение результата вывода из хранимой процедуры слияние в ВЫВОД

#c# #sql-server #stored-procedures

#c# #sql-сервер #хранимые процедуры

Вопрос:

Я пытаюсь загрузить файл Excel на C # в таблицу базы данных SQL Server.

Таблица выглядит следующим образом:

Компании

 ID(PK)          Int            AutoIncrement 
CompanyName     Varchar(256)
Logo            Varchar(256)
WebsiteURL      Varchar(256)
Description     Varchar(256)
  

Я прочитал Excel в DataTable объект и передал его хранимой процедуре. Хранимая процедура используется MERGE INTO для вставки новых записей и обновления существующих.

Мне нужно знать, сколько записей вставлено и сколько обновлено.

Для этого я использовал OUTPUT следующее:

 CREATE PROCEDURE [dbo].[Update_Companies]
     @tblCompanies CompanyType READONLY
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @summary CompanySummaryType;

    MERGE INTO companies c1
    USING @tblCompanies c2 ON c1.CompanyName = c2.CompanyName

    WHEN MATCHED THEN
       UPDATE 
           SET c1.Logo = c2.Logo,
               c1.WebsiteURL = c2.WebsiteURL,
               c1.CompanyDescription = c2.CompanyDescription,

    WHEN NOT MATCHED THEN
        INSERT (CompanyName, Logo, WebsiteURL, Description) 
        VALUES (c2.CompanyName, c2.Logo, c2.WebsiteURL, c2.Description)

    OUTPUT 
        $action as ActionType, 
        INSERTED.CompanyName as CompanyName INTO @summary;
END
  

CompanyType является определяемым пользователем типом таблицы, содержащим столбцы таблицы

CompanySummaryType — это определяемый пользователем тип таблицы, содержащий два столбца:

 ActionType    Varchar(256),
CompanyName   Varchar(256)
  

Код выполняется нормально, и вставка или обновление работают отлично.

Я хочу прочитать @summary переменную обратно в моем коде на C #.

Прямо сейчас я использую ExecuteNonQuery для выполнения хранимой процедуры, подобной этой:

 private void AddRecords(DataTable dataTable)
{
    string constr = ConfigurationManager.ConnectionStrings["CMSConnectionString"].ConnectionString;

    using (SqlConnection con = new SqlConnection(constr))
    {
        using (SqlCommand cmd = new SqlCommand("Update_Companies"))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection = con;
            cmd.Parameters.AddWithValue("@tblCompanies", dataTable);

            con.Open();
            cmd.ExecuteNonQuery();
            con.Close();
        }
    }
}
  

Кроме того, есть ли способ, с помощью которого я могу узнать, сколько записей не удалось вставить или обновить?

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

1. Почему какие-либо записи не могут быть вставлены или обновлены? Предоставьте образец данных и желаемый результат.

Ответ №1:

Вы можете сделать свою @Summary переменную выходным параметром процедуры.

Затем в вашем коде C # вы можете сравнить возвращенный выходной параметр с исходным входным параметром, чтобы увидеть, какие строки не были вставлены или обновлены.