你觉得这行公然错了:
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必须有错误!在我在两个地方添加代码之前,代码工作正常。
答案 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()
将为您提供所描述的错误。