要求包含數據

解决方案 »

  1.   

    简单给你一个思路
    DataTable dt=new DataTable();
    DataRow row=new DataRow();while(reader.Read())
    {
      row["xxx"]=reader["xxx"];
      dt.Rows.Add(row);
    }大概就这个意思,代码是随手写的,可能有不对的地方,你自己测试吧!
      

  2.   

    DataTable dt=new DataTable();
    DataRow row;
    while(reader.Read())
    {
      row=new DataRow();  row["xxx"]=reader["xxx"];
      dt.Rows.Add(row);
    }
      

  3.   

    樓上的朋友,如果這麼簡單,我就不會出200分來問了。第一這樣不是通用的,而且速度根本沒有DataAdapter快。
      

  4.   

    不過還是謝謝 greatbag的熱心。
      

  5.   

    那么是什么地方不简单呢?.NET Framework 2.0用DataTable.Load方法。
      

  6.   

    請Ivony(授人以鱼不如授人以渔,上海谋生)給出具體的代碼好嗎?謝謝!
      

  7.   

    SqlDataReader dr=cmd.ExecuteReader();
            dt.Load(dr);就这样?
      

  8.   

    为什么要用DataReader返回一个DataTable?
      

  9.   

    LZ是否以后用DataReader读数据给DataTable,比用DataAdapter填充快??。
      

  10.   

    为什么要用DataReader返回一个DataTable?
    DataAdapter填充是最快的
      

  11.   

    /// <summary>
        /// 将DataReader转为DataTable
        /// </summary>
        /// <param name="DataReader">DataReader</param>
        public static DataTable ConvertdrTodt(SqlDataReader dataReader)
        {
            ///定义DataTable
            DataTable datatable = new DataTable();        ///动态添加表的数据列
            for (int i = 0; i < dataReader.FieldCount; i++)
            {
                DataColumn mydc = new DataColumn();
                mydc.DataType = dataReader.GetFieldType(i);
                mydc.ColumnName = dataReader.GetName(i);
                datatable.Columns.Add(mydc);
            }        ///添加表的数据
            while (dataReader.Read())
            {
                DataRow mydr = datatable.NewRow();
                for (int i = 0; i < dataReader.FieldCount; i++)
                {
                    mydr[i] = dataReader[i].ToString();
                }
                datatable.Rows.Add(mydr);
                mydr = null;
            }
            ///关闭数据读取器
            dataReader.Close();
            return datatable;
        }
      

  12.   

    楼上的朋友的代码我没有测试,因为还是做不到通用,SqlDataReader dataReader,我指的是DataReader,而不是SqlDataReader,对于并非SQLServer的异构数据库来说,此方法不通用。
      

  13.   

    //from MSDN
    Private Function ReaderToTable(ByVal reader As SqlClient.SqlDataReader) As DataTable    Dim newTable As New DataTable()
        Dim col As DataColumn
        Dim row As DataRow
        Dim i As Integer    For i = 0 To reader.FieldCount - 1        col = New DataColumn()
            col.ColumnName = reader.GetName(i)
            col.DataType = reader.GetFieldType(i)        newTable.Columns.Add(col)
        Next    While reader.Read        row = newTable.NewRow()
            For i = 0 To reader.FieldCount - 1
                row(i) = reader.Item(i)
            Next        newTable.Rows.Add(row)
        End While    Return newTable
    End Function//不知道翻译得对不对
    private DataTable ReaderToTable(IDataReader reader)
    {
        DataTable Result = new DataTable();    for (int i = 0; i < reader.FieldCount; i++)
        {
            DataColumn col = new DataColumn();
            col.ColumnName = reader.GetName(i);
            col.DataType = reader.GetFieldType(i);
            Result.Columns.Add(col);
        }
        while (reader.Read())
        {
            DataRow row = Result.NewRow();
            for (int i = 0; reader.FieldCount; i++)
            {
                row[i] = reader[i];
            }
            Result.Rows.Add(row);
        }
        return Result;
    }
      

  14.   

    谢谢伴水,晚些时候再测试,什么时候跑到.NET来混了?
      

  15.   

    伴水的代碼有點小筆誤,不過無傷大雅,測試通過,但速度比DataAdapter慢上一倍,實用性不強,不過我也隻是用來測試用的,隻是想做一系列綜合測試而已。現在問題是我同時提的:請問如何返回一個DataSet?
      

  16.   

    <script   language="VB"   runat="server">   
        
              Sub   Page_Load(Sender   As   Object,   E   As   EventArgs)     
        
                      Dim   DS   As   DataSet   
                      Dim   MyConnection   As   SqlConnection   
                      Dim   MyCommand   As   SqlDataAdapter   
        
                      MyConnection   =   New   SqlConnection("server=(local);database=northwind;Trusted_Connection=yes")   
                      MyCommand   =   New   SqlDataAdapter("Ten   Most   Expensive   Products",   MyConnection)   
        
                      MyCommand.SelectCommand.CommandType   =   CommandType.StoredProcedure   
        
                      DS   =   new   DataSet()   
                      MyCommand.Fill(DS,   "产品")   
        
                      MyDataGrid.DataSource=DS.Tables("产品").DefaultView   
                      MyDataGrid.DataBind()   
              End   Sub   
        
      </script>   
      

  17.   

    public static DataTable ConvertDataReaderToDataTable(IDataReader reader)
            {
                DataTable datatable = new DataTable();
                int fieldCount = reader.FieldCount;
                try
                {
                    for (int i = 0; i < fieldCount; ++i)
                    {
                        datatable.Columns.Add(reader.GetName(i), reader.GetFieldType(i));
                    }
                    datatable.BeginLoadData();
                    object[] objValues = new object[fieldCount];                while (reader.Read())
                    {
                        reader.GetValues(objValues);
                        datatable.LoadDataRow(objValues, true);
                    }
                    reader.Close();
                    datatable.EndLoadData();
                }
                catch (Exception error)
                {
                    System.Web.HttpContext.Current.Server.Transfer("Error.aspx?ErrorMessage=" + error);
                }
                return datatable;
            }
      

  18.   

    forgot(忘记forgot2000) ( ) 信誉:100    Blog   加为好友  2007-05-04 08:35:58  得分: 0  
     
     
       伴水的代碼有點小筆誤,不過無傷大雅,測試通過,但速度比DataAdapter慢上一倍,實用性不強,不過我也隻是用來測試用的,隻是想做一系列綜合測試而已。現在問題是我同時提的:請問如何返回一個DataSet?
      
     
    DataAdapter 内部也是这样实现的,只不过不采用object这类方法。
    string就用GetString(int i),这样速度能提高10%左右。
    DataSet是由DataTable组成的,难道你不知道?上面已经生成DataTable了……
      

  19.   

    to forgot 混了快两个月了,研究一下C#和Delphi之间微妙的差别
      

  20.   

    Eri(NULL) ( ) ,那麼請問如何返回DataSet?謝謝leo32_32(cwg) ( ),你的代碼比伴水的稍快,但還是遠遠比不上DataAdapter,當然,這也是很正常的事。
      

  21.   

    public DataTable ProductShow(int cid)
            {
               //...            DataTable dt = new DataTable();
                dt.Columns.Add("ID", typeof(int));
                dt.Columns.Add("Name", typeof(string));            //...
                DataRow dr = null;            while (rdr.Read())
                {
                    dr = dt.NewRow();
                    dr["ID"] = rdr.GetInt32(0);
                    dr["Name"] = rdr.GetString(1);
                    //......
                    dt.Rows.Add(dr);
                 }
                 return dt;
            }
      

  22.   

    forgot(忘记forgot2000) ( ) 信誉:100    Blog   加为好友  2007-5-4 14:59:07  得分: 0  
     
     
       
    Eri(NULL) ( ) ,那麼請問如何返回DataSet?----有DataTable了,还怕没有DataSet?
    DataSet.Tables.Add(DataTable)
    然后在返回这个DataSet就可以了。
     
      

  23.   

    这问题是问什么?
    是问.net类库里有没有现成的方法吧?根据上述应该是没有了,
    那就是问怎么样搞性能更高咯?可见楼主问问题并没有描述清楚~~bs一下~~
      

  24.   

    public int Fill(DataTable dataTable, object ADODBRecordSet)
    {
        int num;
        IntPtr hScp;
        PermissionSet set = new PermissionSet(PermissionState.None);
        set.AddPermission(OleDbConnection.ExecutePermission);
        set.AddPermission(new SecurityPermission(SecurityPermissionFlag.UnmanagedCode));
        set.Demand();
        Bid.ScopeEnter(out hScp, "<oledb.OleDbDataAdapter.Fill|API> %d#, dataTable, ADODBRecordSet\n", base.ObjectID);
        try
        {
            if (dataTable == null)
            {
                throw ADP.ArgumentNull("dataTable");
            }
            if (ADODBRecordSet == null)
            {
                throw ADP.ArgumentNull("adodb");
            }
            num = this.FillFromADODB(dataTable, ADODBRecordSet, null, false);
        }
        finally
        {
            Bid.ScopeLeave(ref hScp);
        }
        return num;
    }  private int FillFromADODB(object data, object adodb, string srcTable, bool multipleResults)
    {
        string sourceTableName;
        bool incrementResultCount;
        bool flag = multipleResults;
        Bid.Trace("<oledb.IUnknown.QueryInterface|API|OLEDB|ADODB> ADORecordsetConstruction\n");
        UnsafeNativeMethods.ADORecordsetConstruction recordset = adodb as UnsafeNativeMethods.ADORecordsetConstruction;
        UnsafeNativeMethods.ADORecordConstruction record = null;
        if (recordset != null)
        {
            if (multipleResults)
            {
                Bid.Trace("<oledb.Recordset15.get_ActiveConnection|API|ADODB>\n");
                if (((UnsafeNativeMethods.Recordset15) adodb).get_ActiveConnection() == null)
                {
                    multipleResults = false;
                }
            }
        }
        else
        {
            Bid.Trace("<oledb.IUnknown.QueryInterface|API|OLEDB|ADODB> ADORecordConstruction\n");
            record = adodb as UnsafeNativeMethods.ADORecordConstruction;
            if (record != null)
            {
                multipleResults = false;
            }
        }
        int num = 0;
        if (recordset == null)
        {
            if (record == null)
            {
                throw ODB.Fill_NotADODB("adodb");
            }
            num = this.FillFromRecord(data, record, srcTable);
            if (flag)
            {
                this.FillClose(false, record);
            }
            return num;
        }
        int index = 0;
        object[] objArray = new object[1];
    Label_0068:
        sourceTableName = null;
        if (data is DataSet)
        {
            sourceTableName = GetSourceTableName(srcTable, index);
        }
        num += this.FillFromRecordset(data, recordset, sourceTableName, out incrementResultCount);
        if (multipleResults)
        {
            object ppiRs;
            object recordsAffected;
            objArray[0] = DBNull.Value;
            Bid.Trace("<oledb.Recordset15.NextRecordset|API|ADODB>\n");
            OleDbHResult result = ((UnsafeNativeMethods.Recordset15) adodb).NextRecordset(out recordsAffected, out ppiRs);
            Bid.Trace("<oledb.Recordset15.NextRecordset|API|ADODB|RET> %08X{HRESULT}\n", result);
            if (OleDbHResult.S_OK > result)
            {
                if (((OleDbHResult) (-2146825037)) != result)
                {
                    UnsafeNativeMethods.IErrorInfo ppIErrorInfo = null;
                    UnsafeNativeMethods.GetErrorInfo(0, out ppIErrorInfo);
                    string message = string.Empty;
                    if (ppIErrorInfo != null)
                    {
                        ODB.GetErrorDescription(ppIErrorInfo, result, out message);
                    }
                    throw new COMException(message, (int) result);
                }
            }
            else
            {
                adodb = ppiRs;
                if (adodb != null)
                {
                    Bid.Trace("<oledb.IUnknown.QueryInterface|API|OLEDB|ADODB> ADORecordsetConstruction\n");
                    recordset = (UnsafeNativeMethods.ADORecordsetConstruction) adodb;
                    if (incrementResultCount)
                    {
                        index++;
                    }
                    if (recordset != null)
                    {
                        goto Label_0068;
                    }
                }
            }
        }
        if ((recordset != null) && (flag || (adodb == null)))
        {
            this.FillClose(true, recordset);
        }
        return num;
    }
      

  25.   

    Eri(NULL) ( ) ,那麼請問如何返回DataSet?----有DataTable了,还怕没有DataSet?
    DataSet.Tables.Add(DataTable)
    然后在返回这个DataSet就可以了。請給出具體代碼,謝謝!
      

  26.   

    DataReader只是提供一个只读向前的快速读取器,要返回DataTable又何必用DataReader呢,你不明白这些类该用在什么时候,要返回DataTable就用DataAdapter.Fill()
      

  27.   

    lz似乎是既想要dataset的通用,又想要datareader的速度吧?
      

  28.   

    forgot(忘记forgot2000) : 楼主 你去查MSDN 上面明确说了,DataReader 和 DataSet 一个速度块,一个数据关系强, 还没见微软能结合俩者的优点的东西出来。