代码之家  ›  专栏  ›  技术社区  ›  Matt

试图加载数据集,但它始终为空。常规sqlReader.getValue()不是

  •  0
  • Matt  · 技术社区  · 15 年前

    我很少使用数据集。通常我会使用一个ORM或者只是一个基本的sqlreader.read(),后面跟着一些getValues()。我正在研究一些到处都有数据集的遗留代码,当修复一个bug的时候,我正试图擦干其中的一部分。

    但是,我似乎无法将数据实际加载到非类型化数据集中。

    public static DataSet ExecuteStoredProcedure(string storedProcedure, DBEnum db, IEnumerable<SqlParameter> parameters)
    {
        DataSet result = new DataSet();
        using (SqlConnection connection = SqlHelper.GetSqlConnection(db))
        {
            SqlCommand command = connection.CreateCommand();
            command.CommandType = CommandType.StoredProcedure;
            command.CommandText = storedProcedure;
    
            if (parameters != null)
                foreach (SqlParameter parameter in parameters)
                    command.Parameters.Add(parameter);
    
            connection.Open();
            DataTable table = new DataTable();
            using (SqlDataReader reader = command.ExecuteReader())
            {
                table.Load(reader);
            }
            result = table.DataSet; // table.DataSet is always empty!
       }
       return result;
    }
    

    我假设table.load(reader)执行所有必要的reader.read()调用…但是我继续尝试在table.load()之前使用reader.read()和不使用reader.read(),但都没有用。

    我知道被调用的存储过程实际上正在返回数据。如果我这样做,我会看到数据很好:

    using(SqlDataReader reader = command.ExecuteReader())
    {
        reader.Read();
        object test = reader.GetValue(0); // returns the expected value
    }
    

    似乎我错过了一些简单的东西,但我已经在这上面挠头了一段时间了。

    这是在.NET 3.5中。

    5 回复  |  直到 14 年前
        1
  •  2
  •   Tim Cooper    14 年前

    如果可以,我建议使用 SqlDataAdapter 填充 DataTable

    using(SqlDataAdapter sqlDA = new SqlDataAdapter(command))
    {
        sqlDA.Fill(table);
    }
    
        2
  •  0
  •   DaveWilliamson    15 年前

    您的逻辑显示数据表正在从读卡器加载数据,但数据表从未添加到数据集。

        3
  •  0
  •   Slider345    15 年前

    我认为应该首先创建数据集。实际上,您可以使用DataSet.Load而不是DataTable.Load。dataset.load应该创建数据表,但它不会以另一种方式工作。

        4
  •  0
  •   Chris    15 年前

    数据集包含的数据表不是反过来的。因此,如果您希望创建一个要返回的数据集,那么您可能需要创建一个新的数据集,然后在返回之前将数据表添加到其中。如果数据表不在数据集中,则对其父数据集的引用将始终为空。

    尽管如此,我还是推荐JasonEvans使用teh sqldataadapter的建议。

        5
  •  0
  •   eoldre    15 年前

    将数据集视为表的集合,以及有关表之间关系的可选信息。

    在示例代码中,您正在创建不属于数据集的独立表。要实事求是地创建属于数据集的表,可以执行以下操作:

    DataSet ds = new DataSet();
    DataTable dt = ds.Tables.Add();
    //or
    ds.Tables.Add(MyAlreadyCreatedTable);
    

    上面的JasonEvans也是正确的,正如他演示的那样,使用sqldataadaptors填充数据表和数据集要简单得多。

    最后,您所编写的方法意味着返回一个数据集。但它只从它调用的存储过程中捕获单个结果集。一个过程可能返回任意数量的独立结果。

    您只需更改以下内容:

        DataTable table = new DataTable();
        using (SqlDataReader reader = command.ExecuteReader())
        {
            table.Load(reader);
        }
    

    //you can skip creating a new DataTable object
    using (SqlDataAdapter da = new SqlDataAdapter(command))
    {
        da.Fill(result); // the result set you created at the top
    }