Я пытаюсь загрузить файл 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();
}
}
}
Кроме того, есть ли способ узнать, сколько записей не удалось вставить или обновить?