Вызов хранимой процедуры, которая имеет динамические значения на основе переданных параметров

114
8

Я пытаюсь вызвать хранимую процедуру из С#, которая в основном позволяет мне передать ему два параметра: номер счета и сумму претензии.

На основе значений, переданных в хранимую процедуру, он проверяет номер счета и сумму заявки и возвращает результат, который изменяется (динамически) в зависимости от того, что вы передаете.

Моя проблема заключается в том, что он не работает в определенных тестовых сценариях и преуспевает в других. Мой результат может возвратиться

St_Key, Supplier_Claim, Orig_Inv, System_Cost, Error 

колонны. Однако разные счета-фактуры и претензии имеют разные результаты, поэтому для счета-фактуры, где номер не выходит из него, возвращает только сообщение STKey и сообщение об ошибке, некоторые сценарии проверки могут возвращать все, из которых три столбца основаны на результате.

Моя проблема в том, что служба 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 номер NCNTA5000229001-1 и сумму претензии 663.800, это ответ, который я получаю

First Response Example

И вот второй пример, когда из хранимой процедуры возвращаются только STKey и Error, я передаю не существующий счет-фактуру и неправильную сумму

Second Response

Моя проблема, с которой я столкнулась, заключается в том, что когда я вызываю хранимую процедуру для примера 1, она терпит неудачу, так как у моего типа результата нет столбца error где моя служба завершается с ошибкой. Любая идея, как я могу вернуть только результат, необходимый для каждого сценария, в общем виде, поскольку результат изменяется на разные вызовы, и он не работает с моим кодом?

спросил(а) 2015-12-08T14:11:00+03:00 5 лет, 4 месяца назад
1
Решение
62

Вы не должны возвращать другую схему с помощью той же хранимой процедуры, чтобы указать известную ошибку, которую вы должны исключить из хранимой процедуры с известным идентификатором кода ошибки, а затем обрабатывать ее со стороны приложения.

Вы можете найти полезные

ответил(а) 2015-12-08T14:16:00+03:00 5 лет, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема