如何实现100%的动态数据管道(三)数据库教程

| 收藏本文 下载本文 作者:sl3paub8

以下是小编精心整理的如何实现100%的动态数据管道(三)数据库教程(共含10篇),仅供参考,希望能够帮助到大家。同时,但愿您也能像本文投稿人“sl3paub8”一样,积极向本站投稿分享好文章。

如何实现100%的动态数据管道(三)数据库教程

篇1:如何实现100%的动态数据管道(二)数据库教程

动态|数据

主要思路解决了,下面开始写详细设计(以Sybase ASE数据库为例,其他各位扩展):

1.建立中间层表vdt_columns,这个表的属性用于构建管道中的列资料.

执行类似的代码生成:

ls_sql = “create table vdt_columns (”

ls_sql +=“uid            int            null   ,”

ls_sql +=“upkey           varchar(1)     null   ,”

ls_sql +=“udmid     int       null,”

ls_sql +=“udmname    varchar(30)  null,”

ls_sql +=“unulls          varchar(1)    null   ,”

ls_sql +=“uwidth          int     null   ,”

ls_sql +=“uscale        int        null,”

ls_sql +=“uname        varchar(30)  null,”

ls_sql +=“udefault      varchar(255) null,”

ls_sql +=“ucheck        varchar(255) null,”

ls_sql +=“uidentity       int    null”

ls_sql +=“)”

EXECUTE IMMEDIATE :ls_sql using SrcSqlca;

2.构建其他相关的可能用到中间层视图:

系统对象视图:

ls_sql = 'create view vdt_objects (uid,uuid,uname,utype) as'+&

' select id,uid,name,(case type when~'TR~' then ~'T~' else type end) from sysobjects'

EXECUTE IMMEDIATE :ls_sql using SrcSqlca;

系统表视图:

ls_sql = 'create view vdt_tables (uid,uuid,uname)as'+&

' select id,uid,name from sysobjects where type = ~'U~''

EXECUTE IMMEDIATE :ls_sql using SrcSqlca;

3.初始化vdt_columns 表.

insert vdt_columns

select sc.id,so.name,sc.colid,'N',sc.type,

(case when (select count(*) from systypes st where sc.type=st.type and sc.usertype=st.usertype)=0 then (select max(st.name) from systypes st where sc.type=st.type) else (select st.name from systypes st where sc.type=st.type and sc.usertype=st.usertype) end),

'N',(case when prec is not null then isnull(sc.prec,0) else sc.length end),

sc.scale,sc.name,substring(sy.text,9,char_length(sy.text) -8),“0”,(case when sc.status=128 then 1 else 0 end)

from syscolumns sc,sysobjects so ,syscomments sy

where sc.id*=so.id and sc.cdefault*=sy.id

using SrcSqlca;

在Sybase中,确定主键列比较麻烦:

declare cur_vdtcolumns cursor for

select distinct utname from vdt_columns

using SrcSqlca;

open cur_vdtcolumns;

fetch cur_vdtcolumns into :ls_utname;

do while SrcSqlca.sqlcode=0

wait(true)

ls_nulls='';ls_pkey=''

of_getnull_ase(ls_utname,ls_nulls)

of_getpk_ase(ls_utname,ls_pkey)

if len(ls_pkey)>0 then

update vdt_columns

set upkey = 'Y',unulls='N'

where CHARINDEX(uname,:ls_pkey)>0

and utname = :ls_utname

using SrcSqlca;

end if

fetch cur_vdtcolumns into :ls_utname;

loop

end if

其中of_getpk_ase用于确定某列是否是主键.

/*Out of date*/

Long Ll_Cnt

int Li_keycnt,Li_indexid,Li_indstat,Li_indstat2

String Ls_keys,Ls_ThisKey

int Li_i

If Not IsValid(SrcSqlca) Then return -1

Select Count(*) Into :Ll_Cnt From sysobjects Where name = :as_tablename Using SrcSqlca;

If Ll_Cnt <= 0 Then

return -2

End if

DECLARE curs_sysindexes CURSOR FOR

SELECT keycnt, indid, status, status2

FROM  sysindexes

WHERE id = object_id(:as_tablename)  AND indid >0 Using SrcSqlca;

OPEN curs_sysindexes ;

FETCH curs_sysindexes INTO :Li_keycnt, :Li_indexid, :Li_indstat, :Li_indstat2;

do while (SrcSqlca.Sqlcode = 0)

If Mod(int(Li_indstat2/2),2) = 1 Then

IF Mod(int(Li_indstat/2048),2) = 1 Then //主键

Ls_Keys = ''

Li_i = 1

do while Li_i <=Li_keycnt

Select distinct index_col(:as_tablename, :Li_indexid, :Li_i) into :Ls_ThisKey

From vdt_columns Using SrcSqlca;

If Isnull(Ls_ThisKey) Then

Exit

Else

If Li_i >1 Then Ls_keys += ','

Ls_Keys += Ls_ThisKey

End if

Li_i ++

loop

End if

End if

FETCH curs_sysindexes INTO :Li_keycnt, :Li_indexid, :Li_indstat, :Li_indstat2;

