【问题标题】:Convert datatable to datareader将数据表转换为数据阅读器
【发布时间】:2012-02-23 20:43:28
【问题描述】:

为了提高性能,我想将数据表转换为数据读取器。我不能通过查询来做到这一点。那么还有其他方法吗?

【问题讨论】:

    标签: c# ado.net


    【解决方案1】:

    我知道这是旧的,但这里的答案似乎错过了 OPs 问题的重点。

    DataTables 有一个名为CreateDataReader 的方法,它允许您将DataTable 转换为DbDataReader 对象。在这种情况下,DataTableReader

    DataTable table = new DataTable(); 
    //Fill table with data 
    //table = YourGetDataMethod(); 
    DataTableReader reader = table.CreateDataReader();
    

    我应该指出,这不会提高性能,因为您应该使用其中一种。

    这里有一些关于这个问题的更多资源:

    【讨论】:

      【解决方案2】:

      例如

      public DataTable ConvertDataReaderToDataTable(SqlDataReader dataReader)
      {
          DataTable datatable = new DataTable();
          DataTable schemaTable = dataReader.GetSchemaTable();
      
          try
          {
      
              foreach (DataRow myRow in schemaTable.Rows)
              {
                  DataColumn myDataColumn = new DataColumn();
                  myDataColumn.DataType = myRow.GetType();
                  myDataColumn.ColumnName = myRow[0].ToString();
                  datatable.Columns.Add(myDataColumn);
              }
              while (dataReader.Read())
              {
                  DataRow myDataRow = datatable.NewRow();
                  for (int i = 0; i < schemaTable.Rows.Count; i++)
                  {
                      myDataRow[i] = dataReader[i].ToString();
                  }
                  datatable.Rows.Add(myDataRow);
                  myDataRow = null;
              }
              schemaTable = null;
              return datatable;
          }
          catch (Exception ex)
          {
              Error.Log(ex.ToString());
              return datatable;
          }
      }
      

      【讨论】:

        【解决方案3】:

        使用 DataTable 构造函数,

        DataTable table = new DataTable(); 
        //Fill table with data 
        DataTableReader reader = new DataTableReader(table);
        

        好看!

        【讨论】:

          【解决方案4】:
          public DataTable GetTable(IDataReader _reader)
          {
              DataTable dataTable1 = _reader.GetSchemaTable();
              DataTable dataTable2 = new DataTable();
              string[] arrayList = new string[dataTable1.Rows.Count];
              for (int i = 0; i < dataTable1.Rows.Count; i++)
              {
                  DataColumn dataColumn = new DataColumn();
                  if (!dataTable2.Columns.Contains(dataTable1.Rows[i]["ColumnName "].ToString()))
                  {
                      dataColumn.ColumnName = dataTable1.Rows[i]["ColumnName "].ToString();
                      dataColumn.Unique = Convert.ToBoolean(dataTable1.Rows[i]["IsUnique "]);
                      dataColumn.AllowDBNull = Convert.ToBoolean(dataTable1.Rows[i]["AllowDBNull "]);
                      dataColumn.ReadOnly = Convert.ToBoolean(dataTable1.Rows[i]["IsReadOnly "]);
                      dataColumn.DataType = (Type)dataTable1.Rows[i]["DataType "];
                      arrayList[i] = dataColumn.ColumnName;
                      dataTable2.Columns.Add(dataColumn);
                  }
              }
              dataTable2.BeginLoadData();
              while (_reader.Read())
              {
                  DataRow dataRow = dataTable2.NewRow();
                  for (int j = 0; j < arrayList.Length; j++)
                  {
                      dataRow[arrayList[j]] = _reader[arrayList[j]];
                  }
                  dataTable2.Rows.Add(dataRow);
              }
              _reader.Close();
              dataTable2.EndLoadData();
              return dataTable2;
          }
          

          【讨论】:

          • 仅供参考,DataTable.Loan(DataReader) 可以做到这一点以及更多。尤其是使用 KeyInfo 创建阅读器时。
          猜你喜欢
          • 2015-10-17
          • 1970-01-01
          • 2015-03-14
          • 1970-01-01
          • 1970-01-01
          • 2016-04-27
          • 2018-05-11
          • 2013-01-25
          • 1970-01-01
          相关资源
          最近更新 更多