输出参数连接到C#中的方法的存储过程

时间:2012-06-04 19:58:10

标签: c# sql-server visual-studio-2008

你觉得这行公然错了:

commaSepString1 = com.Parameters["@CommaSepString"].Value.ToString();

它显示如下错误:

  

对象引用未设置为对象的实例。

简而言之,C#方法如下所示:

public static DataTable GetFilmDetails(string filmId, out string
commaSepString1)

它采用以下存储过程(它自己正确执行):

com.CommandText = "CatalogGetFilmDetails2";

由于 @CommaSepString是存储过程中的输出参数,因此在C#中我有:

param = com.CreateParameter();
param.ParameterName = "@CommaSepString";
param.Direction = ParameterDirection.Output;
param.DbType = DbType.String;
com.Parameters.Add(param);

commaSepString1 = com.Parameters["@CommaSepString"].Value.ToString();

如果您对存储过程感到好奇,它会像这样开始: CREATE PROCEDURE CatalogGetFilmDetails2

(@FilmID int, @CommaSepString VARCHAR(50) OUTPUT) AS

SP根据某些连接将一些行插入到表变量中,它将该表中x列的所有值放入一个逗号分隔值的字符串中:

SELECT @CommaSepString 
= STUFF((SELECT ', ' + Categ  FROM @Filme1 FOR XML PATH('')), 1,1,'')

然后选择表格。

感谢您耐心阅读本文。如果我发布存储过程和C#方法的整个代码,会更清楚吗?不确定我是否被允许并且担心它可能太冗长而无法阅读。

PS:commaSepString必须有错误!在我在两个地方添加代码之前,代码工作正常。

2 个答案:

答案 0 :(得分:1)

SQL Server不知道output,它只知道input/output。所以当你指定

param.Direction = ParameterDirection.Output;

SQL Server实际上也会读取字符串。由于您尚未提供值,因此SQL Server确定其长度为零。

令人难以置信的是,如果您指定幻数-1,SQL Server将为您确定大小:

param.Size = -1;

这可能是关于ADO.NET的第二个最糟糕的问题。 事实上,SQL NULL转换为DBNull.Value而不是null

答案 1 :(得分:0)

您应该在违规行上设置断点,然后检查参数集以检查参数是否存在。
如果存在,则检查其值是否为空 在这种情况下,.ToString()将为您提供所描述的错误。