我试图从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
,这是我得到的回复
这是第二个示例,其中只从存储过程返回STKey和Error,我传递不存在的Invoice和不正确的数量
我遇到的问题是,当我调用示例1的存储过程时,它失败,因为我的结果类型没有error
列,我的服务失败了。知道如何以通用的方式只返回每个场景所需的结果,因为结果在不同的调用中发生变化并且我的代码失败了吗?
答案 0 :(得分:1)
您不应该通过相同的存储过程返回不同的模式,以指示已知错误,您应该从具有已知错误代码标识符的存储过程中抛出异常,然后在应用程序端处理它。
您可能会发现有用的