如果是SQL server的话
strSql="SELECT @@IDENTITY AS ID";
~~~~~~~~~~~~~~~~~~~~~~~~~~
command= new SqlCommand(strSql, connection );
dr=command.ExecuteReader();
if (dr.Read())
{
ID=dr["ID"].ToString();
}
dr.Close();
strSql="SELECT @@IDENTITY AS ID";
~~~~~~~~~~~~~~~~~~~~~~~~~~
command= new SqlCommand(strSql, connection );
dr=command.ExecuteReader();
if (dr.Read())
{
ID=dr["ID"].ToString();
}
dr.Close();
方法二:对数据库相应的表写Insert的Trigger事件,由它来返回。
可以用游标来防止出错
2 sqlserver 2000提供了两个全新的函数(IDENT_CURRENT,SCOPE_IDENTITY
),并且改进了@@IDENTITY的不足.当你插入新记录后,可以调用函数:
PRINT IDENT_CURRENT('table') '这将获得新的IDENTITY值,不管数据库中是不是有记
录添加(这就避免了@@IDENTITY的连接限制)
或者:PRINT SCOPE_IDENTITY() '这将获得在当前存储过程,触发器等其他程序创建的
最新记录的IDENTITY值.
而全局变量@@IDENTITY有一个问题,当对一张表执行insert时,如果该表有触发器程序
在执行插入操作,然后,接着在另一张表中插入记录,这样返回@@IDENTITY值就是第二
张表的IDENTITY值。
如果你用的不是SQL Server 2000,你最好一个简单的存储过程来解决这个问题。
CREATE PROCEDURE myProc
@param1 INT
AS
BEGIN
SET NOCOUNT ON
INSERT INTO someTable
(
intField
)
VALUES
(
@param1
)
SET NOCOUNT OFF
SELECT NEWID = @@IDENTITY
END也可以用触发器来 insert 触发器来 得到最新的ID不知这样你满意不
呵呵
like this:
create procedure spTest
(
@name varchar(50),
@newID int out)as
insert into yourTable values(@name)
select @newID=@@identity如果是用sql语句在应用程序在操作的,则可能要在执行完insert操作后再执行
select max(id) from yourTable之类的东东将其取出
那麼你緊接著Select出來的是誰Insert的id呢?
我認為是不是應該鎖定表呢?但是我不會具體的做法 :(
{
lock(typeof(MyClass))
{
OleDbConnection conn = new OleDbConnection (ConnStr );
conn.Open ();
OleDbCommand cmd = new OleDbCommand ("Select max(Id) from [table]", conn);
int max = (int)cmd.ExecuteScalar ();
// ...其它操作
conn.Close();
}
}该max既为最大的id值,为了防止多用户时的冲突,该操作放在单独的一个“组件”中,并通过lock(this)或lock(typeof(MyClass))进行线程同步。我刚做出来,由于用的是Access库,很多功能都没有,只能用这种死办法了?//ExecuteScalar()返回第一行的第一列的Object类型,但这已够用了。
),可以避免@@IDENTITY的连接限制
access只能用 select max(id).....
还好这个问题已经马马乎乎解决了,但现在发现一个新问题,就是当数据库为空是将发生错误在:
int max = (int)cmd.ExecuteScalar ();
处,因为记录为空,所以无法转换,我只好又这样改写:
try
{
int max = (int)cmd.ExecuteScalar ();
}
catch
{
max=1;
}
// ,数据库这东西太陌生了,,哎。
string sql = "insert into table1 (column1,column2) values ('abc',123);select @@identity as 'id'";
sqlCommand oCmd=new SqlCommand(sql,oConn);
int i = Convert.ToInt32(oCmd.ExecuteScalar());