根据传递的参数调用具有动态值的存储过程

时间:2015-12-08 11:11:21

标签: c# sql-server stored-procedures

我试图从C#调用存储过程,基本上允许我传递两个参数,一个发票号和一个索赔金额。

根据传递给存储过程的值,它验证发票编号和索赔金额,并返回根据您传递的内容(动态)更改的结果。

我的问题是它在某些测试场景中失败并在其他测试场景中成功。我返回的结果可以返回

St_Key, Supplier_Claim, Orig_Inv, System_Cost, Error 

列。但是传递的不同发票和索赔有不同的结果,因此对于数字不退出的Invoice,它只返回STKey和Error消息,一些验证方案可以返回所有,基于结果的大约3列。

我的问题是,如果某些值为null,我测试的WCF服务将无法通过调用。我希望这是有道理的,请在这里找到代码:

public Supplier_Claim_Upload_Result ExcludeFailedValidationRecords(string lineNumber, decimal totalClaim)
{
        Supplier_Claim_Upload_Result supplierClaimUplaod = new Supplier_Claim_Upload_Result();
        var sqlConnection = "data source=WMVSQL02;initial catalog=Embrace;integrated security=True;";

        using (SqlConnection conn = new SqlConnection(sqlConnection))
        {
            SqlCommand cmd = new SqlCommand();
            cmd.CommandTimeout = 60;
            SqlDataReader reader;

            cmd.CommandText = "CRM.Supplier_Claim_Upload";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@Invoice", SqlDbType.NVarChar).Value = lineNumber;
            cmd.Parameters.Add("@Amount", SqlDbType.Decimal).Value = totalClaim;
            cmd.Connection = conn;

            conn.Open();
            reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                supplierClaimUplaod.ST_Key = reader["ST_Key"].ToString();
                supplierClaimUplaod.Supplier_Claim = reader["Supplier_Claim"].ToString() != null ? reader["Supplier_Claim"].ToString() : string.Empty;
                supplierClaimUplaod.Orig_Inv = reader["Orig_Inv"].ToString();
                supplierClaimUplaod.System_Cost = reader["System_Cost"].ToString();
                //supplierClaimUplaod.Error = reader["Error"] == null ? reader["Error"].ToString() : null; // this line fails on 1st example
            }

            conn.Close();
            return supplierClaimUplaod;
        }
}

以下是返回不同结果的两个示例

DECLARE @return_value int

EXEC    @return_value = [CRM].[Supplier_Claim_Upload]
        @Invoice = NCNTA5000229001-1,
        @Amount = 663.800

SELECT  'Return Value' = @return_value
GO

在这里,我传递了发票号NCNTA5000229001-1和索赔金额663.800,这是我得到的回复

First Response Example

这是第二个示例,其中只从存储过程返回STKey和Error,我传递不存在的Invoice和不正确的数量

Second Response

我遇到的问题是,当我调用示例1的存储过程时,它失败,因为我的结果类型没有error列,我的服务失败了。知道如何以通用的方式只返回每个场景所需的结果,因为结果在不同的调用中发生变化并且我的代码失败了吗?

1 个答案:

答案 0 :(得分:1)

您不应该通过相同的存储过程返回不同的模式,以指示已知错误,您应该从具有已知错误代码标识符的存储过程中抛出异常,然后在应用程序端处理它。

您可能会发现有用的