我正在尝试将C#中的Excel文件上传到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)
代码可以正常运行,并且可以完美地插入或更新。
我想在我的C#代码中读回@summary
变量。
现在,我正在使用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();
}
}
}
还有,有没有一种方法可以找到多少条记录无法插入或更新?
答案 0 :(得分:0)
您可以将@Summary
变量设置为过程的OUTPUT参数。
然后,在C#代码中,您可以将返回的OUTPUT参数与原始输入参数进行比较,以查看未插入或更新的行。