如题,C#对ACESS数据库操作,
想加入一条记录:INSERT INTO test (name,dept) VALUES('abc','cba'),然后获得这得记录的主键ID,如何写代码,100分,要从头到尾的代码,没办法,太菜了点,呵呵。从这里开始:
OleDbConnection conn= new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; " + "Data Source=" + Server.MapPath("data/AddUnit.mdb"));

解决方案 »

  1.   

    After executing insert-query, you should get ID by executing "Select @@Identity"
      

  2.   

    楼上说的是SQL的吧,Access好像没这个内部变量。
      

  3.   

    在Insert之后执行
    SqlCommand cmd = new SqlCommand("Select top ID from test Order by id desc",cn);
    int iID = Convert.ToInt32(cmd.ExecuteScalar());
      

  4.   

    http://community.csdn.net/Expert/topic/4652/4652876.xml?temp=.4896204
      

  5.   

    OleDbConnection conn= new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; " + "Data Source=" + Server.MapPath("data/AddUnit.mdb"));OleDbCommand oc=new OleDbCommand();
    oc.Connection=conn;
    oc.CommandText="INSERT INTO test (name,dept) VALUES('abc','cba')  SELECT @@identity"
    int id=(int)oc.ExecuteScalar();
      

  6.   

    我也知道要用SELECT @@IDENTITY,但我不知道这一句是放在哪里执行,我用的是ADO.net.看别人的帖子上是VB的,不太明白,自己用C#写完后没报错,就是没更新,所以在这里求达人们写一个完整的代码,又不长,麻烦出手帮一下心嘛。我真不会搞了
             DataSet ds=new DataSet();
             string str="INSERT INTO"
    OleDbCommand command=new OleDbCommand(str,conn);
             command.CommandType = CommandType.Text;
    OleDbDataAdapter dp=new OleDbDataAdapter();
    dp.InsertCommand=command;
    command=new OleDbCommand("SELECT @@IDENTITY",conn);
    dp.SelectCommand=command;
    conn.Open();
    dp.Fill(ds);
    dp.Update(ds);
    这是我写的,好象不是这样的吧?!
      

  7.   

    //.....假设函数返回值是int类型,是那个id值
    using (OleDbConnection conn = new OleDbConnection("连接串"))
    {
        OleDbCommand cmd = new OleDbCommand("SQL语句", conn);
        conn.Open();
        return (int)cmd.ExecuteScalar();
    }
    不需要你自己close了.也不用什么DataSet,OleDbDataAdapter 浪费.....
      

  8.   

    CalvinDotNet(Calvin.Net) 的方法我试了一下,报错:“在 SQL 语句之后找到字符!”
      

  9.   

    你这里只有一条,那要比更新DataTable中的多条容易多了,你可以按以下实现进行参考,不过你的答案只需要其中一部分。如果还有问题发短消息给我。
    ====================
    对于包含自增长的多条数据更新到数据库反填回DataTable这个问题可以这样来解决,
    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没有必要,你可以只初始化一次,这里这么写只是为了说明过程,而且也没有必要多次打开或关闭连接。
      

  10.   

    其实,我上次也遇到过这样的问题,我是这样解决的:楼上的方面我不知道是否行得通,我没有测试,不过取最大值来选择ID很容易出错!我的方法:先取出你需要填写数据的ID值,再根据ID值,去更新你需要填写的内容
      

  11.   

    insert into tablename(fields……) values(values……)
    Select @@Identity
    执行后用DataReader读取就可以了。
      

  12.   

    也就是说string strSql=@"
    insert into tablename(fields……) values(values……)
    Select @@Identity
    ";
    然后用DataReader读取就可以了。