1

您是否看到这线明显有问题:

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 一定有问题!在我在这两个地方添加它之前,该代码运行良好。

4

2 回答 2

1

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

param.Direction = ParameterDirection.Output;

SQL Server 实际上也会读取该字符串。由于您没有提供值,SQL Server 确定其长度为零。

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

param.Size = -1;

这可能是关于 ADO.NET 的第二个最糟糕的问题。就在 SQLNULL转换为DBNull.Value而不是null.

于 2012-06-04T20:32:16.580 回答
0

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

于 2012-06-04T20:11:06.277 回答