1、我想通过查找,在dataset中定位一条记录。
2、如何遍力数据集,像bcb中,
while(dataset->Eof())
{
  //do something;
  dataset->MoveNext();
}

解决方案 »

  1.   

    送你一段源码,该类已经用于我的一个大型WINDOWS应用中。using System;
    using System.Data;
    using System.Data.OleDb;
    using System.Windows.Forms;
    using ProductLine.PubUtilities;
    using ProductLine.PubComponents;namespace ProductLine.DataAccess
    {
    /// <summary>
    /// Summary description for DataBuffer.
    /// </summary>
    public class DataBuffer
    {
    public DataBuffer()
    {
    m_nIndex = -1;
    }
    //数据库相关的局部变量
    protected Int32 m_nIndex;
    protected System.Data.OleDb.OleDbConnection m_conn;
    protected System.Data.OleDb.OleDbDataAdapter m_da;
    protected System.Data.OleDb.OleDbCommandBuilder m_cb;
    protected System.Data.DataTable m_dt;
    protected System.Data.DataRow m_dr;
    protected System.Data.DataSet m_ds;
    private System.Data.DataView m_dv;
    private System.Data.DataRowView m_drv;
    protected string m_tableName;
    string m_sql; #region 数据缓冲集操作:移动、增、删、改、查
    /// <summary>
    /// 移动到记录集开始
    /// </summary>
    public void RecMoveFirst()
    {
    m_nIndex = 0;
    } /// <summary>
    /// 移动到记录集末尾
    /// </summary>
    public void RecMoveLast()
    {
    m_nIndex = m_dv.Count -1;
    } /// <summary>
    /// 向前移动一个记录
    /// </summary>
    public void RecMovePrev()
    {
    if(m_nIndex>0)
    m_nIndex --;
    } /// <summary>
    /// 向后移动一个记录
    /// </summary>
    public void RecMoveNext()
    {
    if(m_nIndex < m_dv.Count-1)
    m_nIndex ++;
    } /// <summary>
    /// 新增一条记录
    /// </summary>
    public bool RecInsert()
    {
    DataRowView drv = m_dv.AddNew();
    drv.BeginEdit();
    drv.EndEdit();
    m_nIndex = m_dv.Count -1;
    return true;
    } /// <summary>
    /// 删除当前记录
    /// </summary>
    public bool RecDelete()
    {
    try
    {
    m_dv.Delete(m_nIndex);
    }
    catch(System.Data.OleDb.OleDbException e )
    {
    System.Windows.Forms.MessageBox.Show(e.Message);
    } return true;
    }
    #endregion #region 数据库操作:打开、关闭、读(加载、刷新)、写
    // /// <summary>
    // /// 
    // /// </summary>
    // /// <param name="conn"></param>
    // /// <param name="dataAdapter"></param>
    // /// <param name="cb"></param>
    // /// <param name="dt"></param>
    // /// <param name="ds"></param>
    // /// <param name="tableName"></param>
    // /// <param name="recStatus"></param>
    // /// <param name="nIndex"></param>
    // /// <returns></returns>
    // public bool SetVariables(OleDbConnection conn,
    // OleDbDataAdapter dataAdapter,
    // OleDbCommandBuilder cb,
    // DataSet ds,
    // string tableName,
    // Int32 nIndex
    // )
    // {
    // if(conn != null) m_conn = conn;
    // if(dataAdapter != null) m_da = dataAdapter;
    // if(cb != null) m_cb = cb;
    // if(ds != null) m_ds = ds;
    // m_tableName = tableName;
    // m_nIndex = nIndex;
    // m_dt = m_ds.Tables[tableName];
    // if (m_dt != null)
    // {
    // m_dv = m_dt.DefaultView ;
    // m_dv.AllowDelete = true;
    // m_dv.AllowEdit = true;
    // m_dv.AllowNew = true;
    // }
    // return true;
    // } /// <summary>
    /// 关闭数据集
    /// </summary>
    public bool RecClose()
    {
    if(!UtilDB.CloseObject(m_da)) return false;
    if(!UtilDB.CloseObject(m_ds)) return false;
    return true;
    } /// <summary>
    /// 刷新记录集,从数据库中的同步数据
    /// </summary>
    /// <param name="conn">已初始化的连接</param>
    /// <param name="strSql">SQL语句(一般情况下为Select语句)</param>
    /// <param name="strTableName">记录集中的表名</param>
    /// <returns>true:成功 false:失败</returns>
    public bool LoadData(OleDbConnection conn,string strSql,string strTableName)
    {
    try
    {
    if(null != conn)
    {
    m_conn = conn;
    m_ds = new DataSet();
    m_da = new OleDbDataAdapter(strSql,m_conn);
    m_cb = new OleDbCommandBuilder(m_da);
    m_tableName = strTableName;
    }
    if(null != m_ds.Tables[m_tableName])
    {
    m_ds.Tables.Remove(m_tableName);
    }
    m_da.Fill(m_ds,m_tableName);
    m_dt = m_ds.Tables[m_tableName];
    m_dv = m_dt.DefaultView;
    m_sql = strSql;
    }
    catch(OleDbException e)
    {
    MessageBox.Show(e.ToString());
    return false;
    }
    return true;
    }

    /// <summary>
    /// 取消修改,不保存入DB
    /// </summary>
    /// <returns></returns>
    public bool RejectChange()
    {
    m_ds.RejectChanges();
    return true;
    }
    /// <summary>
    /// 刷新数据,virtual函数,有待子类override
    /// </summary>
    /// <returns>true:成功  false:失败</returns>
    public bool RefreshData(OleDbConnection conn)
    {
    if(conn == null)
    return LoadData(m_conn,m_sql,m_tableName);
    else
    return LoadData(conn,m_sql,m_tableName);
    } /// <summary>
    /// 保存入数据库
    /// </summary>
    /// <returns>true:成功/false失败</returns>
    public bool SaveToDatabase()
    {
    int rowCount=0;
    return UtilDB.SaveToDatabase(m_ds,m_da,m_tableName,ref rowCount);
    } #endregion #region 其它
    /// <summary>
    /// 取得当前的位置信息描述,常用于显示状态
    /// </summary>
    /// <returns>记录位置的描述</returns>
    public string GetPositionDesc(RecStatus recStatus)
    {
    switch(recStatus)
    {
    case RecStatus.Inserting:
    return  m_dv.Count.ToString() + "/" + m_dv.Count.ToString();
    case RecStatus.NoData:
    return "0/0";
    default: //其它状态时
    return (m_nIndex+1).ToString() + "/" + m_dv.Count.ToString();
    }
    }
    public string GetPositionDesc()
    {
    return (m_nIndex+1).ToString() + "/" + m_dv.Count.ToString();
    } /// <summary>
    /// 判断状态是否合法,不合法返回合法的状态。
    /// </summary>
    /// <param name="recStatus">待检验状态</param>
    /// <returns>合法状态</returns>
    public RecStatus ValidateStatus(RecStatus recStatus)
    {
    if(m_dv.Count<=0 && recStatus == RecStatus.Browsing)
    return RecStatus.NoData;
    return recStatus;
    } /// <summary>
    /// 判断记录索引是否合法,不合法进行修改并返回
    /// </summary>
    /// <returns>合法的索引</returns>
    public int ValidateIndex()
    {
    int nUpBound;
    nUpBound = m_dv.Count - 1;
    if(nUpBound < 0)
    return -1;
    if(m_nIndex < 0)
    m_nIndex = 0;
    if(m_nIndex > nUpBound)
    m_nIndex = nUpBound;
    return m_nIndex;
    }
    /// <summary>
    /// 数据集
    /// </summary>
    public DataView DataView
    {
    get
    {
    return m_dv;
    }
    } /// <summary>
    /// 当前的记录索引,0开始
    /// </summary>
    public int RowIndex
    {
    get
    {
    return m_nIndex;
    }
    set
    {
    m_nIndex = value;
    ValidateIndex();
    }
    }
    #endregion /// <summary>
    /// 按给定参数排序
    /// </summary>
    public void Sort(SortParam sortParam)
    {
    if(m_dv == null)
    return;
    m_dv.Sort = m_dv.Table.Columns[sortParam.nIndex].ColumnName+ " " + 
    (sortParam.nUp1Down2None0 == 1 ? "" : "DESC");
    } public void SetColumns(System.String strCaption)
    {
    string[] strCaptions;
    strCaptions = strCaption.Split(new Char[]{'|'});
    int nMax;
    nMax = System.Math.Min(m_dt.Columns.Count,strCaptions.GetUpperBound(0));
    for(int i = 0;i<=nMax;i++)
    {
    m_dt.Columns[i].Caption = strCaptions[i];
    }
    } public OleDbConnection GetConn()
    {
    return m_conn;
    } }
    }
      

  2.   

    你通过m_nIndex记录当前游标位置,当我查询记录集中的某条记录的时候,你怎么定位m_nIndex?
    在c#中查询记录的时候,可以返回当前的记录号吗?