sql 中插入一条记录。然后 马上就要取他的ID的方法是什么。
怎样做才会更安全准确一点。
怎样做才会更安全准确一点。
解决方案 »
- asp.net 设置文件/文件夹权限
- SQL行转列的问题
- 在label中提示更新数据成功后,暂停几秒重定向
- 流水报表分组维计的问题
- datatable 的结构和数据在sqlserver
- Web.config问题.进来看
- 请教一个关于HTML编码方式的问题!(急!)
- 部署使用 Crystal Reports for Visual Studio .NET 2003 的程序 问题
- EditItemIndex?????
- 各位高手关注,请教简单的问题,有分啊!!!
- VS2005环境下,MapXtreme 2005+Ajax开发WeGis遇到问题,请达人帮忙。
- 当dropdownlist为空回显示很长的百区域??怎么办???
http://www.52web.com/52article/?view-77.htmlHope helpful to you.
你想实现添加后立即得到ID,但是很有可能得到我的添加后的ID,不知道说的对不对。
这种是不安全,
///自动获取ID
/// </summary>
/// <returns></returns>
public string getItemNoCong()
{
string ItemNo = "U";
string m_year = DateTime.Now.Year.ToString();
string m_month = DateTime.Now.Month.ToString();
string m_day = DateTime.Now.Day.ToString();
string m_hour = DateTime.Now.Hour.ToString();
string m_minute = DateTime.Now.Minute.ToString();
string m_second = DateTime.Now.Second.ToString();
string m_millisecond = DateTime.Now.Millisecond.ToString();
string strIP = FSSoft.Common.DNS.DNSUtil.GetIPAddresses();
strIP = strIP.Replace(".", ""); ItemNo = ItemNo + m_year + m_month + m_day + m_hour + m_minute + m_second + m_millisecond + strIP;
return ItemNo;
}
string useritemid = getItemNoCong();
create procedure infoadd
@ID int output,
...
AS
insert into mytab(...) values (...)
SET @ID = @@IDENTITY
GO
int i = @Identity
看了有意思。
好像行。。
有疑问。。如果 在程序中 使用 同一个SqlConnection 是不是就能取到 最近一次插入的ID呢
比如你ta表上建有触发器,触发器的内容是当ta有新记录时同时插一条记录到tb,
那么你用@@ideneity时,想取ta上最后的标值列,实际上得到的是tb的。
rs.open sql,conn,1,3
set rs=rs.nextrecordset
response.write rs("nid")
insert into table1 values(colvalue1,colvalue2)select ident_current('table1')第二种方法:
insert into table1 values(colvalue1,colvalue2)
select @@identity通常最好用 自己生成的System.DateItem.Now.ToString("yyyyMMddhhmmssffff") ;
或者用 GUID.
数据库某字段被设定为IDENTITY时,取得Insert到表里的有三种方式: IDENT_CURRENT('表名'):返回指定表所生成的最后的IDENTITY值 @@IDENTITY:返回目前session,所有范围(scope)中,任何表生成的最后一个IDENTITY值 SCOPE_IDENTITY:返回目前session及目前范围(scope)中,任何表生成的最后一个IDENTITY值解释: 假设前后分别INSERT到二个具有IDENTITY列的表T1、T2后,@@IDENTITY值为T2最后IDENTITY列值。IDENT_CURRENT('T1')和IDENT_CURRENT('T2')分别为T1和T2的最后IDENTITY列值。 若针对T1写insert trigger,它的内容为插入数据到T2,当执行INSERT命令插入数据到T1后再执行Select SCOPE_IDENTITY(),得到的是T1最后IDENTITY列值,虽然插入数据到T1也会触发触发器执行插入数据到T2,但是,SCOPE_CURRENT()命令的scope并不在insert trigger内。?IDENTITY()一般在select...into内使用,用来新建一IDENTITY列到新表格中。语法:IDENTITY(数据类型[, 起始值, 增值])。 NEWID()返回GUID值。需要在插入语句中指定IDENTITY值时,通过以下方式:
set IDENTITY_INSERT?表名 on
insert into 表名 (ID, 列1, 列2) values (0, 列值1, 列值2)
set IDENTITY_INSERT 表名 off
sqldatareader rdr执行该语句,得到的就是id
执行加入记录;
string id = db.sql2str();//里面就是刚才自动生成的序列值
sSQL += "SET @NewID = @@IDENTITY;";SqlCommand objCommand = new SqlCommand();
SqlParameter objParameter = objCommand.Parameters.Add("@NewID", SqlDbType.Int);
objParameter.Direction = ParameterDirection.Output;
objCommand.CommandText = sSQL;objCommand.ExecuteNonQuery();
int iNewID = int.Parse(objCommand.Parameters["@NewID"].Value.ToString());
所以在存入前,就知道主键是什么了.http://download.csdn.net/source/303596
select ident_current('table') 这个不错,我刚才实验过了.
public object ExecuteScalar(string strSql)
{
Open();
SqlCommand cmd = new SqlCommand(strSql,conn);
object mm=cmd.ExecuteScalar();
return mm;
}cmdText = "insert into city_shop (shopname)values ("+google+"); shopid自动增长
调用
DataBase db = new DataBase();
int shopid = Convert.ToInt32(db.ExecuteScalar(cmdText).ToString());
这样ExecuteScalar同时实现插入并返回首行本人觉得最好的办法
@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。(防止返回触发器中的insert的IDENTITY值)
呵呵,如果你的ID是自增的就可以这样
insert into tbltest(name,sex,age) values ("test","man","24"); select @@IDENTITY as id from tbltest
然后用ExecuteScalar()就OK了~,,很简单的,你可以试一下~
select @@identity
select @@Identity