loop

CLOSE curs_sysindexes;

as_keys=Ls_keys

return 1

经过以上的步骤,中间层的数据就基本获得了,根据这些数据,基本上能够无误差的传输绝大部分表.构建了中间层,为以后的不同数据库的扩展打下了一个良好的基础.

不同的数据库,构造中间层的语法各有不同,但是中间层的表(视图)的结构是一样的,这样程序中处理的方法也统一了.

待续...

篇2:如何实现100%的动态数据管道(三)数据库教程

动态|数据

下面看看,如何根据中间层的数据,构建管道语法:

1.首先建立一个数据窗口对象:d_vdtcolumns

SQL语法是:

SELECT vdt_columns.utid,

vdt_columns.uid,

vdt_columns.upkey,

vdt_columns.udmid,

vdt_columns.udmname,

vdt_columns.unulls,

vdt_columns.uwidth,

vdt_columns.uscale,

vdt_columns.uname,

vdt_columns.udefault,

vdt_columns.ucheck,

vdt_columns.utname,

vdt_columns.uidentity

FROM vdt_columns

WHERE utname = :as_tname

2.准备工作就绪,下面就是主战场了,开始构建数据管道.

考虑到一个管道对象可以传输多个任务,建立一个对象nvo_pipetransattrib保存传输需要的语法:

它包含了一下的instance变量:

string is_objectname              //表名

string is_syntax               //管道语法

string is_sconnect='zw',is_dconnect='daixf'      //源数据库连接和目的数据库连接

string is_ptype,is_pcommit,is_errors         //管道的几个属性

string is_sname,is_dname             //源表名,目的表名

string is_sqlsyntax              //管道的SQL语法

建立一个对象,从数据管道对象继承.

开始构造语法:写一个函数.

nvo_pipetransattrib inv_attrib[]

string ls_syntax,ls_sourcesyntax,ls_destsyntax

int li,lj,li_ind,li_find,li_rows,li_identity

string ls_tablename,ls_default,ls_defaultvalue,ls_pbdttype

boolean lb_find

dec ld_uwidth,ld_prec,ld_uscale

string ls_types,ls_dbtype,ls_prikey,ls_name,ls_nulls,ls_msg,ls_title='of_constrpipesyntax()'

nvo_string lnv_string

nvo_datastore lds_vdtcolumns

boolean lb_key

lds_vdtcolumns=create nvo_datastore

lds_vdtcolumns.dataobject='d_vdtcolumns'

lds_vdtcolumns.settransobject(SrcSqlca)

li=1

of_input(inv_attrib[li])

li_find=pos(inv_attrib[li].is_sqlsyntax,'*',1)

if li_find>0 then

lds_vdtcolumns.retrieve(as_tablename)

of_filterimg(lds_vdtcolumns)

li_rows=lds_vdtcolumns.rowcount()

for lj=1 to li_rows

ls_name=lds_vdtcolumns.getitemstring(lj,'uname')

ls_types=lds_vdtcolumns.getitemstring(lj,'udmname')

li_identity = lds_vdtcolumns.getitemnumber(lj,'uidentity')

ls_types=of_getpipedbtype(is_s_dbtype,ls_types)

ls_pbdttype=of_getpbdttype(is_s_dbtype,ls_types)

choose case ls_types

case 'char','varchar','nchar','nvarchar','long varchar'

if ls_types='long varchar' then ls_types='varchar'

ld_uwidth=lds_vdtcolumns.getitemnumber(lj,'uwidth')

ls_dbtype=ls_types+'('+string(int(ld_uwidth))+')'

case 'decimal','numeric'

ld_uwidth=lds_vdtcolumns.getitemnumber(lj,'uwidth')

ld_uscale=lds_vdtcolumns.getitemnumber(lj,'uscale')

if li_identity=1 then

ls_dbtype='identity'+'('+string(int(ld_uwidth))+','+string(int(ld_uscale))+')'

else

ls_dbtype=ls_types+'('+string(int(ld_uwidth))+','+string(int(ld_uscale))+')'

end if

case else

ls_dbtype=ls_types

end choose

ls_prikey=lds_vdtcolumns.getitemstring(lj,'upkey')

if ls_prikey='Y' then

lb_key=true

ls_prikey='key=yes,'

else

ls_prikey=''

end if

ls_nulls=lds_vdtcolumns.getitemstring(lj,'unulls')

if ls_nulls='Y' then

ls_nulls='yes'

else

ls_nulls='no'

end if

ls_default=isnull(lds_vdtcolumns.getitemstring(lj,'udefault'),'')

ls_sourcesyntax+=“COLUMN(type=”+ls_pbdttype+“,name=~”“+ls_name+”~“,dbtype=~”“+ls_dbtype+”~“,”+ls_prikey+“nulls_allowed=”+ls_nulls+“)~r~n”

if ls_default='' then

if li_identity = 1 then

ls_destsyntax+=“COLUMN(type=”+ls_pbdttype+“,name=~”“+ls_name+”~“,dbtype=~”“+ls_dbtype+”~“,”+ls_prikey+“nulls_allowed=”+ls_nulls+“,initial_value=~”exclude~“)~r~n”

