求助:怎样用c#在visual studio+sql sever实现自动生成主键(id) ID获取直接用guid,或者在数据库设置自动增长 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 DataRow newrow=dataset.Tables[0].newRow();newrow["ID"]=Guid.NewGUID(); guid怎么用呀?能不能详细说一下我刚入门数据库不能设自动增长,因为我的主键是带字母的char,不是int 自己写一个数据库的函数,用于生成你的id。然后执行这个sql语句即可。 你可以创建一个用来保存最大编号的数据库表,例如叫做“最大编号列表” 表名 前缀 最大ID号 ------- ------ -------- client C 1数据库初始化时先把每一个表的“最大ID号”都写为1。然后可以写一个过程,例如方法接口为(以下只是伪代码,请自己实现)public static string GetMyNewID(string tableNam){ using(var con = CreateDbConnection()) using(var trn = con.CreateTrnasaction()) { var where = "[表名]='" + tableName.Replace("'","''") +"'"; var sql = "select * from [最大编号列表] where "+ where; var dataReader = 执行sql取得返回的数据集(sql); dataReader.Read(); var ID = (string)dataReader["前缀"]+ string.Format("{0:0000}",(int)dataReader["最大ID号"]); sql = "update ["最大编号列表] set [最大ID号]=[最大ID号]+1 where "+ where; 执行sql语句(sql); trn.Commit(); return ID;}这样,一方面返回了ID号,一方面将(不管是哪一个客户端会话请求的)下一次返回值加一。 可能少半个括号,自己补上。这里的关键是 DbTransaction,这用来保证数据一致性,保证不会有重号的情况发生。 P哥, 那在多用户并发访问的情况下, 如何防止出现同一ID呢? 这跟什么“算法”没有关系,跟使用sql语句还是存储过程的纠结也没有关系,那些都没有说明如何保证编号唯一性。这里需要考虑到这个数据需要写在数据库中,因此就不必使用什么内存中的Lock,而使用数据库事务处理就可以保证多用户的 +1 操作互斥了。 P哥, 那在多用户并发访问的情况下, 如何防止出现同一ID呢?不好意思, 犯了跟你一样的错误 P哥, 那在多用户并发访问的情况下, 如何防止出现同一ID呢?事务中访问了相同的记录,而数据库事务是按照记录自动加锁(不能脏读)的。 但感觉还是有点问题, 虽然取ID时不重复, 但有可能出现这种情况:取了ID, 但没有插入成功。 这样ID就不连续了…… 但感觉还是有点问题, 虽然取ID时不重复, 但有可能出现这种情况:取了ID, 但没有插入成功。 这样ID就不连续了……你取了ID跟你的ID不连续有什么关联,你ID都生成了,你取是你用不用它而已 但感觉还是有点问题, 虽然取ID时不重复, 但有可能出现这种情况:取了ID, 但没有插入成功。 这样ID就不连续了……你取了ID跟你的ID不连续有什么关联,你ID都生成了,你取是你用不用它而已那不要连续搞这么复杂有什么用呢?不如用GUID 没有什么办法保证永远连续。就算是你开发票给别人,你也要事后另外申报一下哪些号码是“废票”,而不能保证真正实际的业务中没有废票。只不过,在插入新的数据之前先要将该检测的异常情况尽量都检测到(这通过几十遍地测试驱动、重构程序才能完善),并且只有在真正插入数据的最后一刻(例如产生insert语句的那个时候)才调用分配ID号的方法,让作废的号码很难出现。 很显然,谁也没有说不能使用 GUID。这里只是满足不同需求的人。有的人就是希望尽量看到流水号(并且带有用来业务分类的前缀),而不是 GUID。 这种数据库设计反人类你这个ID字段每个查询都要被OrderBy的即使你不写他也自动调用呵呵字符串型的慢100倍(这样说对于追求完美的程序员来说就不用了)你的可以这样实现1、如果每个ID前面都是C 那为什么还要加上这个C呢???????输出肯定不输出ID 要这个C有毛用????还会拉低系统性能2、如果是做显示的ID 你在显示的时候给个C也比你现在纠结好(记住 如果你做数据库设计 这个数据库的主键必须是int类型 否则就呵呵吧)3、如果C是变化的 可以在增加一列 专门存放这个C 让Id就是1 2 3 4 这样的 我没跑题看看这样能不能满足你CREATE TABLE T1( ID INT NOT NULL PRIMARY KEY IDENTITY(1,1), GID VARCHAR(100) NOT NULL DEFAULT('C'+CONVERT(VARCHAR(100),ident_current('T1'))), 其他字段 VARCHAR(100) NOT NULL)看下最终的效果 想实现你的那种不可能 必须有个参照点的纯ID来实现分给我吧 请教高手设计关系表 求救:如何写基于windows环境下的搜索功能软件 c# 序列化问题 如何编辑DataGridView中的一条记录.(WinForm, 另外一个窗体) 我复制了一个文件进剪贴板,如何确认这个文件的路径? 如何把创建的资源文件和aspx页面关联起来 拜见请C#高手,适合者转送所有积分。决不食言。 怎样在一个项目中,把所有新建的SqlCommand对象的CommandTimeOut属性都缺省为一个新值? 在TextBox中怎么只让输入整数,不能输入小数呢? 一个字符串的当前时间 寻找通话设备。。。 请求帮忙解决一下问题
newrow["ID"]=Guid.NewGUID();
数据库不能设自动增长,因为我的主键是带字母的char,不是int
你可以创建一个用来保存最大编号的数据库表,例如叫做“最大编号列表”
表名 前缀 最大ID号
------- ------ --------
client C 1数据库初始化时先把每一个表的“最大ID号”都写为1。然后可以写一个过程,例如方法接口为(以下只是伪代码,请自己实现)public static string GetMyNewID(string tableNam)
{
using(var con = CreateDbConnection())
using(var trn = con.CreateTrnasaction())
{
var where = "[表名]='" + tableName.Replace("'","''") +"'";
var sql = "select * from [最大编号列表] where "+ where;
var dataReader = 执行sql取得返回的数据集(sql);
dataReader.Read();
var ID = (string)dataReader["前缀"]+ string.Format("{0:0000}",(int)dataReader["最大ID号"]);
sql = "update ["最大编号列表] set [最大ID号]=[最大ID号]+1 where "+ where;
执行sql语句(sql);
trn.Commit();
return ID;
}这样,一方面返回了ID号,一方面将(不管是哪一个客户端会话请求的)下一次返回值加一。
P哥, 那在多用户并发访问的情况下, 如何防止出现同一ID呢?
P哥, 那在多用户并发访问的情况下, 如何防止出现同一ID呢?
不好意思, 犯了跟你一样的错误
P哥, 那在多用户并发访问的情况下, 如何防止出现同一ID呢?事务中访问了相同的记录,而数据库事务是按照记录自动加锁(不能脏读)的。
但感觉还是有点问题, 虽然取ID时不重复, 但有可能出现这种情况:
取了ID, 但没有插入成功。 这样ID就不连续了……
但感觉还是有点问题, 虽然取ID时不重复, 但有可能出现这种情况:
取了ID, 但没有插入成功。 这样ID就不连续了……
你取了ID跟你的ID不连续有什么关联,你ID都生成了,你取是你用不用它而已
但感觉还是有点问题, 虽然取ID时不重复, 但有可能出现这种情况:
取了ID, 但没有插入成功。 这样ID就不连续了……
你取了ID跟你的ID不连续有什么关联,你ID都生成了,你取是你用不用它而已那不要连续搞这么复杂有什么用呢?不如用GUID
很显然,谁也没有说不能使用 GUID。这里只是满足不同需求的人。有的人就是希望尽量看到流水号(并且带有用来业务分类的前缀),而不是 GUID。
你这个ID字段每个查询都要被OrderBy的即使你不写他也自动调用
呵呵字符串型的慢100倍(这样说对于追求完美的程序员来说就不用了)
你的可以这样实现
1、如果每个ID前面都是C 那为什么还要加上这个C呢???????输出肯定不输出ID 要这个C有毛用????还会拉低系统性能
2、如果是做显示的ID 你在显示的时候给个C也比你现在纠结好(记住 如果你做数据库设计 这个数据库的主键必须是int类型 否则就呵呵吧)
3、如果C是变化的 可以在增加一列 专门存放这个C 让Id就是1 2 3 4 这样的
(
ID INT NOT NULL PRIMARY KEY IDENTITY(1,1),
GID VARCHAR(100) NOT NULL DEFAULT('C'+CONVERT(VARCHAR(100),ident_current('T1'))),
其他字段 VARCHAR(100) NOT NULL
)看下最终的效果 想实现你的那种不可能 必须有个参照点的纯ID来实现
分给我吧