C#+从存储过程读取输出结果+合并到+ OUTPUT

时间:2019-04-21 17:37:52

标签: c# sql-server stored-procedures

我正在尝试将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();
        }
    }
}

还有,有没有一种方法可以找到多少条记录无法插入或更新?

1 个答案:

答案 0 :(得分:0)

您可以将@Summary变量设置为过程的OUTPUT参数。

然后,在C#代码中,您可以将返回的OUTPUT参数与原始输入参数进行比较,以查看未插入或更新的行。