rt

解决方案 »

  1.   

    如果是自增列,你可以用max函数呀,呵呵.但是如果考虑并发的话就需要一些技巧了,嘿嘿.
      

  2.   

    max的话,自增值不为1该怎么办
      

  3.   

    提得问题有点问题,换个思路行不?
    =================================
    按<ado.net技术内幕>中的介绍,这个问题可以这样来解决,
    DataColumn dc = dt.Columns["id"];//这一列对应的数据库中的表字段是自增列,
    在内存DataTable中进行批输入更新时不能马上得到新输入的上一条记录的主键,
    所以建立临时唯一主键如下:
    dc.AutoIncrement = true;//设置该列为自增长,
    dc.AutoIncrementSeed = -1;//新增列的初始值。
    dc.AutoIncrementStep = -1;//列的值自动递增的数值。默认为 1。
    这样你添加第一条新增数据的时候临时主键为-1,
    第二条为-2,
    ...
    在使用DataAdapter.Update(dt);进行更新的时候,
    如果数据源是Sql Server那使用存储过程输出参数把自增主键输出会自动更新新增的DataRow,
    比如上面的-1,-2,-3等自动会更新成实际数据库中的自增主键值。
    这种方式具体可以看我的一片文章,
    http://blog.csdn.net/zhzuo/archive/2004/08/06/67037.aspx
    如果是Access或其他数据库就有点麻烦,回填实现如下:
    注册DataAdapter.RowUpdated事件。
    da.RowUpdated += new OleDbRowUpdatedEventHandler(da_RowUpdated);
    事件处理程序,
    private static void da_RowUpdated(object sender, OleDbRowUpdatedEventArgs e)
    {
    if(e.Status == UpdateStatus.Continue && e.StatementType = StatementType.Insert)
    {
    OleDbConnection conn = new OleDbConnection("连接字符串");
    OleDbCommand comm = new OleDbCommand("SELECT @@IDENTITY",conn);
    conn.Open();
    e.Row["id"] = (int)comm.ExecuteScalar();//得到最新递增值更新到内存DataTable中刚更新的DataRow.
    e.Row.AcceptChanges();
    conn.Close();
    }
    }
    //处理程序中的每次生成conn,和comm没有必要,你可以只初始化一次,这里这么写只是为了说明过程,而且也没有必要多次打开或关闭连接。
      

  4.   

    ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconretrievingidentityorautonumbervalues.htm