要点: 在大多数情况下,C#SqlDataReader可以返回表,但只在一个单元测试用例中失败。但是,对于相同的测试,直接在Microsoft SQL Server 2016中运行存储过程将返回具有值的表。
详情: 代码输入@measures是DataTable类型。在大多数情况下,代码可以正确返回包含数据或空表的表。但是,当我将@measures设置为值为14的DataTable时(14是一个度量/事实的ID,并且过程应该返回一个int类型的列),datareader将不返回任何行,甚至不返回表的模式。 我尝试了其他有效的ID(度量),过程返回其他int列。他们都工作。
using (this._connection = new SqlConnection(this._connectionString))
{
SqlCommand command = new SqlCommand();
command.Connection = this._connection;
command.CommandText = "rpt_procedure";
command.CommandTimeout = this._config.ConfTimeOutSetting;
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("@measures", SqlDbType.Structured).Value = measures;
command.Parameters.Add("@parameter2", SqlDbType.Structured).Value = parameter2;
command.Parameters.Add("@Dates", SqlDbType.Structured).Value = Datetable;
command.Parameters.AddWithValue("@Gra", gra);
this._connection.OpenWithRetry(this.RetryPolicy);
using (SqlDataReader reader = command.ExecuteReader())
{
this.NumRow = 0;
DataTable schemaTable = reader.GetSchemaTable();
string[] colName = new string[colNum];
int startPoint = 0;
if (schemaTable == null)
MessageBox.Show("cannot get schema of table");
else
{
foreach (DataRow myField in schemaTable.Rows)
{
if (startPoint >= colNum)
break;
List<string> temp = new List<string>();
//For each property of the field...
colName[startPoint] = myField[schemaTable.Columns[0]].ToString();
startPoint++;
}
arrayList.Add(colName);
}
if (!reader.HasRows)
return arrayList;
while (reader.Read())
{
this.NumRow++;
string[] r = new string[colNum];
for (int i = 0; i < colNum; i++)
{
r[i] = reader[i].ToString();
}
arrayList.Add(r);
}
return arrayList;
}
}
返回值的SQL测试代码
declare @Measures tvpBigInt
insert into @Measures
select 14
declare @parameter2 tvpBigInt
insert into @parameter2
select 22
union
select 10
declare @Grain NVARCHAR(20)
select @Grain = 'Daily'
declare @Dates tvpDate
insert into @Dates
select '2016-12-30','2017-02-06'
exec rpt_procedure
@Measures = @Measures
@parameter2 = @parameter2
,@Gra = 'Daily'
,@Dates = @Dates
我根据以前的StackOverflow问题采取的行动:
两者都不起作用。