Добавление параметров SQL через C# не работает, но жесткое кодирование в хранимой процедуре работает?

Я передаю идентификатор хранимой процедуре, и эта процедура возвращает мне XML (ну, должно быть). Если я не добавляю параметры из своего C#, а жестко запрограммирую их в моей процедуре, я получаю весь XML, который мне когда-либо нужен. С другой стороны, я ничего не понимаю, что касается XML-контента. Здесь есть какое-то разъединение, и буду признателен за любой совет!

Вот некоторые из моих C#:

public string BuildXml(string po)
{
    StringBuilder sb = new StringBuilder();

    using (var dbConn = new SqlConnection(ConnectString))
    {
        using (var command = new SqlCommand(
            "BuildXML", dbConn
        ))
        {
            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.Add(
                "@PONUM", SqlDbType.VarChar
            ).Value = po;

            command.Parameters.Add(
                "@EVERYTHING", SqlDbType.Xml
            ).Direction = ParameterDirection.Output;

            dbConn.Open();

            XmlReader xmlr = command.ExecuteXmlReader();

            xmlr.Read();

            while (xmlr.ReadState != ReadState.EndOfFile)
            {
                sb.AppendLine(xmlr.ReadOuterXml());
            }
        }
    }
}

Хранимая процедура довольно длинная, поэтому вот что я передаю:

@PONUM varchar(18),
@EVERYTHING XML OUTPUT

Если я закомментирую блоки кода "command.Parameters.Add" в C#, закомментирую вышеприведенные переменные и добавлю следующее в тело моей процедуры, все будет работать так, как должно:

DECLARE @EVERYTHING XML
DECLARE @PONUM varchar(18)
SET @PONUM = 100203130

C# не передает параметры или передает их неправильно? Процедура не получает их или получает их неправильно?

Спасибо за ваше время!


ОБНОВЛЕНИЕ 1: Согласно предложениям пользователя, явное предоставление выходного параметра и размера входного параметра ничего не изменило. Вот пересмотренный блок:

command.Parameters.Add(
    "@PONUM", SqlDbType.VarChar, 18
).Value = po;

//command.Parameters.Add(
//    "@EVERYTHING", SqlDbType.Xml
//).Direction = ParameterDirection.Output;

var output = new SqlParameter
{
    SqlDbType = SqlDbType.Xml,
    Direction = ParameterDirection.Output,
    ParameterName = "@EVERYTHING"
};

command.Parameters.Add(output);

0 ответов

Другие вопросы по тегам