刚刚开始熟悉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而且很老了。到目前为止,我没有尝试过。
如何跳过失败的记录并允许其他人继续?
这会奏效。试试这个:
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();
}
}
}
当然,您将不得不传递自己的连接,变量名称,参数等,但这是一个很好的阅读。