在某些情况下,C#DataReader在Sql server返回值时返回null

时间:2017-02-07 18:41:23

标签: c# sql sql-server database

要点: 在大多数情况下,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问题采取的行动:

  1. 尝试过dataadapter
  2. 尝试执行emptenonquery cmd.ExecuteNonQuery();
  3. 两者都不起作用。

0 个答案:

没有答案