Добавление параметров 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);