C # + Чтение результатов вывода из хранимой процедуры + объединить в + OUTPUT - PullRequest
0 голосов
/ 21 апреля 2019

Я пытаюсь загрузить файл 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 Ответ

0 голосов
/ 22 апреля 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...