都可以啊,可以利用DataAdapter的构造函数来满足“把符合条件的数据都查出来
然后填到DataSet中”这个要求。如:
用指定的 SQL SELECT 语句初始化 OracleDataAdapter 类的新实例。
用一个 SQL SELECT 语句和一个 OracleConnection 初始化 OracleDataAdapter 类的新实例。
使用 SQL SELECT 语句和连接字符串初始化 OracleDataAdapter 类的新实例。Fill方法:
Fill 方法使用关联的 SelectCommand 属性所指定的 SELECT 语句从数据源中检索行。与 SELECT 语句关联的连接对象必须有效,但不需要将其打开。如果调用 Fill 之前连接已关闭,则将其打开以检索数据,然后再将其关闭。如果调用 Fill 之前连接已打开,它将保持打开状态。然后,Fill 操作将行添加到 DataSet 中的目标 DataTable 对象,如果 DataTable 对象不存在,则创建这些对象。当创建 DataTable 对象时,Fill 操作通常只创建列名元数据。但是,如果 MissingSchemaAction 属性设置为 AddWithKey,则还会创建适当的主键和约束。如果 SelectCommand 返回 OUTER JOIN 的结果,则 DataAdapter 不为生成的 DataTable 设置 PrimaryKey 值。必须显式定义主键,确保正确地解析重复行。有关更多信息,请参见为表定义主键。如果数据适配器在填充 DataTable 时遇到重复列,它将以“columnname1”、“columnname2”、“columnname3”这种模式命名后面的列。如果传入数据包含未命名的列,它们将按“Column1”、“Column2”的模式放在 DataSet 中。向 DataSet 添加多个结果集时,每个结果集都放在一个单独的表中。将整数值追加到指定的表名从而对其他结果集进行命名(例如“Table”、“Table1”、“Table2”等)。在应用程序中使用列名和表名时应小心,一定不要与这些命名模式发生冲突。当用于填充 DataSet 的 SELECT 语句(例如批处理 SQL 语句)返回多项结果时,如果其中一项结果包含错误,则将跳过所有后面的结果并且不将其添加到 DataSet 中。您可以在同一个 DataTable 上多次使用 Fill 方法。如果主键存在,则传入行会与已有的匹配行合并。如果主键不存在,则传入行会追加到 DataTable 中。

