您的位置:程序门 -> .net技术 -> asp.net



请教一个字符型主键插入问题!! (20分)


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


请教一个字符型主键插入问题!! (20分)
发表于:2007-06-26 13:43:20 楼主
我的数据表的一个主键为varchar(8)类型
目前在表中没有记录的情况下,如何插入一条新的记录,形式如:00000001
并在以后的插入中自动编号!
请用c#实现!谢谢
能麻烦你写出代码吗
发表于:2007-06-26 13:49:181楼 得分:0
你用的是什么数据库呀?
发表于:2007-06-26 13:51:232楼 得分:0
在数据库里建个sequence,然后通过sequence.nextval就可以实现编号的增加了
发表于:2007-06-26 13:52:573楼 得分:0
补充说明一下楼上的说法
序列取出来之后,再格式化成你需要的   00000001   形式即可
发表于:2007-06-26 13:57:314楼 得分:0
同意楼上的,oracle一般这样,   如果是sqlserver,改为自增就行了
发表于:2007-06-26 13:57:335楼 得分:0
用c#实现?c#还不是操纵数据库实现啊,哈哈
给你一个自动编号的存储过程,在c#里去调用

set   ansi_nulls   on
set   quoted_identifier   on
go


create     procedure   [dbo].[autono]
@strtablename   varchar(50),--要编号的表名
@strcolumnname   varchar(50),--要编号的列名
@strprestring   varchar(50),--编号前缀字符
@istartpos   int,--编号起始位
@ilength   int,--长度
@strwhere   varchar(800),--外部强制条件,可为空字符 " "
@bdiscontinuity   bit--是否补缺号
  as
        declare   @returnno   int
if   len(@strwhere)   >   0
set   @strwhere   =   @strwhere   +   '   and   '
        if   @bdiscontinuity   =   0
begin
        EXEC( 'select   identity(int,1,1)   xh,cast(substring( '+@strcolumnname+ ', '+
  @istartpos+ ', '+@ilength+ ')   as   int)   as   curcode   into   ##temp   from   (select   '+@strcolumnname+ '   from   '+
  @strtablename+ '   where   '+@strwhere+@strcolumnname+ '   like   ' ' '+@strprestring+ '% ' ')   as   ls ')
        set   @returnno   =   (select   isnull(min(##temp.xh),0)   as   returnno   from   ##temp   where   ##temp.xh <> ##temp.curcode)
        drop   table   ##temp
        if   @returnno   =   0   --说明没有检测到断号,此时要返回的是数据表中最大编号
begin
        EXEC( 'select   cast(substring( '+@strcolumnname+ ', '+@istartpos+ ', '+@ilength+
                ')   as   int)   as   maxno   into   ##temp1   from   (select   '+@strcolumnname+ '   from   '+@strtablename+
                            '   where   '+@strwhere+@strcolumnname+ '   like   ' ' '+@strprestring+ '% ' ')   as   ls ')
                        select   isnull(max(##temp1.maxno),0)+1   as   returnno   from   ##temp1
        drop   table   ##temp1
end
        else
select   @returnno   as   returnno

end
        else
begin
        EXEC( 'select   cast(substring( '+@strcolumnname+ ', '+@istartpos+ ', '+@ilength+
                ')   as   int)   as   maxno   into   ##temp   from   (select   '+@strcolumnname+ '   from   '+@strtablename+
                '   where   '+@strwhere+@strcolumnname+ '   like   ' ' '+@strprestring+ '% ' ')   as   ls ')
        EXEC( 'select   isnull(max(##temp.maxno),0)+1   as   returnno   from   ##temp ')
        drop   table   ##temp
end


发表于:2007-06-26 14:26:426楼 得分:0
你的“自动编号”是什么样的自动规则?
发表于:2007-06-26 14:55:207楼 得分:0
回答sassyboy   首个id为00000001   然后是00000002   这样的  
先取出最后一条记录,如果此记录为空,则编号为00000001,否则的话取出值转换一下成整数,加1再组成字符串。就可以了吧。你试试看
发表于:2007-06-26 17:31:218楼 得分:0
string   snextid   =   " ";
                string   stempid   =   " ";
                sqlconnection   objconn   =   new   sqlconnection(sqlhelper.getconnstr());
                objconn.open();
                sqlcommand   objcmd   =   new   sqlcommand( "select   id= '00000001 '   ",   objconn);
                //当没有记录时
                //sqlcommand   objcmd   =   new   sqlcommand( "select   id= '00000001 '   where   1!=1   ",   objconn);
                sqldatareader   dr   =   objcmd.EXECutereader();
                if   (dr.read())
                {

                        stempid   =   "00000000 "   +   convert.tostring(convert.toint64(dr[ "id "])   +   1);
                        snextid   =   stempid.substring(stempid.length   -   8,   8);
                }
                else
                {
                        snextid   =   "00000001 ";
                }
                objconn.close();
                objconn   =   null;

                response.write(snextid);
发表于:2007-06-26 21:29:049楼 得分:0
谢谢楼上的兄弟!很感动!
发表于:2007-06-27 08:08:0910楼 得分:0
he,不客气。
发表于:2007-06-27 08:42:2711楼 得分:0
sassyboy(my   love   will   get   you   home)   (   )   是可以解决问题,但感觉使用c#里的格式化字符串比较方便。
发表于:2007-06-28 11:20:0312楼 得分:0
生成类似:
u001

u001001...

u002001...

结合parent定义,可通过编号灵活生成树


快速检索

最新资讯
热门点击