Выходной параметр не возвращается из сохраненного процесса - PullRequest
3 голосов
/ 29 октября 2008

Я вызываю SQL-процесс, который имеет 3 параметра OUTPUT. После вызова процедуры один из параметров не возвращает значение, когда два других делают. Профилировщик показывает, что возвращаются все 3 значения.

Параметры указаны в процедуре следующим образом ...

@UsrVariableID INT OUTPUT,
@OrganisationName NVARCHAR(256) OUTPUT,
@Visible bit OUTPUT

и код, вызывающий процесс, выглядит следующим образом ...

cm.Parameters.AddWithValue("@OrganisationName", name);
cm.Parameters["@OrganisationName"].Direction = ParameterDirection.Output;
cm.Parameters.AddWithValue("@Visible", visible);
cm.Parameters["@Visible"].Direction = ParameterDirection.Output;

cm.ExecuteNonQuery();

name = cm.Parameters["@OrganisationName"].Value.ToString();
visible = bool.Parse(cm.Parameters["@Visible"].Value.ToString());
id = int.Parse(cm.Parameters["@UsrVariableID"].Value.ToString());

Неудачный параметр: @ OrganisationName.

Мне интересно, если это так, потому что параметр имеет тип string в коде, но NVARCHAR в proc.

У кого-нибудь есть идеи?

Ответы [ 7 ]

5 голосов
/ 29 октября 2008

С выходными параметрами, имеющими типы данных переменной длины (nvarchar, varchar и т. Д.), Я обнаружил, что более явный вывод приводит к лучшим результатам. В случае, если вы опубликовали, тип не указан на стороне C #. Я, вероятно, изменил бы вещи, чтобы они выглядели примерно так:

SqlParameter theOrganizationNameParam = new SqlParameter( "@OrganisationName", SqlDbType.NVarChar, 256 );
theOrganizationNameParam.Direction = ParameterDirection.Output;
cm.Parameters.Add( theOrganizationNameParam );
cm.ExecuteNonQuery();
name = theOrganizationNameParam.Value;

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

Надеюсь, это проливает свет.

2 голосов
/ 29 октября 2008

Вы могли бы сначала попытаться объявить параметры (затем установить значения), и посмотреть, будет ли это иметь значение.

cm.Parameters.Add["@OrganisationName", SqlDbType.NVarChar, 256].Direction = ParameterDirection.Output
cm.Parameters["@OrganisationName"].Value = name

Но для меня нет ничего плохого в том, что вы опубликовали.

Кстати, если вам не нужен .Parse (.ToString ()), вам нужно только разыграть.

visible = bool.Parse(cm.Parameters["@Visible"].Value.ToString());

становится

visible = (bool)cm.Parameters["@Visible"].Value;
1 голос
/ 29 октября 2008

Я не уверен на 100% в отношении MS SQL, но в .NET -> Oracle вам нужно указать размер буфера строки.

cm.Parameters["@OrganisationName"].Size = 256;
0 голосов
/ 07 июля 2010

Да, я пробовал здесь много вещей, и единственное, что работает: вам нужно указать РАЗМЕР строки.

У меня есть хранимая процедура, которая возвращает строку nvarchar (7), и на стороне C # .NET я указал размер = 255, и это работает для меня, чтобы получить строку из 7 символов ....

Мне это не понравилось, потому что код должен быть более опытным ... в любом случае ...

0 голосов
/ 06 мая 2009

На самом деле речь не идет об объявлении типа.

Для выходных параметров с переменным размером необходимо указать размер параметра.

cm.Parameters["@OrganisationName"].Size = 50;

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

Все это делает его плохо подходящим для возврата параметров с неизвестным размером, таких как nvarchar (max). Я бы рекомендовал возвращать значения через SELECT, а не через выходные параметры.

0 голосов
/ 06 мая 2009

Вместо этого используйте ParameterDirection.InputOutput - это работает

См. Последний комментарий здесь для получения дополнительной информации - http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework.adonet/topic28087.aspx

0 голосов
/ 30 октября 2008

Спасибо всем, как предложили Ади и Скотт, явно объявив, что тип в объявлении параметра решил эту проблему. Я выбрал ответ Скотта, поскольку он был более кратким.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...