#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 # вы можете сравнить возвращенный выходной параметр с исходным входным параметром, чтобы увидеть, какие строки не были вставлены или обновлены.