else

ls_destsyntax+=“COLUMN(type=”+ls_pbdttype+“,name=~”“+ls_name+”~“,dbtype=~”“+ls_dbtype+”~“,”+ls_prikey+“nulls_allowed=”+ls_nulls+“)~r~n”

end if

else

if li_identity = 1 then

ls_destsyntax+=“COLUMN(type=”+ls_pbdttype+“,name=~”“+ls_name+”~“,dbtype=~”“+ls_dbtype+”~“,”+ls_prikey+“nulls_allowed=”+ls_nulls+“,default_value=~”“+ls_default+”~“,initial_value=~”exclude~“)~r~n”

else

ls_destsyntax+=“COLUMN(type=”+ls_pbdttype+“,name=~”“+ls_name+”~“,dbtype=~”“+ls_dbtype+”~“,”+ls_prikey+“nulls_allowed=”+ls_nulls+“,default_value=~”“+ls_default+”~“)~r~n”

end if

end if

next

else

return ''

end if

ls_sourcesyntax+=')'

ls_destsyntax+=')'

//generate PIPELINE

//example:

//PIPELINE(source_connect=csfdata,destination_connect=csfdata,type=replace,commit=100,errors=100,keyname=“Bar_x”)

if lb_key then

ls_syntax+='PIPELINE(source_connect='+inv_attrib[li].is_sconnect+',destination_connect='+inv_attrib[li].is_dconnect+',type='+inv_attrib[li].is_ptype+',commit='+inv_attrib[li].is_pcommit+',errors='+inv_attrib[li].is_errors+',keyname=“'+as_tablename+'_x”)~r~n'

else

ls_syntax+='PIPELINE(source_connect='+inv_attrib[li].is_sconnect+',destination_connect='+inv_attrib[li].is_dconnect+',type='+inv_attrib[li].is_ptype+',commit='+inv_attrib[li].is_pcommit+',errors='+inv_attrib[li].is_errors+')~r~n'

end if

//generate SOURCE

//example:

//SOURCE(name=“Bar”,COLUMN(type=char,name=“CustomCode”,dbtype=“char(8)”,key=yes,nulls_allowed=no)

ls_syntax+='SOURCE(name=“'+inv_attrib[li].is_sname+'”,'

ls_syntax+=ls_sourcesyntax

//generate RETRIEVE

//example:

//RETRIEVE(statement=“SELECT Bar.CustomCode,Bar.BarCode,Bar.ItemCode,Bar.Metering,Bar.PackSize,Bar.Length,Bar.Width,Bar.High,Bar.Vol,Bar.Weight,Bar.NewPackFlagFROM Bar”)

ls_syntax+='RETRIEVE(statement=“'+inv_attrib[li].is_sqlsyntax+'”)'

//generate DESTINATION

//example:

//DESTINATION(name=“Bar_copy”,

//COLUMN(type=char,name=“CustomCode”,dbtype=“char(8)”,key=yes,nulls_allowed=no,initial_value=“spaces”)

ls_syntax+='DESTINATION(name=“'+inv_attrib[li].is_dname+'”,'

ls_syntax+=ls_destsyntax

return ls_syntax

这个函数的返回值就是构建完成的管道语法了.

其中:初始化的函数:of_input(inv_attrib[li])

是初始化,inv_attrib的函数,初始化的数据主要是用户需要输入的条件,比如管道的type,commit,errors,select语句.

需要说明一下,其中处理了几个特殊的情况的函数.

of_filterimg(lds_vdtcolumns):

过滤掉表中的image列,因为管道不支持image数据传输.

of_getpipedbtype(is_s_dbtype,ls_types):

根据表中列的类型得到管道中数据列的类型,因为他们不是总是一一对应的.

这个可以通过一个extend datawindowobject,并包含有初始数据来实现.

of_getpbdttype(is_s_dbtype,ls_types):

根据表中列的类型得到管道中列的类型,因为他们也不是总是一一对应的.

这个可以通过一个extend datawindowobject,并包含有初始数据来实现.

管道语法构建完成了,就可以执行管道传输了:

this.syntax=得到的语法

li_RC = this.Start(SrcSqlca,DestSqlca,idw_Errors)

If li_RC 1 Then

if not ib_silence then msg(ls_title,“对象传输失败: ” + string(li_rc))

of_addtransmsg(' 对象<'+is_currentobj+'>传输失败:' + string(li_rc) )

return li_RC

rollback ;

else

Commit;

End if

篇3:窗体动态效果的实现数据库教程

动态

-------------------------------------------------------------------------------------

// 实现关闭窗体时的动态效果

// ---------------------------------------------------------

// 函数名:gf_closequery

// 参数说明:

//        window   window类型,调用窗口的名字

//        closetype integer类型,窗口关闭方式,value = 0~10

// ---------------------------------------------------------

// 申明局部变量

int li_x ,li_y,li_width,li_height,li_ceny,li_cenx,li_xminusy,li_wminush

Integer li_gd

// 取出当前窗口的坐标值、大小值

li_x = window.x

li_y = window.y

