在SSIS C#Script Component中正确使用try / catch来跳过失败的DB插入

问题描述 投票:0回答:1

刚刚开始熟悉SSIS错误处理。我们使用脚本组件作为数据流的最后一步。在Input0_ProcessInputRow方法中,我将值分配给存储过程的参数。传递的某些数据未通过验证(参照完整性等),无法插入。从长远来看,我希望记录这些故障,以便我们以后再查看。现在,问题是,一旦我们点击其中一条记录,整个SSIS步骤就会失败。没有记录添加。

我将代码包装在try / catch中,期望只是跳过失败的记录并转到下一个。

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    try
    {
        sqlCmd.Parameters["@FIRSTNAME"].Value = Row.DRIVERFIRSTNAME;
        sqlCmd.Parameters["@LASTNAME"].Value = Row.DRIVERLASTNAME;
        sqlCmd.Parameters["@STATUS"].Value = "Active";
        sqlCmd.Parameters["@SHOPID"].Value = Row.DRIVERSHOPID;
        sqlCmd.Parameters["@ADDRESS1"].Value = Row.DRIVERADDRESS1;
        sqlCmd.Parameters["@ADDRESS2"].Value = Row.DRIVERADDRESS2;
        sqlCmd.Parameters["@CITY"].Value = Row.DRIVERCITY;
        sqlCmd.Parameters["@STATE"].Value = Row.DRIVERSTATE;
        sqlCmd.Parameters["@ZIPCODE"].Value = Row.DRIVERZIPCODE;

        sqlCmd.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
        //bool pbCancel = false;
        //this.ComponentMetaData.FireError(0, "SQL Task", "An error occurred: " + ex.Message, "", 0, out pbCancel);
    }
}

我找到的很多例子都是针对VB而且很老了。到目前为止,我没有尝试过。

如何跳过失败的记录并允许其他人继续?

c# ssis ssis-2012
1个回答
0
投票

这会奏效。试试这个:

