输出参数未从存储过程返回

时间:2008-10-29 17:39:32

标签: c# .net sql-server stored-procedures ado.net

我正在调用一个有3个OUTPUT参数的SQL proc。在调用proc之后,其中一个参数没有返回其他两个值时的值。 Profiler显示正在返回所有3个值。

para ...在proc ...中声明如下:

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

并且调用proc的代码就是这样......

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。

我想知道它是否因为param在代码中是字符串类型而在proc中是NVARCHAR。

有人有任何想法吗?

7 个答案:

答案 0 :(得分:5)

对于具有可变长度数据类型(nvarchar,varchar等)的输出参数,我发现更明确可以带来更好的结果。在您发布的情况下,未在C#端指定类型。我可能会改变一些事情,如下所示:

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

通过这种方式,您可以保证输出paratmer具有正确的数据类型,因此可以在不抛出异常的情况下访问 Value 属性。

希望这会有所启发。

答案 1 :(得分:2)

您可以先尝试声明参数(然后设置值),看看是否会产生影响。

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;

答案 2 :(得分:1)

我不是100%肯定MS SQL,但在.NET - > Oracle中你需要指定字符串缓冲区大小。

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

答案 3 :(得分:0)

谢谢大家,正如Ady和Scott所建议的那样明确地声明参数声明中的类型解决了它。我选择了Scotts的答案,因为它更简洁。

答案 4 :(得分:0)

使用ParameterDirection.InputOutput代替 - 这可行

有关详细信息,请参阅此处的最新评论 - http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework.adonet/topic28087.aspx

答案 5 :(得分:0)

实际上,并不是要声明类型。

对于大小不同的输出参数,必须指定参数大小。

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

我已经在某处看到,实现中存在一个错误,只要没有为某些数据类型指定大小,就会引发异常。

整个事情使它非常适合返回未知大小的参数,例如nvarchar(max)。我建议通过SELECT而不是通过输出参数返回值。

答案 6 :(得分:0)

是的,我在这里尝试了很多东西,唯一有用的是:你需要指定字符串的大小。

我有一个返回字符串nvarchar(7)的storedprocedure,在C#.NET端我指定了size = 255,这对我来说是一个7字符串的字符串....

我不喜欢这个,因为代码应该更专业......反正......