3

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

参数在过程中声明如下...

@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。

我想知道是不是因为参数在代码中是字符串类型,但在过程中是 NVARCHAR 类型。

有人有什么想法吗?

4

7 回答 7

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;

有了这个,您可以保证输出参数具有正确的数据类型,因此可以访问Value属性而不会引发异常。

希望这能有所启发。

于 2008-10-29T18:12:44.017 回答
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;
于 2008-10-29T17:48:56.390 回答
1

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

cm.Parameters["@OrganisationName"].Size = 256;
于 2008-10-29T17:52:58.833 回答
0

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

于 2008-10-30T08:50:14.683 回答
0

改用 ParameterDirection.InputOutput - 这行得通

有关更多信息,请参见此处的最后一条评论 - http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework.adonet/topic28087.aspx

于 2009-05-06T12:46:44.220 回答
0

实际上,这与声明类型无关。

对于不同大小的输出参数,需要指定参数大小。

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

我在某处读过,实现中存在一个错误,只要未为某些数据类型指定大小,就会引发异常。

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

于 2009-05-06T12:56:34.150 回答
0

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

我有一个返回字符串 nvarchar(7) 的存储过程,在 C#.NET 端我指定了 size=255,这对我来说可以接收 7 个字符的字符串....

我不喜欢这样,因为代码应该更专业......无论如何......

于 2010-07-07T16:01:27.260 回答