我正在调用一个有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。
有人有任何想法吗?
答案 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字符串的字符串....
我不喜欢这个,因为代码应该更专业......反正......