li_width = window.width

li_height = window.height

// 设置窗体关闭前的动画效果

// 关键是看哪个值发生了变化――x、y、h、w

CHOOSE CASE closetype

CASE 0     // closetype = 0,从下到上逐渐消失

for li_gd = li_height to 0 step -1

window.height = li_gd

window.show

next

CASE 1     // closetype = 1,从上到下逐渐消失

for li_gd = li_y to li_height+li_y step 1

window.y = li_gd

window.height = li_height+li_y - li_gd

window.show()

next

CASE 2     // closetype = 2,从右到左逐渐消失

for li_gd = li_width to 0 step -1

window.width = li_gd

next

CASE 3     // closetype = 3,从左到右逐渐消失

for li_gd = li_x to li_x+li_width step 1

window.x = li_gd

window.width = li_x+li_width - li_gd

window.show()

next

case 4     // closetype = 4,从上下向中间挤压逐渐消失

li_ceny = li_y+li_height/2

for li_gd = li_y to li_ceny step 1

window.y = li_gd

window.height = li_height - 2*(li_gd - li_y)

next

case 5     // closetype = 5,从左右向中间挤压逐渐消失

li_cenx = li_x+li_width / 2

for li_gd = li_x to li_cenx step 1

window.x = li_gd

window.width = li_width - 2*(li_gd - li_x)

next

case 6     // closetype = 6,从左上->右下

for li_gd = li_y to li_height+li_y step 1

window.y = li_gd

window.height = li_height+li_y - li_gd

if window.x < li_x + li_width then

window.x = li_x + (li_gd - li_y)

else

window.x = li_x + li_width

end if

if window.width >0 then

window.width = li_x+li_width - window.x

else

window.width = 0

end if

next

window.x = li_x + li_width

window.y = li_height+li_y

window.width = 0

window.height = 0

window.show()

case 7     // closetype = 7,从右下->左上

for li_gd = li_height to 0 step -1

window.height = li_gd

if window.width >0 then

window.width = li_width - (li_height - li_gd)

else

window.width = 0

end if

next

window.x = li_x

window.y = li_y

window.width = 0

window.height = 0

window.show()

case 8     // closetype = 8,从右上->左下

for li_gd = li_y to li_height+li_y step 1

window.y = li_gd

window.height = li_height+li_y - li_gd

if window.width >0 then

window.width = li_width - (li_gd - li_y)

else

window.width = 0

end if

next

window.x = li_x

window.y = li_height+li_y

window.width = 0

window.height = 0

window.show()

case 9     // closetype = 9,从左下->右上

for li_gd = li_x to li_x+li_width step 1

window.x = li_gd

window.width = li_width +li_x -li_gd

if window.height >0 then

window.height = li_height -(li_gd - li_x)

else

window.height = 0

end if

next

window.x = li_x+li_width

window.y = li_y

window.width = 0

window.height = 0

window.show()

case 10     // closetype = 10,从四面到中间

li_ceny = li_y+li_height/2

li_cenx = li_x+li_width / 2

for li_gd = li_y to li_ceny step 1

window.y = li_gd

window.height = li_height - 2*(li_gd - li_y)

if window.x < li_x + li_cenx then

window.x = li_x + (li_gd - li_y)

else

window.x = li_x + li_cenx

end if

if window.width >0 then

window.width = li_width - 2*(li_gd - li_y)

else

window.width = 0

end if

next

window.x = li_cenx

window.y = li_ceny

window.width = 0

window.height = 0

window.show()

case else

window.show()

window.width = li_width

window.height = li_height

window.x = li_x

window.y = li_y

END CHOOSE

return 0

***********************************

// 调用该函数在窗体的 closequery 事件中

gf_closequery (w_main,mod(integer(string(now(),“ss”)),11))

-------------------------------------------------------------------------------------

上面是关闭时的效果,窗体打开时的动态效果的语句跟上面的差不多,在此就不写啦,如果有需要的可以告诉我,我单独发送,

谢谢。

篇4:如何实现数据的自动录入数据库教程

数据

用户录入数据时经常会遇到大量重复数据,即录入下一条记录的某个字段时,其值与上一条记录同字段的值相同,

如何实现数据的自动录入数据库教程

