ID获取直接用guid,或者在数据库设置自动增长

解决方案 »

  1.   

    DataRow newrow=dataset.Tables[0].newRow();
    newrow["ID"]=Guid.NewGUID();
      

  2.   

    guid怎么用呀?能不能详细说一下我刚入门
    数据库不能设自动增长,因为我的主键是带字母的char,不是int
      

  3.   

    自己写一个数据库的函数,用于生成你的id。然后执行这个sql语句即可。
      

  4.   


    你可以创建一个用来保存最大编号的数据库表,例如叫做“最大编号列表”    
       表名     前缀   最大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号,一方面将(不管是哪一个客户端会话请求的)下一次返回值加一。
      

  5.   

    可能少半个括号,自己补上。这里的关键是 DbTransaction,这用来保证数据一致性,保证不会有重号的情况发生。
      

  6.   


    P哥, 那在多用户并发访问的情况下, 如何防止出现同一ID呢?
      

  7.   

    这跟什么“算法”没有关系,跟使用sql语句还是存储过程的纠结也没有关系,那些都没有说明如何保证编号唯一性。这里需要考虑到这个数据需要写在数据库中,因此就不必使用什么内存中的Lock,而使用数据库事务处理就可以保证多用户的 +1 操作互斥了。
      

  8.   


    P哥, 那在多用户并发访问的情况下, 如何防止出现同一ID呢?
    不好意思, 犯了跟你一样的错误
      

  9.   


    P哥, 那在多用户并发访问的情况下, 如何防止出现同一ID呢?事务中访问了相同的记录,而数据库事务是按照记录自动加锁(不能脏读)的。
      

  10.   


    但感觉还是有点问题, 虽然取ID时不重复, 但有可能出现这种情况:
    取了ID, 但没有插入成功。 这样ID就不连续了……
      

  11.   


    但感觉还是有点问题, 虽然取ID时不重复, 但有可能出现这种情况:
    取了ID, 但没有插入成功。 这样ID就不连续了……
    你取了ID跟你的ID不连续有什么关联,你ID都生成了,你取是你用不用它而已
      

  12.   


    但感觉还是有点问题, 虽然取ID时不重复, 但有可能出现这种情况:
    取了ID, 但没有插入成功。 这样ID就不连续了……
    你取了ID跟你的ID不连续有什么关联,你ID都生成了,你取是你用不用它而已那不要连续搞这么复杂有什么用呢?不如用GUID
      

  13.   

    没有什么办法保证永远连续。就算是你开发票给别人,你也要事后另外申报一下哪些号码是“废票”,而不能保证真正实际的业务中没有废票。只不过,在插入新的数据之前先要将该检测的异常情况尽量都检测到(这通过几十遍地测试驱动、重构程序才能完善),并且只有在真正插入数据的最后一刻(例如产生insert语句的那个时候)才调用分配ID号的方法,让作废的号码很难出现。
      

  14.   


    很显然,谁也没有说不能使用 GUID。这里只是满足不同需求的人。有的人就是希望尽量看到流水号(并且带有用来业务分类的前缀),而不是 GUID。
      

  15.   

    这种数据库设计反人类
    你这个ID字段每个查询都要被OrderBy的即使你不写他也自动调用
    呵呵字符串型的慢100倍(这样说对于追求完美的程序员来说就不用了)
    你的可以这样实现
    1、如果每个ID前面都是C 那为什么还要加上这个C呢???????输出肯定不输出ID 要这个C有毛用????还会拉低系统性能
    2、如果是做显示的ID 你在显示的时候给个C也比你现在纠结好(记住 如果你做数据库设计 这个数据库的主键必须是int类型 否则就呵呵吧)
    3、如果C是变化的 可以在增加一列 专门存放这个C 让Id就是1 2 3 4 这样的
      

  16.   

    我没跑题看看这样能不能满足你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来实现
    分给我吧