这篇文章是谈这个题目的,LZ看看有没有帮助:http://www.vbdotnetheaven.com/Uploadfile/stangershen/GenerateintegerIDs11132005232951PM/GenerateintegerIDs.aspx
解决方案 »
- 学习一周的C#,做一个用户信息注册,求各位大神全程指导
- C#有没有办法获取DLL里面的函数名?DllImport出了点问题
- 怎样实现右键"编辑列"菜单?
- 如何控制小数位数
- 请问这个windows console 控制台效果怎么实现?
- 多线程的简单问题,但是我不懂怎么弄......
- c# 知道哈希表的key怎么去value啊
- datagrid模板列中,标题也是模板,而且有控件,程序中如何得到该控件呢?
- VS.net2003比VS.net2002有什么改进和提高?
- 有两个按钮A,B,A先得到焦点,然后B得到焦点,当B得到焦点时,要求知道它前一次得到焦点的控件的信息。
- C#Form客户端程序如何做到控件分离?
- c#中有没有关于snmp的免费开发包啊
A:数据库字段ID设为识别种子,自动增长
B:用一个方法去取该表的下一个值:
代码:
int32 nextId=GetNextId(yourTable); public Int32 GetNextId(string tableName)
{
//throw new System.NotImplementedException();
Int32 newProdID = 0;
try
{
string sqlstring = "SELECT IDENT_CURRENT(@table) + (SELECT IDENT_INCR(@table)) ";
SqlCommand sqlcmd = new SqlCommand(sqlstring, this.cnn);
sqlcmd.Parameters.Add(new SqlParameter("@table", tableName));
if (cnn.State == ConnectionState.Open)
{
cnn.Close();
}
cnn.Open();
newProdID = Convert.ToInt32(sqlcmd.ExecuteScalar());
}
catch (Exception ex)
{
MessageBox.Show("此表不存在!" + ex.Message, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
finally
{
cnn.Close();
}
return newProdID;
}
================================================
给多点分,我现在还差40分就到500的专家分,就可以多一个小三角了...
{
private static long x;
private static object objectLock = new object();
public static long getID()
{
lock (objectLock)
{
return x++;
}
}
public static long maxID
{
set
{
lock (objectLock)
{
x = value;
}
}
}
}=======================================
取ID时
long newID= tools.getID();
{
private static long x;
private static object objectLock = new object();
public static long getID()
{
lock (objectLock)
{
return x++;
}
}
public static long maxID
{
set
{
lock (objectLock)
{
x = value;
}
}
}
}
如果达不到LONG类型的目的.
建立一个自动增量为1的字段,每次写入前先找当前最新的增量值.
然后使用多位数的随机数,末尾加上下一个增量值就OK了.例如:
建立ID字段为自动增量为1.(这样每条新记录里的这个字段会依次加1)
写入新记录前,先查询当前数据库里最新的ID字段的值.(例如为1973)
然后产生个多位数的随机数(比如:204856)
把随机数后附上下一个ID值(1974)
你就得到2048561974了.这样做,绝对没有重复.希望有帮助.
写入新记录前,先查询当前数据库里最新的ID字段的值.(例如为1973)
然后产生个多位数的随机数(比如:204856)
把随机数后附上下一个ID值(1974)
你就得到2048561974了.这样做,绝对没有重复.
-----------
说话不要那么绝对...这世上没有绝对的事情...Guid都不敢保证绝对没有重复...按你的方法举例:
写入新记录前,先查询当前数据库里最新的ID字段的值.(例如为61973)
然后产生个多位数的随机数(比如:20485)
把随机数后附上下一个ID值(61974)
你就得到2048561974了.您觉得这种情况发生的几率有多大?
然后产生个多位数的随机数(比如:204856)"如果是这样就根本没有发帖探讨的必要了,我之所以不用GUID是应为,我们现在的数据裤结构是已Id为主键的,在SQL中会自动以Id为索引,而且有些数据表也是以各表的Id来发生联系的.如果用上GUID128位你想想效率问题吧
比如:
OrderTails[] tails= new OrderTails[3];
tails[0] = new OrderTails("99999999", "999999999", "99999999");
tails[1] = new OrderTails("999999999999999", "999999999999999", "99999999");
tails[2] = new OrderTails("99999999999999999", "999999999999999", "9999999");
//这时我对tails的所有属性付了值.(这三个类是要新增的.)
Order ai = new Order("9999999999","999999999999", "9999999999999", tails);
//这时对ai的所有属性已付值(包括Order类的Details属性)
ai.Commit();//对ai进行新增,如果当ai有子类(tails)且子类也需要新增则同样要生成Insert语句.所以这时是4个Insert语句.并且要先生成Id不然就不好处理外键的关系.而且不好处理成一个事务.所以,Id不能设为自动增加
排序
移到最后,
取其ID值,++
做为新的ID值。
如果不是网络调用,可以一次取最大值,然后多次累加
后来我改写了GetIdentityPropValue() internal static long GetIdentityPropValue()
{
long i = long.Parse(DateTime.Now.ToString("yyyyMMddHHmmss") + DateTime.Now.Millisecond.ToString());
Random rand = new Random();
string j = rand.Next(99).ToString();
long k = long.Parse(i.ToString() + j.ToString());
return k;
}
同样会重复.
---------------------
放心吧...PC + Windows 环境下 DateTime.Now.Ticks 不可能达到 100 微秒级...说了 n 多次了,10 ms 级...10 ms 后面的数字都是不精确的...并发处理中 Guid 是代价最小的...
------------
谁说不能在程序级对ID进行赋值?Guid.NewGuid()...直接传入参数即可...Sql Server 保存时是按二进制数字处理的...字符串是给我们看的...底层可不是...