。如果编些程序自动录入相同值会大大提高录入速度。具体实现方法如下:一、程序中主要用到的函数1、FileOpen() 功能:以指定的读写模式打开指定的文件,同时返回文件的句柄。2、FileWrite() 功能:从指定文件读取数据。3、FileClose() 功能:关闭先前用FileOpen()函数打开的文件。4、settext() 功能:得到当前行和列之上的编辑框中的值。5、gettext() 功能:替换在DataWindow控件或DataStore对象的当前行列的编辑框控件中的文本。6、send() 功能:向窗口发送指定的消息并立即执行相应的事件处理程序。7、describe() 功能:返回DataWindow对象或Datastore对象中的其它对象的属性值。以上函数在有关Pb的函数书中均可以找到,这里不再详述,但要注意后面两个函数的使用方法。二、具体实现方法1、建立window具体控件名称如图1所示。 2、定义实例变量数组 string is_value[] 和 integer if_File(存放打开文件的句柄)string is_columncount3、在window的Open事件中编写如下代码int iif_File = FileOpen(“Sys.ini”,LineMode!, Read!, LockRead!)is_columncount = dw_input.Describe(“DataWindow.Column.Count”) //取得DataWindow对象的总列数for i = 1 to integer(is_columncount)FileRead(if_File, is_value[i])nextFileClose(if_File)dw_input.Scrolltorow(dw_input.rowcount()) //将光标设置到最后行列dw_input.setcolumn(integer(is_columncount)) 在window 的Close事件中编写如下代码int iif_File = FileOpen(“Sys.ini”,LineMode!, Write!, LockWrite!, Replace!)for i = 1 to integer(is_columncount)FileWrite(if_File, is_value[i])nextFileClose(if_File)4、给Datawindow control自定义一个回车键事件:Event name: ue_keyenter Event ID: pbm_dwnprocessenter 5、在Datawindow control的ue_keyenter事件中写入以下代码is_value[this.getcolumn()] = this.gettext()Send(Handle(this),256,9,Long(0,0))this.settext(is_value[this.getcolumn()])return 1在Datawindow control的constructor事件中写入以下代码this.Settransobject(sqlca)this.retrieve()6、给cb_append自定义一个回车事件Event name: ue_keydown Event ID: pbm_keydown在cb_append的clicked事件中写入以下代码dw_input.Setfocus()dw_input.ScrollToRow(dw_input.InsertRow(0)) //追加一空记录并指向新记录dw_input.SetColumn(1) //指向公寓名列dw_input.Settext(is_value[1])在cb_append的ue_pbm_keydown事件中写入以下代码if keydown(keyenter!) thenthis.Triggerevent(clicked!)end if※ 注意各个控件的tab order的顺序,以上步骤只是简单的实现快速录入,如果遇到具体情况还应该做更详细的编码。

篇5:动态分组查询数据库教程

动态|分组

原帖地址:

community.csdn.net/Expert/topic/3428/3428792.xml?temp=.6476251

--示例数据

create table 表(ID int,NUM int)

insert 表 select 1,2

union all select 2,3

union all select 3,2

union all select 4,2

union all select 5,12

union all select 6,2

union all select 7,1

union all select 8,5

union all select 9,1

go

/*--问题说明:

输入分组参数,比如输入 “3,6” ,实现按 ID<=3,3<=6,ID>6 分组查询

输入分组参数,比如输入 “2,5,8” ,实现按 ID<=2,2<=5,5<=8,ID>8 分组查询

--*/

--查询的存储过程

create proc p_qry

@numlist varchar(1000)

as

set nocount on

declare @t table(id int identity,组 varchar(10),a int,b int)

declare @i int,@pnum varchar(10)

select @i=charindex(',',@numlist+',')

,@pnum=left(@numlist,@i-1)

,@numlist=stuff(@numlist,1,@i,'')

,@i=charindex(',',@numlist)

insert @t select 'id<='+@pnum,null,@pnum

while @i>0

begin

insert @t select @pnum+'<='+left(@numlist,@i-1),@pnum,left(@numlist,@i-1)

select @pnum=left(@numlist,@i-1)

,@numlist=stuff(@numlist,1,@i,'')

,@i=charindex(',',@numlist)

end

insert @t select 'id>'+@numlist,@numlist,null

select b.组,num=sum(a.num)

from 表 a,@t b

where case

when b.a is null then case when a.id<=b.b then 1 else 0 end

when b.b is null then case when a.id>b.a then 1 else 0 end

else case when a.id>b.a and a.id<=b.b then 1 else 0 end

end=1

group by b.组

order by min(b.id)

go

--调用存储过程进行查询

exec p_qry '2,5,8'

go

--删除测试

drop table 表

drop proc p_qry

/*--测试结果

组         num

---------- -----------

id<=2     5

2<=5   16

id>8      1

--*/

篇6:动态关联表数据库教程

动态

原帖地址:

community.csdn.net/Expert/topic/3452/3452577.xml?temp=.1377375

--示例数据

create table [table](A sysname,B varchar(10))

insert [table] select 'table_1','a'

union all    select 'table_2','b'

create table table_1(A int)

insert table_1 select 1

union all    select 2

create table table_2(A int)

insert table_2 select 3

union all    select 4

go

/*--问题说明:

table中,A字段存储着其他表的名称

A字段中,记录和各个表的A字段的最大值

即得到如下结果:

table.B  C

-------- -----------

a        1

b        2

--*/

--处理方法

declare @s varchar(8000)

set @s=''