解决方案 »

  1.   

    没太听明白你的意思
    应该是把符合条件的数据都查出来然后填到DataSet中
    因为sql语句不是已经限定条件了吗?
      

  2.   

    当然是先用SQL语句查询数据库,然后用DataAdapter.fill填充到数据库DataSet中。
      

  3.   

    fangxinggood(JustACoder) 讲的蛮详细的
      

  4.   

    你的 SQL 语句怎么写的
    DataSet 就得到什么样的数据。
      

  5.   

    string conStr = "User ID=sa; Database = NorthWind; data source = 192.168.1.110;";
    SqlConnection conn = new SqlConnection(conStr);
    string strselect = "select LastName,FirstName from employees";
    SqlDataAdapter sda=new SqlDataAdapter("select LastName,FirstName from employees",conn);
    DataSet ds=new DataSet();
    sda.Fill(ds,"employees");
    dgroom.DataSource = ds.Tables["employees"].DefaultView;
      

  6.   

    using System;
    using System.Data;
    using System.Data.SqlClient;namespace localhost

    /// <summary>
    /// 
    ///
    /// 
    ///
    ///
    /// </summary>
    public class AccessDB
    {

    private string Connectstr="server=(local);database=NanJingHotLine;uid=sa;pwd=sa";
    private SqlDataAdapter da;
    private SqlConnection Dataconnection;
    private DataSet ds;
    public AccessDB()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    }
    //打开连接
    // public string Get_cnnstr
    // {
    // get
    // {
    // return Connectstr;
    //
    // }
    // set
    // {
    // if(Connectstr!=value)
    // {
    // Connectstr=value;
    // }
    // }
    // } private void OpenConn()
    {
    log log=new log (); try
    {
    Dataconnection =new SqlConnection();
    if (Dataconnection.State ==ConnectionState.Closed)
    {
    Dataconnection.ConnectionString = Connectstr;
    Dataconnection.Open();
    }
    }
    catch(System.Exception e)
    {
    log.Save(e, "");
     
    }

    }
    //==================================================
    //关闭连接
    //===================================================
    private void CloseConn()
    {
    log log=new log ();
    try
    {
    if( Dataconnection.State == ConnectionState.Open)
    {
    Dataconnection.Close();
    }
    }
    catch(System.Exception e)
    {
    log.Save(e, "");
    } }

    // 事务处理一
    private void OpenTransConn()
    {
    log log=new log ();
    SqlConnection tmpConn;
    try
    {
    tmpConn =new  SqlConnection();
    tmpConn.ConnectionString = Connectstr;
    tmpConn.Open();
    }
    catch(System.Exception e)
    {
    log.Save(e, "");
    }

    }
    //事务处理二
    public void CloseTransConn(SqlConnection conn)
    {
    log log=new log ();
    try
    {
    if(conn.State == ConnectionState.Open)
    {
    conn.Close();
    }

    }
    catch(System.Exception e)
    {
    log.Save(e, "");
                    
    } }  
    //操作是否成功
    public Boolean UpdateDataBase(String sqlstr ) 
    {
    log log=new log ();
    try
    {
    OpenConn();
    SqlCommand cmdtables=new SqlCommand (sqlstr,Dataconnection);
    cmdtables.CommandType = CommandType.Text;
    cmdtables.ExecuteNonQuery();
    cmdtables = null;
    CloseConn();
    }
    catch(System.Exception e)
    {
    log.Save(e, "");
    return false;
    }
    return true; }
    // '************************************
    //'定义一个用于返回数据集的公共查询函数
    //'***********************************
    public DataSet GetDataFromDB( String sqlstr ) 
    {
    log log=new log ();
    try
    {
    OpenConn();
    da = new SqlDataAdapter(sqlstr, Dataconnection);
    ds = new DataSet();
    ds.Clear();
    da.Fill(ds);
    da = null;
    CloseConn();
    }
    catch(System.Exception e)
    {
    log.Save(e, "");                
    }
    finally
    {
    CloseConn();
    }
    if(ds.Tables.Count>0 || ds.Tables[0].Rows .Count  >=0 )
    {
    return ds;
    }
    else
    {
    return null;
    }
    }
    }}
      

  7.   

    可能是我没有说明白,比如我的sql语句是这样的select * from Table1 
    如果Table1中有10万条数据
    那么我调用DataAdapter.Fill(mydataSet,9,20,"mytable");
    我是从数据库中只得到20条数据,Fill到mydataSet中
    还是从数据库中得到10万条数据,然后Fill到mydataSet中10条。这两种情况的性能差别很大, fangxinggood(JustACoder)说的这个msdn上就有,我也看了,
    但是也许我太笨了,没看出来
    public int Fill(
       DataSet dataSet,
       int startRecord,
       int maxRecords,
       string srcTable
    );
    方法的实现机制,还请大家讨论一下,高手指点一、二。。
      

  8.   

    这个方法就是为了提高效率而设的,它的作用就是从数据库中得到20条数据,Fill到mydataSet中,其它的数据它就不管了,这样才会提高效率呀,不然,如果10万条记录都到本地了再Fill到DataSet里就没有什么意义了,呵呵
      

  9.   

    cloudy8(水云间)你是做过测试还是看到过相关说明?
    我也是这么想的就是在微软的文档中没有看出来他的明确说明。
      

  10.   

    (可能是我没有说明白,比如我的sql语句是这样的select * from Table1 
    如果Table1中有10万条数据
    那么我调用DataAdapter.Fill(mydataSet,9,20,"mytable");
    我是从数据库中只得到20条数据,Fill到mydataSet中
    还是从数据库中得到10万条数据,然后Fill到mydataSet中10条。)
    是从数据库中只得到20条数据,Fill到mydataSet中。
      

  11.   

    不对,只填充指定的条数,在DbDataAdapter.FillLoadDataRowChunk()里写的很清楚while ((num1 < maxRecords) && reader1.Read())
    {
        try
        {
          mapping.LoadDataRow(this.hasFillErrorHandler, flag1);
          num1++;
        }
        catch (Exception exception1)
        {
          this.FillErrorHandler(exception1, mapping.DataTable, mapping.DataValues);
        }
    }
      

  12.   

    因为是通用的方法,所以效率不可能很高。因为是在.net里面实现而不是在SQL Server里面实现,所以估计也不会省多少内存。(没做过测试,只是猜测)这样用的话,DataGrid的自动分页的功能就没有用了。呵呵,
      

  13.   

    我用三万条记录作了一下测试,
    private void Button1_Click(object sender, System.EventArgs e)
    {
    string cnstring ="user id=sa;password=sa;server=.;initial catalog=table";
    string str = "select NewsID as ID, Title  as  标题, Source as 来源, FileName as 文件名, AddedDate as 添加日期 from newsIMIT$ order by NewsID desc";
    SqlConnection cn = new SqlConnection(cnstring);
    DataSet ds = new DataSet();
    SqlDataAdapter da = new SqlDataAdapter(str,cn);
    da.Fill(ds,1,10,"aaa");//方法一
    //da.Fill(ds);         //方法二
    DG.DataSource=ds;  
    DG.DataBind();
    }方法二是一般的用法,
    占用内存方面:
    1. SQL Server占用的内存,两种方法基本一致。
    2.对于方法一,.net占用的内存要少于方法二。占用CPU方面,方法一要小于方法二。由于测试的数据只有三万条,效果不是很明显,尤其是在反应时间上。但是从内存占用上看,SQL Server 执行的部分应该没有变化,在.net方面只是是把10条记录放到了DataSet里面,所以减少了.net占用的内存。改用10万条记录时,反应时间明显增加。SQL Server占用的内存也要比三万条的时候高。net占用的内存没有变化。
    小数据量的时候,失去了DataGrid 的自动分页的功能;数据量大的时候,不能有效的节约内存,反应时间也比较长。综上所述,我觉得没有什么大用处:)
      

  14.   

    DataAdapter的Fill方法,给楼主明确一下,这也是我看了《Ado.net 技术内幕》后才明确的。
    DataAdapter.Fill方法虽然提供了分页的方法,但此方法只会影响存储在DataSet中的行。
    举个例子:
    你要查询一个表有1000行记录,每页获取20条,下面调用会将查询的最后20行存储在DataSet 
    中:
    DataAdapter.Fill(DataSet,980,20,"Products");
    但实际上查询返回的仍是1000行(翻译过来说成100行了)。只不过DataAdapter将前49页删除去了。
    可见效率是不高的。
    回过头来想想,DataAdapter要获取数据不就是调用SelectCommand,他不可能去改变Command对象的CommandText属性的。
    如果楼主还有疑问请看《Ado.net 技术内幕》第5章 用DataAdapter对象获取数据。
    (第147页)
      

  15.   

    再补充一下,根据SelectCommand对象获取数据,这里也就是取所有数据,
    至少在ado.net 1.0 或 1.1上面是这样。ado.net2.0上就不清楚了。