日期:2014-05-18  浏览次数:20471 次

Access数据库,用@@identity为什么得不到正确的自动增长列的值.
public   int   InsertProduct(string   smallUrl,string   bigUrl,string   proName)
        {
                string   sql   =   "insert   into   [product]   (   smallImgUrl,bigImgUrl,proName)   values( ' "+smallUrl+ " ', ' "+bigUrl+ " ', ' "+proName+ " ') ";
                OleDbConnection   conn   =   db.GetConn();
                OleDbCommand   com   =   new   OleDbCommand();
                com.Connection   =   conn;
                com.CommandText   =   sql;
                conn.Open();
                com.ExecuteNonQuery();
               
                        com.CommandText= "select   @@identity ";
                        com.Connection   =   conn;
                        int   i=Convert.ToInt32(com.ExecuteScalar());
                        conn.Close();
                        return   i;
             
                //else   {   return   0;   }              
        }

这是我写的一个方法,传了三个参数进来.插入数据后马上用@@identity查询,得到的值完全不对头.比如实际上数字都到40了,得的值才20几.
我在Access中用它的查询分析器,插入后再查询,值却是正确的.
望大侠赐教.

------解决方案--------------------
Access,没有@@identity吧,

只能使用Select语句取出最大的值。
------解决方案--------------------
用 ADO/ADO.NET 连接 Access 是支持 @@Identity 的

好像没有错啊,
------解决方案--------------------
select Scope_Identity()
------解决方案--------------------
嗯, 也许应该使用显示事务,否则隐式事务的话,

后一个 SELECT 与 前一个 INSERT 已经没有关系了


》》》

using (OleDbConnection conn = db.GetConn()) {
conn.Open();
OleDbTransaction trans = conn.BeginTransaction();
OleDbCommand com = new OleDbCommand();
com.Connection = conn;
com.Transaction = trans;
try {
com.CommandText = sql;
com.ExecuteNonQuery();
com.CommandText = "select @@identity ";
trans.Commit();
int i = Convert.ToInt32(com.ExecuteScalar());
return i;
}
catch {
trans.Rollback();
}
}
return -1;
------解决方案--------------------
用access是比较麻烦
------解决方案--------------------
access 可以用@@identity么?又学到一招:)