select @s=@s+' when '''+A+''' then(select max(A) from ['+A+'])'

from [table] group by A

exec('select B,C=case A'+@s+' end from [table]')

go

--删除测试

drop table [table],table_1,table_2

/*--测试结果

B         C

---------- -----------

a         2

b         4

--*/

篇7:实现千万级数据的分页显示数据库教程

分页|数据|显示

这是经我该写后的存储过程

---------------------------------------------------------

ALTER      PROCEDURE usp_GetRecordFromPage

@tblName     varchar(1000),      -- 表名

@SelectFieldName  varchar(4000),             -- 要显示的字段名(不要加select)

@strWhere     varchar(4000),             -- 查询条件(注意: 不要加 where)

@OrderFieldName     varchar(255),              -- 排序索引字段名

@PageSize     int ,               -- 页大小

@PageIndex    int = 1,                -- 页码

@iRowCount    int output,                -- 返回记录总数

@OrderType    bit = 0                -- 设置排序类型, 非 0 值则降序

AS

declare @strSQL   varchar(4000)      -- 主语句

declare @strTmp   varchar(4000)       -- 临时变量

declare @strOrder varchar(400)       -- 排序类型

declare @strRowCount   nvarchar(4000)     -- 用于查询记录总数的语句

set @OrderFieldName=ltrim(rtrim(@OrderFieldName))

if @OrderType != 0

begin

set @strTmp = '<(select min'

set @strOrder = ' order by ' + @OrderFieldName +' desc'

end

else

begin

set @strTmp = '>(select max'

set @strOrder = ' order by ' + @OrderFieldName +' asc'

end

set @strSQL = 'select top ' + str(@PageSize) + @SelectFieldName+' from '

+ @tblName + ' where ' + @OrderFieldName + @strTmp + '('

+ right(@OrderFieldName,len(@OrderFieldName)-charindex('.',@OrderFieldName)) + ') from (select top ' + str((@PageIndex-1)*@PageSize)

+ @OrderFieldName + ' from ' + @tblName + @strOrder + ') as tblTmp)'

+ @strOrder

if @strWhere != ''

set @strSQL = 'select top ' + str(@PageSize) + @SelectFieldName+' from '

+ @tblName + ' where ' + @OrderFieldName + @strTmp + '('

+ right(@OrderFieldName,len(@OrderFieldName)-charindex('.',@OrderFieldName)) + ') from (select top ' + str((@PageIndex-1)*@PageSize)

+ @OrderFieldName + ' from ' + @tblName + ' where ' + @strWhere + ' '

+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder

if @PageIndex = 1

begin

set @strTmp = ''

if @strWhere != ''

set @strTmp = ' where ' + @strWhere

set @strSQL = 'select top ' + str(@PageSize) + @SelectFieldName+' from '

+ @tblName + @strTmp + ' ' + @strOrder

end

exec(@strSQL)

if @strWhere!=''

begin

set @strRowCount = 'select @iRowCount=count(*) from ' + @tblName+' where '+@strWhere

end

else

begin

set @strRowCount = 'select @iRowCount=count(*) from ' + @tblName

end

exec sp_executesql @strRowCount,N'@iRowCount int out',@iRowCount out

篇8:在VB中动态创建数据库数据库教程

在VB中动态创建数据库

新建工程.添加控件 对应写上代码

以下为引用的内容:

Private Sub Command2_Click

Dim myDB As DAO.Database

'Set myDB = DAO.OpenDatabase(“d:\mydb3.mdb”)

Set myDB = DAO.OpenDatabase(App.Path + “/mydb.mdb”)

Dim d As String

d = “delete * from NewTable1”

myDB.Execute d

MsgBox “成功删除全部记录”

End Sub

Private Sub Command3_Click()

Dim myDB As DAO.Database

'Set myDB = DAO.OpenDatabase(“d:\mydb3.mdb”)

Set myDB = DAO.OpenDatabase(App.Path + “/mydb.mdb”)

Dim e As String

e = “drop TABLE NewTable1”

myDB.Execute e

End Sub

Private Sub Form_Load()

Dim myDB As DAO.Database

'Set myDB = DAO.Workspaces(0).CreateDatabase(“d:\mydb3.mdb”, dbLangGeneral)

Set myDB = DAO.Workspaces(0).CreateDatabase(App.Path + “/mydb.mdb”, dbLangGeneral)

Dim str_SQL As String

str_SQL = “Create Table NewTable1(Field1 Text(10),Field2 Short)”

myDB.Execute str_SQL

Dim a As String

a = “Insert INTO NewTable1 VALUES ('litao','21')”

myDB.Execute a

str_SQL = “Create Table NewTable2(Field1 Text(10),Field2 Short)”

myDB.Execute str_SQL

myDB.Close

MsgBox “成功创建mydb3.mdb数据库外加一条记录litao 21”

End Sub

Private Sub Command1_Click()

Dim myDB As DAO.Database

'Set myDB = DAO.OpenDatabase(“d:\mydb3.mdb”)

Set myDB = DAO.OpenDatabase(App.Path + “/mydb.mdb”)

Dim c As String

c = “Insert INTO NewTable1 VALUES ('liqiao','20')”

myDB.Execute c

MsgBox “成功插入一条记录liqiao 20”

End Sub

篇9:从动态SQL中返回值数据库教程

动态

declare @TransactorID int

set @TransactorID=0

print(@TransactorID)

--exec sp_executesql N'select @TransactorID=68 ',N'@TransactorID int ',@TransactorID

exec sp_executesql N'select @TransactorID=5 ',N'@TransactorID int out ',@TransactorID out

print(@TransactorID)

篇10:中文图形化数据库动态操纵的实现

中文图形化数据库动态操纵的实现

【摘要】介绍了采用PowerBuider开发工具编程,实现数据库动态操纵(查询、插入、修改、删除)的设计思路和方法,该程序具有中文图形界面的突出特点。【关键词】数据库,动态操纵,PowerBuilder,中文,图形界面

The Implementation of Database Dynamic Manipulation with ChineseGraphicalUserInterface.

Liang Lunfa

(The Library of Beijing University of Posts & Telecommunications, Beijing)

【Abstract】This paper presents a method to implementing Database Dynamic Manipulation(query,insert,update,delete) by using PowerBuilder;this program has distinct characters which can supply chinese graphical user interface.

【Keywords】Database, Dynamic manipulation, PowerBuilder, Chinese , Graphical User Interface

1.序言

数据库操纵包含查询(select)、增加(Insert)、更改(update)和删除(delete)四种操作。要实现对数据库的操纵,必须键入类似于select (表序列)、from (列序列)、where (条件表达式序列)之类的SQL语句,这需要操作员对SQL语句以及数据库结构有充分的了解。是否可以在我们开发的各系统的数据库管理中不需这样麻烦,而只要点击几下鼠标就能完成对数据库的操纵呢?这就是“中文图形化数据库动态操纵”的出发点。

PowerBuilder是一个面向对象的用于构造基于客户/服务器(Client/Server)数据库应用系统的开发工具,具有强大的数据库应用程序开发功能,尤其是它提供的数据窗口(Data Window)专利工具,使其能够更加方便有效地访问与操纵数据库。实现本文所述功能的总体思路是:充分利用PowerBuilder数据窗口技术,在数据窗口中使英文字符和中文说明相对应,通过执行由操作数据窗口动态生成的SQL字符串,实现数据的中文图形化动态操纵功能。

笔者在开发“中图博览会业务管理系统”时,对其数据操纵的功能实现作了比较深入的研究,采用PowerBuilder6.5为开发工具,在UNIX操作系统和Sybase 11数据库系统环境下开发出了一个具有中文图形界面、可以实现数据库动态操纵功能的系统模块。通过该模块提供的数据库操作方法,数据库管理人员可高效方便地进行数据操纵。本文将以该开发环境为例对实现数据库动态操纵功能的设计思路和关键技术作扼要的叙述。

功能分析

典型的SQL语句的结构简单列举如下:

(1) 查询:SELECT〈目标列〉FROM〈目标表〉WHERE〈条件表达式〉

(2) 插入:INSERT INTO〈目标表(目标列)〉 VALUES (目标列赋值)

(3) 更新:UPDATE 〈目标表〉 SET〈(目标列=赋值)序列〉WHERE 〈条件表达式〉

(4) 删除:DELETE FROM 〈目标表〉WHER〈条件表达式〉

通过分析,从上面四种操作中抽象出四个公共元素,即:目标表、目标列、赋值和条件表达式,这四个元素可以在程序中用字符串代替。因此可以设计4个数据窗口,一个放要操纵的数据表,一个放数据列,一个放关系运算的检索条件,一个放赋值列。在程序中利用数据窗口灵活的数据控制功能,通过鼠标点击选择相关的数据,动态生成SQL语句。

我们认为实现该功能主要有以下关键技术:

(1)操作界面的中文化;

(2)条件表达式的构建;

(3)要运行字符串格式的SQL语句,必须在字符串中考虑数值类型的转换;

(4)执行查询操作后动态显示查询结果。

3.设计思路

针对上面提到的关键技术,下面提出具体的设计实现思路:

(1)采用PowerBuilder工具建立数据表的时候,可以对数据表和列进行说明,这些说明可采用简明的中文。数据表创建完成以后,PowerBuilder的系统表pbcattbl、pbcatcol和syscolumn分别记录了我们建立的表和列的各种信息,包括表和列的说明、列类型。我们每建立一个表,系统就在pbcattbl增加一条记录,在pbcatcol、syscolumn增加对应于表的列数的多条记录。这样,我们就可以利用这些特性来实现中文图形化的功能。

(2)通过分析where子句的结构,我们可以抽象出该数据窗口应该包括以下的内容:“序号”+“左括号”+“名称”+“比较符”+“条件”+“右括号”+“逻辑符(如有多行条件)”,因此可以设计一个数据窗口对象,使它包含如上的七列,其中“左括号”、“比较符”、“右括号”、“逻辑符”等内容是固定的,编辑属性可以是下拉列表控件,而“名称”和“条件”要随选择的表和行的不同而不同,编辑属性必须是下拉数据窗口控件。

(3)PowerBuilder可以运行嵌入SQL语句,其语法是:EXECUTE IMMEDIATE :string;因此可以将要执行的操作内容动态生成string,但是如果要插入或修改某些数据类型并不是char、varchar或text类型的列时,就要将string 类型的数据转换为相应的数据类型,如在Sybase 11数据库系统环境下,可调用convert()函数进行转换;如在DB2环境下,可调用cast()函数。

(4)如果执行查询操作,应该将查询的结果显示出来,该查询结果会因选择的表、列和条件的不同而完全不同,因此可以调用syntaxfromsq1(sq1ca,str,strsty,error)函数和datawindow.create()函数,动态生成结果数据窗口。

4.实现步骤

(1)创建系统操纵数据表

在建立数据表时,将表和各列的表头(Header)信息完整地用中文输入。读取系统表的相关数据:pbcattal中的Pbt_Tnam(表名)、Pbc_cmnt(表说明)字段,用数据管道工具传入到一个新表Sys_table表中,读取系统表pbcatcol中的Pbc_tname(表名)、Pbc_cnam(列名)、Pbc_Hdr(列说明)字段,用数据管道工具传入到一个新表Sys_column表中,并在Temp_column表中增加Pbc_sequence(列序号)、Pbc_Type(列类型)两个字段,以记录某列在表中的位置和类型。

(2)创建数据窗口(Datawindow)对象

数据表数据窗口d_table用来选择表,由Sys_table中的table_tnam和table_cmnt字段构成,只显示table_cmnt(表说明)列。

数据列数据窗口d_column用来选择所选表中的列,由Sys_column中的col_tname、col_cnam、col_sequence、col_Hdr、col_type字段构成,并且实际只要显示col_Hdr(列说明)列,以col_table、col_sequence排序。

条件数据窗口d_where构成动态SQL字符串的where子句,它是SQL字符串的关键。该数据窗口包括以下的七部分:“序号”+“左括号”+“名称”+“比较符”+“条件”+“右括号”+“逻辑符”。“名称”的Edit属性为下拉数据窗口(DropDownDW),数据窗口选择d_column,显示col_Hdr(列说明);“条件”的Edit属性中除选中Allow Editing(允许编辑)属性外,其余和“名称”完全一样;“比较符”、“逻辑符”、“左括号”和“右括号”的.Edit属性设置均可设置为下拉列表(DropDownListView),具体内容就不详细介绍了。

赋值数据窗口d_value的功能是:当要执行“插入(insert)”或“更新(update)”操作时,接收操作员输入的数值。该数据窗口可以直接用字符串“col_cnam”、“col _Hdr”、“col_value”构成。

(3)创建窗口对象并编码

创建三个窗口(图略)。窗口w_choice用来选择执行的操作,上面放置4个单选按钮;窗口w_process用来进行数据表、列、条件和赋值的操作,窗口上主要放置有4个数据窗口控件,控件名(数据窗口对象)分别为dw_table(d_table),dw_column(d_column),dw_where(d_where),dw_value(d_value),还有一个执行操作的按钮(bt_submit);窗口w_query用来显示查询操作的结果,主要有一个数据窗口控件,该控件的数据窗口是由查询操作动态生成的。

W_choice的功能相对简单,只要向w_process传递一个string类型的参数就可以了。

W_process接收w_choice传来的参数,在open事件中对w_process做相应的处理。例如当接收的参数值为“query”(代表执行查询)时,该窗口的操作按钮显示为“执行查询”,并使赋值数据窗口(dw_value)的enabled属性为“假”;当接收的参数为“insert”(代表执行插入)时,该窗口的操作按钮显示为“执行插入”,并使条件表达式数据窗口(dw_where)的enabled属性为“假”。窗口内bt_submit(执行操作)按钮Clicked事件通过检查该按钮上显示的字符判断要执行的操作,同时运行SQL语句。如果执行的操作是“查询”,则将SQL语句作为参数传递给W_query窗口,如果是其他的操作,则直接调用EXECUTE IMMEDIATE :string语句,完成对数据库的操纵功能。

W_query接收W_process窗口传来的参数,调用数据窗口动态生成函数显示查询结果。

结论

本文介绍了采用PowerBuilder开发工具编程实现数据库动态操纵功能的设计思路,并简单叙述了实现的方法和步骤。该方法可以在多种数据库系统环境下应用于各种数据库应用系统,包括电子商务系统的后台数据库管理。数据库动态操纵功能的灵活性,使得用户几乎可以完成所有可能的数据操纵要求(暂不能实现复杂查询功能,如Group分组)。但是数据库管理的灵活性和安全性是相互矛盾的,因此在以该思路开发具体的数据库应用系统时,应规划好数据库表的约束关系并在编码时充分考虑维护数据库的完整性;在运行时,应对该操作的权限进行严格控制。

如何实现100%的动态数据管道(二)数据库教程

实现千万级数据的分页显示数据库教程

远程管理SQL数据的方法数据库教程

Oracle常????}集(三)数据库教程

ChangeAllObjectOwner数据库教程

为下拉式数据窗口建立缓冲区数据库教程

Excel 访问远程数据的四种方法数据库教程

项目管理数据库教程

复制监视器数据库教程

组合查询数据库教程

如何实现100%的动态数据管道(三)数据库教程(精选10篇)

欢迎下载DOC格式的如何实现100%的动态数据管道(三)数据库教程,但愿能给您带来参考作用!
推荐度: 推荐 推荐 推荐 推荐 推荐
点击下载文档 文档为doc格式
点击下载本文文档