using System;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace RestSharpClient
{
class RestClientDB
{
    public static void AddJSONInfo(ChildGetSet jResult)
    {
        bool debugging = false;


        SqlConnection connection = Connection.GetConnection();

        connection.Open();

        try
        {

            ///Check to see if the orderID already exists in the database

            string check = @"(SELECT COUNT(*) FROM OrdersSubTable WHERE FOrderID='" + jResult.FOrderID + "' AND OrderItemID='" +
                jResult.OrderItemID + "')";
            SqlCommand cmda = new SqlCommand(check, connection);
            int count = (int)cmda.ExecuteScalar();

            if (debugging == true)
            {
                MessageBox.Show("count: " + count);
            }
            if (count > 0)
            {
                //MessageBox.Show("Order number: " + Convert.ToString(jResult.FOrderID) + " already exists with Item Number: " + jResult.OrderItemID + ".");

                SqlCommand update = new SqlCommand("UPDATE OrdersSubTable SET FOrderStatus=@FOrderStatus, OrderItemID=@OrderItemID, " +
                    "ItemState=@ItemState, PartNumber=@PartNumber, Warehouse=@Warehouse, Description=@Description, Quantity=@Quantity, " +
                    "SubtotalTaxAmount=@SubtotalTaxAmount, SubtotalGross=@SubtotalGross, RetailPrice=@RetailPrice, MfgOfferPrice=@MfgOfferPrice, " +
                    "LineDiscount=@LineDiscount, Shipping=@Shipping, ActualPrice=@ActualPrice, Code=@Code, SingleUseCode=@SingleUseCode, " +
                    "Amount=@Amount, IsInventory=@IsInventory, IsGift=@IsGift, IsExternalPayment=@IsExternalPayment " +
                    "Where FOrderID=" + jResult.FOrderID + " AND OrderItemID=" +
                jResult.OrderItemID, connection);
                update.Parameters.AddWithValue(
                    "@FOrderStatus", jResult.FOrderStatus);
                update.Parameters.AddWithValue(
                    "@OrderItemID", jResult.OrderItemID);

                update.Parameters.AddWithValue(
                    "@ItemState", jResult.ItemState);
                update.Parameters.AddWithValue(
                    "@PartNumber", jResult.PartNumber);
                update.Parameters.AddWithValue(
                    "@Warehouse", jResult.Warehouse);
                update.Parameters.AddWithValue(
                    "@Description", jResult.Description);
                update.Parameters.AddWithValue(
                    "@Quantity", jResult.Quantity);
                update.Parameters.AddWithValue(
                    "@SubtotalTaxAmount", jResult.SubtotalTaxAmount);
                update.Parameters.AddWithValue(
                    "@SubtotalGross", jResult.SubtotalGross);
                update.Parameters.AddWithValue(
                    "@RetailPrice", jResult.RetailPrice);
                update.Parameters.AddWithValue(
                    "@MfgOfferPrice", jResult.MfgOfferPrice);
                update.Parameters.AddWithValue(
                    "@LineDiscount", jResult.LineDiscount);
                update.Parameters.AddWithValue(
                    "@Shipping", jResult.Shipping);
                update.Parameters.AddWithValue(
                    "@ActualPrice", jResult.ActualPrice);
                update.Parameters.AddWithValue(
                        "@Code", jResult.Code);
                update.Parameters.AddWithValue(
                        "@SingleUseCode", jResult.SingleUseCode);
                update.Parameters.AddWithValue(
                        "@Amount", jResult.Amount);
                update.Parameters.AddWithValue(
                        "@IsInventory", jResult.IsInventory);
                update.Parameters.AddWithValue(
                        "@IsGift", jResult.IsGift);
                update.Parameters.AddWithValue(
                        "@IsExternalPayment", jResult.IsExternalPayment);
                update.ExecuteNonQuery();

                if (debugging == true)
                {
                    MessageBox.Show("If " + jResult.FOrderStatus + " is different, then it would have changed.");
                }
            }
            else
            {




                string insertStatement2 =
                    "INSERT INTO OrdersSubTable " +
                    "(FOrderID, FOrderStatus, OrderItemID, " +
                    "ItemState, PartNumber, Warehouse, Description, Quantity, SubtotalTaxAmount, " +
                    "SubtotalGross, RetailPrice, MfgOfferPrice, LineDiscount, Shipping, ActualPrice, Code, SingleUseCode, Amount, " +
                    "IsInventory, IsGift, IsExternalPayment) " + "VALUES (@FOrderID, @FOrderStatus, " +
                    "@OrderItemID, " +
                    "@ItemState, @PartNumber, @Warehouse, @Description, @Quantity, @SubtotalTaxAmount, " +
                    "@SubtotalGross, @RetailPrice, @MfgOfferPrice, @LineDiscount, @Shipping, @ActualPrice, @Code, @SingleUseCode, " +
                    "@Amount, @IsInventory, @IsGift, @IsExternalPayment)";



                SqlCommand insertCommand2 =
                   new SqlCommand(insertStatement2, connection);
                insertCommand2.Parameters.AddWithValue(
                    "@FOrderID", jResult.FOrderID);
                insertCommand2.Parameters.AddWithValue(
                    "@FOrderStatus", jResult.FOrderStatus);
                insertCommand2.Parameters.AddWithValue(
                    "@OrderItemID", jResult.OrderItemID);
                insertCommand2.Parameters.AddWithValue(
                    "@ItemState", jResult.ItemState);
                insertCommand2.Parameters.AddWithValue(
                    "@PartNumber", jResult.PartNumber);
                insertCommand2.Parameters.AddWithValue(
                    "@Warehouse", jResult.Warehouse);
                insertCommand2.Parameters.AddWithValue(
                    "@Description", jResult.Description);
                insertCommand2.Parameters.AddWithValue(
                    "@Quantity", jResult.Quantity);
                insertCommand2.Parameters.AddWithValue(
                    "@SubtotalTaxAmount", jResult.SubtotalTaxAmount);
                insertCommand2.Parameters.AddWithValue(
                    "@SubtotalGross", jResult.SubtotalGross);
                insertCommand2.Parameters.AddWithValue(
                    "@RetailPrice", jResult.RetailPrice);
                insertCommand2.Parameters.AddWithValue(
                    "@MfgOfferPrice", jResult.MfgOfferPrice);
                insertCommand2.Parameters.AddWithValue(
                    "@LineDiscount", jResult.LineDiscount);
                insertCommand2.Parameters.AddWithValue(
                    "@Shipping", jResult.Shipping);
                insertCommand2.Parameters.AddWithValue(
                    "@ActualPrice", jResult.ActualPrice);
                insertCommand2.Parameters.AddWithValue(
                        "@Code", jResult.Code);
                insertCommand2.Parameters.AddWithValue(
                        "@SingleUseCode", jResult.SingleUseCode);
                insertCommand2.Parameters.AddWithValue(
                        "@Amount", jResult.Amount);
                insertCommand2.Parameters.AddWithValue(
                        "@IsInventory", jResult.IsInventory);
                insertCommand2.Parameters.AddWithValue(
                        "@IsGift", jResult.IsGift);
                insertCommand2.Parameters.AddWithValue(
                        "@IsExternalPayment", jResult.IsExternalPayment);


                insertCommand2.ExecuteNonQuery();

                //MessageBox.Show("Data Successfully written to database.");
            }

        }
        catch (SqlException ex)
        {
            if (ex.Number == 2627)
            {
                if (debugging == true)
                {
                    MessageBox.Show("Violation of primary/unique key. Exception number: " + ex);
                }
            }
            else
            {
                if (debugging == true)
                {
                    MessageBox.Show("SQL Exception number: " + ex);
                }
            }
        }
        connection.Close();


    }
}
}

当然,您将不得不传递自己的连接,变量名称,参数等,但这是一个很好的阅读。

© www.soinside.com 2019 - 2024. All rights reserved.