VB访问SQLServer数据库技术全揭密(1)
本文讨论了VisualBasic应用程序访问SQLServer数据库的几种常用的方法,分别说明了每种方法的内部机理并给出了每种方法的一个简单的实例,最后比较了每种方法性能和优缺点。
一、引言
SQLServer是微软推出的中小型网络数据库系统,是目前最常用的数据库系统之一。随着SQLServer网络数据库应用程序日益增多,这种Web数据库应用系统的正常运行一般依赖于已存在的用户数据库。创建维护数据库的工作可用SQLServer提供的SQLEnterpriseManager工具来进行,如能提供一种定制的数据库管理工具,通过管理应用程序来管理数据库及其设备,对用户来说无疑是最理想的。
VisualBasic作为一种面向对象的可视化编程工具,具有简单易学,灵活方便和易于扩充的特点。而且Microsoft为其提供了与SQLServer通信的API函数集及工具集,因此它越来越多地用作大型公司数据和客户机—服务器应用程序的前端,与后端的MicrosoftSQLServer相结合,VB能够提供一个高性能的客户机—服务器方案。
二、VB访问SQLServer数据的常用方法
使用VisualBasic作为前端开发语言,与SQLServer接口有几种常用的方法,即:
①数据访问对象/Jet
②为ODBCAPI编程
③使用SQLServer的VisualBasic库(VBSQL)为DB库的API编程
④RDO远程数据对象(RemoteDataObjects)
⑤ADO数据对象(ActiveDataObjects)
1、数据访问对象/Jet
VB支持DataAessObjects(DAOs)的子集。DAO的方法虽然不是性能最好的管理客户机—服务器之间的对话方式,但它的确有许多优点。DAO/Jet是为了实现从VB访问Aess数据库而开发的程序接口对象。使用DAOs访问SQLServer的过程如下:应用程序准备好语句并送至Jet,Jet引擎(MASJT200DLL)优化查询,载入驱动程序管理器并与之通讯,驱动程序管理器(ODBCDLL)通过调用驱动器(SQLSRVRDLL)的函数,实现连接到数据源,翻译并向SQLServer提交SQL语句且返回结果。下面是一个用DAOs访问SQLServer的VB实例。
注释:Form
DimmydbAsDatabase
DimmydynasetAsDynasetオ
PrivateSubForm_Load()
Setmydb=("",False,False,"ODBC;DSN=Myserver;WSID=LCL;DATABASE=sales")
Setmydynaset=mydb("SelectfromCustomers")オ
EndSubァ
上述例子是以非独占、非只读方式打开sales数据库,并检索Customers表中的所有字段。函数的最后一个参数是ODBC连接字符串参数,它指明了MicrosoftAess连接到SQLServer所需要知道的一些内容。其中“DSN”为数据源名,“WSID”为工作站名,“DATABASE”为所要访问的数据库名。
2、利用ODBCAPI编程
ODBC(OpenDatabase)的思想是访问异种数据库的一种可移植的方式。与数据资源对话的公用函数组装在一个称为驱动程序管理器(ODBCDLL)的动态连接中。应用程序调用驱动程序管理器中的函数,而驱动程序管理器反过来通过驱动器(SQLSRVRDLL)把它们送到服务器中。
下面的代码使用上面一些函数先登录到一个服务器数据库,并为随后的工作设置了语句句柄。
GlobalgiHEnvAsLong
GlobalgiHDBAsLong
GlobalgiHStmtAsLong
DimmyResultAsinteger
DimAsSrting
DimmyBuffAsString256
DimmyBufflenAsInteger
IfSQLAllocEnv(giHEnv)SQL_SUCCESSThen
MsgBox"Allocationcouldn注释:thappen!"
EndIf
If(giHEnv,giHDB)SQL_SUCCESSThen
MsgBox"SQLServercouldn注释:tconnect!"
EndIf
="DSN=myServer;UID=LCL;PWD=;APP=ODBCTest;WSID=LCL;DATABASE=sales"
myResult=(giHDB,Test,form1hWnd,len(),myBuff,256,myBufflen,SQL_DRIVER_COMPLETE_REQUIED)
myResult=(giHDS,giHStmt)
myResult=SQLFreeStmt(giHStmt,SQL_COLSE)
rsSQL="SelectfromCustomersWhereCity="Hunan""
myResult=(giHStmt,rsSQL,Len(rsSQL))
3、使用VBSQL对DB库API编程
DB库是SQLServer的本地API,SQLServer的VisualBasic库(VBSQL)为VisualBasic程序员提供API。从一定意义上说,VBSQL是连接VisualBasic程序到SQLServer的性能最好最直接的方式。VBSQL包含以下三个文件:
VBSQLVBX:包含库函数,具有访问重要的消息和处理错误的能力
VBSQLBI:包括所有的常量和变量说明
VBSQLHLP:Windows帮助文件,使用VBSQL的指南
使用VBSQL时,必须将VBSQLBI加入到VisualBasic工程文件中,并确保VB程序运行时有VBSQLVBX文件。
一般的DB库API编程的过程是这样的:先通过调用SqlInit对DB库进行初始化,再调用打开一个连接,然后就可做一些工作。下面的代码是一个初始化DB库并登录到服务器的通用例程
问:数据库连接不上;运行科脉商业管理系统后出现连接数据库的提示界面,进入了科脉系统?
答:(1)先检查网络是否正常,再检查SQL SERVER是否正常,可使用TELNET IP 1433命令来帮助分析。
(2)确认是数据库被挂起(是否断电的原因造成的)。
(3)如有备份,则可使用DB_SETUP重新装载备份的数据库文件即可恢复数据成功,所以必须要求客户每日备份数据。 科脉其他常见问题:1. 问:系统初始化加密狗失败,错误代码为“15”?
答:查看你的网络是否连通,插紧加密狗,有没有安装好加密狗驱动程序,如果没有请重新安装。
2. 问:初始化科脉系统时,系统提示连接不到科脉数据库?
答:有没有装载科脉数据库(DB_SETUP),或打开SQL SERVER的企业管理器,查看Databases下面有无KMJXC的数据库,如果没有请重新装载科脉数据库。
3. 问:为何在科脉商业管理系统中更改或删除条形码时只能用系统工程管理员去更改
答:为了客户能安全使用科脉商业管理系统,所以在科脉中只能用系统管理员去更改或删除条形码,而一般的 *** 作员是没有权限更改或删除条形码的。
4. 问:前台打印小票时,上一张小票与下一张小票空格太宽?
答:在前台收银机外设设置处把添加空行数目处,将头和尾的值进行修改,重新启动收银系统即可。
5. 问:类别毛利总金额与收银员汇总报表的总金额对不上、前台商品销售明细流水报表多于后台销售按商品汇总报表?
答:请做综合数据日结,在一般的情况下这两个报表是相等的,用户把一些商品资料从基本档案删除了,而前台收银机上还有这些商品资料。所以导致这两个报表对不上。
6. 问:在分布式版中为何分店的会员卡积分在总店不能查询?
答:分店的会员卡积分中能在各分店查询各自的会员卡积分,分店的会员卡积分不能传上总店,所以在总店不能查询分店会员卡积分的积分。
7. 问:为何在科脉启谋商业管理系统里设置电子称打印的标签格式不对?
答:在编辑标签后,保存时应注意保存到第几号标签,同时应设置电子称使用该标签,如果不是一致的就会导致打印格式不正确。
8.问:在前台销售的商品时,为何有些商品不能够打折?
答:(1)查看此收银员是否有打折的权限;
(2)在系统设置的前台POS机销售设置的界面上是否设置了启用前台指定商品不允许优惠控制功能,而这些不能打折的商品正好属于不允许优惠商品。
9. 问:在科脉启谋商业管理系统中,怎样设置验收入库单打印商品数量、进价和进价金额?
答:在kmjxcini的配置设置里面增加如下程序:在[app_env]下面增加“sheetprint_pi=prc1”保存设置即可。
10.问:安装科脉瑞通商业管理系统单机版,在初始化时系统提示连接不到数据库?
答:缺少SQLANYWHERE50数据库,请到相关网站下载或联系我公司技术支持部。
11.问:为何有些商品的电脑库存是一个负很大的数据?
答:请查看商品出入库报表,确认这些商品是否做过验收入库单,如果没有;请做商品验收入库单。
12.问:在前台设置中用DIY—POS—LED8[单行串口数字]客显启动钱箱,钱箱为何打不开?
答:因为用客显启动与打印机启动钱箱的指令不同,把原来开钱箱的指令改成“2,77”,然后设置好钱箱端口与客显端口一致即可。
13.问:数据库连接不上;运行科脉商业管理系统后出现连接数据库的提示界面,进入了科脉系统?
答:(1)先检查网络是否正常,再检查SQL SERVER是否正常,可使用TELNET IP 1433命令来帮助分析。
(2)确认是数据库被挂起(是否断电的原因造成的)。
(3)如有备份,则可使用DB_SETUP重新装载备份的数据库文件即可恢复数据成功,所以必须要求客户每日备份数据。
14.问:盈亏数量是怎样得出来的,商品电脑库存为负应怎样解决?
答:(1)盈亏数量是电脑库存与实盘数量之差的结果。
(2)商品的电脑库存为负,应找出它为负的原因,如这个商品从来就没有做过验收入库但前台又在销售,它的库存肯定为负,这时可以通过重新做验收入库或用其它单做入库处理。
15.问:在科脉商业管理系统V20中储值卡是怎样充值的
答:打开发放储值卡的菜单,输入要充值的卡号;按下充值管理输入卡号、充值金额,然后按下充值键即可。
16.问:入库单审核后在已审核单中未查到?
答:日期错误导致该单据被记录在别的日期下面,在当天的记录中当然找不到,请先检查这方面的原因。
17.问:能否把前台销售流水数据报表里面的小计金额去掉?
答:可以,打开前台销售流水数据报表上的设置键,打开报表属性设置——明细设置,把小计金额后面的“X”去掉就可以了。
18.问:在前台销售商品的数据跟后台商品数据对不上,如在前台销售50个同一商品,为何在后台查看商品销售时只有25个?
答:请在后台系统设置里面是否启用了万能数据处理功能,如果启用了此功能后台的数据随着数据处理的百分比的改变而改变。
19.问:在一台机器上设置好的商品价格标签打印的模块可否在其它的机器上调用?
答:可以,将设置好的模块保存后,在KMJXC的安装目录下的REPORT的LABELPRINTPSR文件复制到另外一台机器上的REPORT文件下面。
20.问:在科脉瑞通商业管理系统中,在结算时因储值卡上的金额不够可否用另外一张储值卡继续结帐
答:可以。在结算时储值卡上的金额不够系统会提示储值卡付款多少钱,待付金额多少钱,此时再按下储值卡键输入卡号继续付款。
21.问:科脉启谋商业管理系统中的盘点过程是怎样的
答:首先完成综合数据日结,其次做盘点初始化生成一个盘点批次号、盘点锁库、打印空盘点表、然后盘点单录入、复盘单录入(可选项)、生成盘点差异、生成漏盘商品、最后盘点审核。注意:在盘点过程还没有完成之前不能做任何影响库存的业务。
22.问:科脉启谋商业管理系统中注册后,提示注册成功但是不能进入科脉系统?
答:此为服务器数据库工作不正常,非输入序列号引起的错误,请重启服务器。
23.问:调进货价单与库存调价有何区别?
答:前者是调进价,后者是对以前某一次进货剩余的商品库存进行调价。
24.问:营业间在后台查询库存能否用商品条码来查询商品的库存?
答:可以,既可用商品编码又可以用条码查询商品的库存。
25.问:在分布式版中为何在总店做了零售特价单在分店不能实现?
答:(1)分店的仓库编码设置是否与总店设置分店的仓库编码一致,分店前台商品的出货仓是否选择本分店的仓库编码。
(2)查看商品零售特价单设置的有效时间。
26.问:能否把商品的特价信息用EXCEL的格式导出?
答:因为商品的特价信息不属于商品的基本档案,所以不能用EXCEL的格式导出,它只能打印出来。
27.问:会员特价单能否调出单据修改其中某些商品的特价信息,如某一商品的特价时间还未结束又将这商品做特价单,可以吗?商品销售又是按那个价格销售的?
答:(1)不能调出已审核过的单据进行修改,因为审核过的单据是不能修改的。
(2)在规定商品特价时间还未结束时可以再将这个商品做特价,销售是按新价格进行销售的。
28.问:前台折扣报表为何会出现折扣金额为负?有的商品为何上午可以打折而到了下午却不能打折?
答:(1)商品特价的金额高于商品原价金额时,前台折扣报表就会出现折扣金额为负。
(2)是否做了商品零售特价而又同时做了固定时间特价,而下午没有折扣是因为特价的时间还未到。
29.问:验收入库单与赠品入库单是否都跟供应商结算?
答:赠品入库单只增加商品库存的数量不用跟供应商结算,跟供应商结算的只是验收入库单。
30.问:为何在商品基本档案用手工录入8位的商品条码在前台不能扫描,系统提示没有此商品?
答:商品基本档案手工录入的8位条码是否与扫描q扫出来的8位条码是否一致。如果不一致,请在商品基本档案修改的条码使它与扫描q扫描出来的条码一致。
31.问:盘点可否做其它影响库存的业务?
答:在盘点过程还没有结束时,不能做任何影响库存的业务包括日结。
32.问:为何普通收银员没有前台设置权限的都可以按F6键选择商品的出货仓?
答:收银员无论有无前台设置权限的都可以按F6键选择商品的出货仓,是没有限制的。
33.问:为何在客流量大时前台键盘、条码q停止响应?
答:这应从硬件方面考虑机箱散热的问题,可以打开主板BIOS中的温度保护、增加内存;也可以在科脉商业管理系统中清空部分历史数据(注:在清空前先备份数据)
34.问:加密狗站点升级不成功?运行加密狗升级程序出错,报“当前使用非法,程序将关闭”?
答:系统未找到加密狗或加密狗驱动未安装,导致许可证管理程序找不到接口出错,安装加密狗驱动应可正常。
35.问:在前台完成了盘点数据的录入,但查询库存为“0”?
答:虽然完成了盘点数据录入,但未进行数据处理,须将前台盘点数据文件拷贝到后台,并在盘点录入单中导入数据,前台盘点数据默认保存在安装目录下的POSDATE中且带有日期的格式文件;按下盘点单上的编辑键导入“盘点数据”即可,然后保存审核才能生效。
36.问:在科脉启谋商业管理体系统中盘点时有些为负库存的商品未点数,可否更正这些商品的库存数量。
答:可以,通过打印漏盘商品报表来确认未盘商品及其数量,然后通过再次盘点录入或其它单来作入库调整。
37.问:打印机没有钱箱接口,用川田的VFD8CV客显可否打开钱箱?
答:可以,将客显接在相应端口并连接好钱箱,在软件中设置钱箱端口与客显相同,并将开钱箱的指令修改为“31,77”即可。(注:本指令只能打开12V的钱箱)
38.问:会员特价按折扣的如何设置?会员特价单中如何让电脑自动按一定折扣生成特价?
答:(1)在会员卡类别是定义折扣卡,可定出如8折或9折的卡类别。
(2)可以实现此功能,在系统设置中定义“会员特价率”,则系统在制作会员特价单时将自动按进价、售价、会员特价率自动计算会员特价。
39.问:分布式分店初始化不了,在分店使用数据通信中的初始化时,软件提示没有设置传输权限?
答:由于在分店先安装了一套网络版并使用进入了软件,然后又只是安装了软件分布式客户端,然后再使用数据通信中的初始化,此时软件肯定提示说没有传输权限,因为此时在此店的数据库中本店仓库代码是00(即网络版默认仓库),但00是总店的仓库代码,肯定不在总店的传输权限设置中,所以拨号后传输初始化时出现此提示。解决方法:重新安装分店的数据库,则运行程序后会提示输入分店名称和代码,则输入后初始化即可。
40.问:在科脉启谋商业管理系统分布式版中,在总店做分店的入库单后在总店查商品库存汇总报表(仓库)和在分店查的商品汇总报表(仓库)对不上?
答:请检查总店与分店验收单据的数量,如果对不上,请在分店重新下载数据或下载全部数据;也可以利用数据通信辅助处理功能把某些还未传下分店的单据传到分店。
41.问:在科脉启谋商业管理系统中,在商品基本档案中,如果当前已有一个商品的资料,且该商品有类别和供应商,点新增按钮后程序不能提供商品的供应商和类别,以前的程序是可以的?
答:以前的程序的确可以。但考虑到商品的供应商会对业务产生影响,包括进货和进销存结余等会与结算产生关系,为了不对各种报表及结算数据造成很大的错误影响,程序不再默认采用原来的商品的供应商,而要求录入员手工输入。
42.问:在科脉启谋商业管理系统中,为何前台班结后收银员班结报表上的金额比实际收银金额少很多?
答:因为经常退出收银系统或重新启动计算机造成的原因,这种情况下班结时系统只当前的收银记录做班结而没有对以前曾退出收银系统或重新启动计算机后重新进入收银系统做记录,所以班结后的报表会比实际收银员的报表上有金额少。
43.问:打印商品资料时内容太多,有些东西是不想打印的;浪费纸。
答:可以在浏览界面中通过拖动标题栏来屏蔽一些不要的列。
44.问:要打印某供应商的商品,但太多供应商了很麻烦?
答:可以在供应商商品浏览打印,这样可以只打印一个供应商所供应的商品。
45.问:商品进价经常变化,但又不能定死;能不能监控价格变化?
答:在采购入库报表中可以查看每个商品的入库历史、价格。
46.问:商品进货时进价过度,销售一段时间后供应商同意将未销售的部分商品降低供货价,在科脉商业管理系统V30中如何处理?
答:(1)常规方法是采用“空退空进”的方式来解决,即先用原来的进价将剩余部分退货出去,然后再用新的进价做入库,可以达到目的,但此部分商品的帐期会顺延。
(2)采用“库存调价单”也可以达到目的,即将上次或历次进货的部分或全部商品的进价作出调整。
47.问:在科脉启谋商业管理系统中能否提供一套比较正确的影响成本的单据方法?
答:一般来说,只要是非销售的、出入库且不以成本价出入库的单据就要影响成本。这些业务建议影响成本:赠送入库单、库存调价单、库存更正单、其它单、盘点审批单、验收入库单、销售退货单、采购退货单。另外,还有些单据如果企业内部规则不以成本价计的也要让其影响成本,如:报损单、领用单、各种调拨单等
MySQL数据同步主要有三种方式:
1利用MySQL自身的数据库同步功能
2利用MySQL数据库的特性(数据库存在固顶目录,并且以文件形式存储),进行数据库目录同步以达到数据同步目的
3利用专用的MySQL数据库同步软件
1利用MySQL自身的数据库同步功能:
MySQL从32315版本以后提供数据库复制功能。利用该功能可以实现两个数据库同步,主从模式,互相备份模式的功能
数据库同步复制功能的设置都在mysql的设置文件中体现。mysql的配置文件(一般是mycnf),在unix环境下在/etc/mysql/mycnf或者在mysql用户的home目录下的mycnf。
windows环境中,如果c:根目录下有mycnf文件则取该配置文件。当运行mysql的winmysqladminexe工具时候,该工具会把c:根目录下的mycnf命名为mycnfbak。并在winnt目录下创建myini。mysql服务器启动时候会读该配置文件。所以可以把mycnf中的内容拷贝到myini文件中,用myini文件作为mysql服务器的配置文件。
设置方法:
设置范例环境:
*** 作系统:window2000professional
mysql:404-beta-max-nt-log
Aip:10101022
Bip:10101053
A:设置
1增加一个用户最为同步的用户帐号:
GRANTFILEONTObackup@'10101053'IDENTIFIEDBY‘1234’
2增加一个数据库作为同步数据库:
createdatabasebackup
B:设置
1增加一个用户最为同步的用户帐号:
GRANTFILEONTObackup@'10101022'IDENTIFIEDBY‘1234’
2增加一个数据库作为同步数据库:
createdatabasebackup
主从模式:A->B
A为master
修改Amysql的myini文件。在mysqld配置项中加入下面配置:
server-id=1
log-bin
#设置需要记录log可以设置log-bin=c:mysqlbakmysqllog设置日志文件的目录,
#其中mysqllog是日志文件的名称,mysql将建立不同扩展名,文件名为mysqllog的几个日志文件。
binlog-do-db=backup#指定需要日志的数据库
重起数据库服务。
用showmasterstatus命令看日志情况。
B为slave
修改Bmysql的myini文件。在mysqld配置项中加入下面配置:
server-id=2
master-host=10101022
master-user=backup#同步用户帐号
master-password=1234
master-port=3306
master-connect-retry=60预设重试间隔60秒
replicate-do-db=backup告诉slave只做backup数据库的更新
重起数据库
用showslavestatus看同步配置情况。
注意:由于设置了slave的配置信息,mysql在数据库目录下生成masterinfo
所以如有要修改相关slave的配置要先删除该文件。否则修改的配置不能生效。
双机互备模式。
如果在A加入slave设置,在B加入master设置,则可以做B->A的同步。
在A的配置文件中mysqld配置项加入以下设置:
master-host=10101053
master-user=backup
master-password=1234
replicate-do-db=backup
master-connect-retry=10
在B的配置文件中mysqld配置项加入以下设置:
log-bin=c:mysqllogmysqllog
binlog-do-db=backup
注意:当有错误产生时err日志文件。同步的线程退出,当纠正错误后要让同步机制进行工作,运行slavestart
重起AB机器,则可以实现双向的热备。
测试:
向B批量插入大数据量表AA(1872000)条
A数据库每秒钟可以更新2500条数据。
2数据库目录同步:
方法和文件同步一样,设置好需要同步的两个数据库目录就可以了!
缺点很明显,数据同步只能单向进行,可以作为备份方案
3用专用的MySQL同步软件进行同步 :
这方面的软件有SQLBalance和MyReplicator,优点是方便直观,还有很多争强功能!
缺点和2一样,只能单项同步!
当然也可以修改镜像网站的程序为提交数据到母数据库,读取则在当前镜像下的数据,不过,修改起来麻烦!普通用户修改也非常难!呵呵,大家了解一下就可以!给大家一个思路!有能力的朋友可以试试阿!
4关于MySQL论坛的数据同步
由于数据来源的不可控制(不好表达),论坛数据是实时的,而且还要考虑来自镜像论坛的数据,如何实现镜像论坛与母论坛数据同步呢
用1中介绍的MySQL自带的数据库同步功能互相备份模式就可以实现的!
不过,具体的应用我没有测试!稳定性不敢保证!
有能力的朋友推荐用下面这种思路来同步,相对来说减少点效率,但能减少发生的错误!
比如镜像论坛数据同步:
1母论坛和镜像论坛的数据全写在母论坛数据库里,主从模式,读取只在本地读取,这个需要修改程序!
2每次写数据,都同时提交到两个数据库中,安全,但是效率很差,也得修改程序!
MSSQL
MSSQL数据同步利用数据库复制技术实现数据同步更新(来自网络,也是非常完美的教程)
复制的概念 :
复制是将一组数据从一个数据源拷贝到多个数据源的技术,是将一份数据发布到多个存储站点上的有效方式。使用复制技术,用户可以将一份数据发布到多台服务器上,从而使不同的服务器用户都可以在权限的许可的范围内共享这份数据。复制技术可以确保分布在不同地点的数据自动同步更新,从而保证数据的一致性。
SQL复制的基本元素包括
出版服务器、订阅服务器、分发服务器、出版物、文章
SQL复制的工作原理
SQLSERVER主要采用出版物、订阅的方式来处理复制。源数据所在的服务器是出版服务器,负责发表数据。出版服务器把要发表的数据的所有改变情况的拷贝复制到分发服务器,分发服务器包含有一个分发数据库,可接收数据的所有改变,并保存这些改变,再把这些改变分发给订阅服务器
SQLSERVER复制技术类型
SQLSERVER提供了三种复制技术,分别是:
1、快照复制(呆会我们就使用这个)
2、事务复制
3、合并复制
只要把上面这些概念弄清楚了那么对复制也就有了一定的理解。接下来我们就一步一步来实现复制的步骤。
第一先来配置出版服务器
(1)选中指定[服务器]节点
(2)从[工具]下拉菜单的[复制]子菜单中选择[发布、订阅服务器和分发]命令
(3)系统d出一个对话框点[下一步]然后看着提示一直 *** 作到完成。
(4)当完成了出版服务器的设置以后系统会为该服务器的树形结构中添加一个复制监视器。同时也生成一个分发数据库(distribution)
第二创建出版物
(1)选中指定的服务器
(2)从[工具]菜单的[复制]子菜单中选择[创建和管理发布]命令。此时系统会d出一个对话框
(3)选择要创建出版物的数据库,然后单击[创建发布]
(4)在[创建发布向导]的提示对话框中单击[下一步]系统就会d出一个对话框。对话框上的内容是复制的三个类型。我们现在选第一个也就是默认的快照发布(其他两个大家可以去看看帮助)
(5)单击[下一步]系统要求指定可以订阅该发布的数据库服务器类型,SQLSERVER允许在不同的数据库如ORACLE或ACCESS之间进行数据复制。但是在这里我们选择运行"SQLSERVER2000"的数据库服务器
(6)单击[下一步]系统就d出一个定义文章的对话框也就是选择要出版的表
(7)然后[下一步]直到 *** 作完成。当完成出版物的创建后创建出版物的数据库也就变成了一个共享数据库。
第三设计订阅
(1)选中指定的订阅服务器
(2)从[工具]下拉菜单中选择[复制]子菜单的[请求订阅]
(3)按照单击[下一步] *** 作直到系统会提示检查SQLSERVER代理服务的运行状态,执行复制 *** 作的前提条件是SQLSERVER代理服务必须已经启动。
(4)单击[完成]。完成订阅 *** 作。
完成上面的步骤其实复制也就是成功了。但是如何来知道复制是否成功了呢?这里可以通过这种方法来快速看是否成功。展开出版服务器下面的复制——发布内容——右键发布内容——属性——击活——状态然后点立即运行代理程序接着点代理程序属性击活调度把调度设置为每一天发生,每一分钟,在0:00:00和23:59:59之间。接下来就是判断复制是否成功了打开C:/ProgramFiles/MicrosoftSQLServer/MSSQL/REPLDATA/unc/XIAOWANGZI_database_database下面看是不是有一些以时间做为文件名的文件夹差不多一分中就产生一个。要是你还不信的话就打开你的数据库看在订阅的服务器的指定订阅数据库下看是不是看到了你刚才所发布的表—
一个手工同步的方案
--定时同步服务器上的数据
--例子:
--测试环境,SQLServer2000,远程服务器名:xz,用户名为:sa,无密码,测试数据库:test
--服务器上的表(查询分析器连接到服务器上创建)
createtable[user](idintprimarykey,numbervarchar(4),namevarchar(10))
--以下在局域网(本机 *** 作)
--本机的表,state说明:null表示新增记录,1表示修改过的记录,0表示无变化的记录
ifexists(selectfromdbosysobjectswhereid=object_id(N'[user]')andOBJECTPROPERTY(id,N'IsUserTable')=1)
droptable[user]
GO
createtable[user]
(idintidentity(1,1),numbervarchar(4),namevarchar(10),statebit)
go
--创建触发器,维护state字段的值
createtriggert_stateon[user]
afterupdate
as
update[user]setstate=1
from[user]ajoininsertedbonaid=bid
whereastateisnotnull
go
--为了方便同步处理,创建链接服务器到要同步的服务器
--这里的远程服务器名为:xz,用户名为:sa,无密码
ifexists(select1frommastersysserverswheresrvname='srv_lnk')
execsp_dropserver'srv_lnk','droplogins'
go
execsp_addlinkedserver'srv_lnk','','SQLOLEDB','xz'
execsp_addlinkedsrvlogin'srv_lnk','false',null,'sa'
go
--创建同步处理的存储过程
ifexists(selectfromdbosysobjectswhereid=object_id(N'[dbo]
[p_synchro]')andOBJECTPROPERTY(id,N'IsProcedure')=1)
dropprocedure[dbo][p_synchro]
GO
createprocp_synchro
as
--setXACT_ABORTon
--启动远程服务器的MSDTC服务
execmasterxp_cmdshell'isql/S"xz"/U"sa"/P""/q"execmasterxp_cmdshell''netstartmsdtc'',no_output"',no_output
--启动本机的MSDTC服务
--execmasterxp_cmdshell'netstartmsdtc',no_output
--进行分布事务处理,如果表用标识列做主键,用下面的方法
--BEGINDISTRIBUTEDTRANSACTION
--同步删除的数据
deletefromsrv_lnktestdbo[user]
whereidnotin(selectidfrom[user])
--同步新增的数据
insertintosrv_lnktestdbo[user]
selectid,number,namefrom[user]wherestateisnull
--同步修改的数据
updatesrv_lnktestdbo[user]set
number=bnumber,name=bname
fromsrv_lnktestdbo[user]a
join[user]bonaid=bid
wherebstate=1
--同步后更新本机的标志
update[user]setstate=0whereisnull(state,1)=1
--COMMITTRAN
go
--创建作业,定时执行数据同步的存储过程
ifexists(SELECT1frommsdbsysjobswherename='数据处理')
EXECUTEmsdbdbosp_delete_job@job_name='数据处理'
execmsdbsp_add_job@job_name='数据处理'
--创建作业步骤
declare@sqlvarchar(800),@dbnamevarchar(250)
select@sql='execp_synchro'--数据处理的命令
@dbname=db_name()--执行数据处理的数据库名
execmsdbsp_add_jobstep@job_name='数据处理',
@step_name='数据同步',
@subsystem='TSQL',
@database_name=@dbname,
@command=@sql,
@retry_attempts=5,--重试次数
@retry_interval=5--重试间隔
--创建调度
EXECmsdbsp_add_jobschedule@job_name='数据处理',
@name='时间安排',
@freq_type=4,--每天
@freq_interval=1,--每天执行一次
@active_start_time=00000--0点执行
select 字段列表 from 表1 join 表2 on 两个表之间的关联条件
select 字段列表 from 表1,表2 where 两个表之间的关联条件
上面这两句是一个意思,都属于连接查询中的内连接,返回完全满足关联条件的记录;第一句其实完整写法应该这样:select 字段列表 from 表1 inner join 表2 on 两个表之间的关联条件
-----------------------------------
inner join内部连接 两表都满足的组合
full outer 全连 两表相同的组合在一起,A表有但B表没有的数据(显示null), 同样B表有,A表没有的显示为(null)
A表 left join B表 左连,以A表为基础,A表的全部数据,B表有的组合。没有的为null
A表 right join B表 右连,以B表为基础,B表的全部数据,A表的有的组合。没有的为null
查询分析器中执行:
--建表table1,table2:
create table table1(id int,name varchar(10))
create table table2(id int,score int)
insert into table1 select 1,'lee'
insert into table1 select 2,'zhang'
insert into table1 select 4,'wang'
insert into table2 select 1,90
insert into table2 select 2,100
insert into table2 select 3,70
如表
-------------------------------------------------
table1| table2|
-------------------------------------------------
|id name| |id score|
|1 lee| |1 90|
|2 zhang| |2 100|
|4 wang| |3 70|
-------------------------------------------------
以下均在查询分析器中执行
一、外连接
1概念:包括左向外联接、右向外联接或完整外部联接
2左连接:left join 或 left outer join
(1)左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行
,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。
(2)sql语句
select from table1 left join table2 on table1id=table2id
-------------结果-------------
| id | name | id | score |
------------------------------
| 1 | lee | 1 | 90 |
| 2 | zhang | 2 | 100 |
| 4 | wang |NULL| NULL |
------------------------------
注释:包含table1的所有子句,根据指定条件返回table2相应的字段,不符合的以null显示
3右连接:right join 或 right outer join
(1)右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
(2)sql语句
select from table1 right join table2 on table1id=table2id
-------------结果-------------
|id | name | id | score |
------------------------------
| 1 | lee | 1 | 90 |
| 2 |zhang | 2 | 100 |
|NULL| NULL | 3 | 70 |
------------------------------
注释:包含table2的所有子句,根据指定条件返回table1相应的字段,不符合的以null显示
4完整外部联接:full join 或 full outer join
(1)完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行
,则整个结果集行包含基表的数据值。
(2)sql语句
select from table1 full join table2 on table1id=table2id
-------------结果-------------
| id | name | id | score |
------------------------------
| 1 | lee | 1 | 90 |
| 2 | zhang| 2 | 100 |
| 4 | wang|NULL| NULL|
|NULL| NULL| 3 | 70 |
------------------------------
注释:返回左右连接的和(见上左、右连接)
二、内连接
1概念:内联接是用比较运算符比较要联接列的值的联接
2内连接:join 或 inner join
3sql语句
select from table1 join table2 on table1id=table2id
-------------结果-------------
| id | name | id | score |
------------------------------
| 1 | lee | 1 | 90 |
| 2 | zhang| 2 | 100 |
------------------------------
注释:只返回符合条件的table1和table2的列
4等价(与下列执行效果相同)
A:select a,b from table1 a,table2 b where aid=bid
B:select from table1 cross join table2 where table1id=table2id (注:cross join后加条件只能用where,不能用on)
三、交叉连接(完全)
1概念:没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。
(table1和table2交叉连接产生33=9条记录)
2交叉连接:cross join (不带条件where)
3sql语句
select from table1 cross join table2
-------------结果-------------
| id | name | id | score |
------------------------------
| 1 | lee | 1 | 90 |
| 2 | zhang| 1 | 90 |
| 4 | wang| 1 | 90 |
| 1 | lee| 2 | 100 |
| 2 | zhang| 2 | 100 |
| 4 | wang| 2 | 100 |
| 1 | lee | 3 | 70 |
| 2 | zhang| 3 | 70 |
| 4 | wang| 3 | 70 |
------------------------------
注释:返回33=9条记录,即笛卡尔积
4等价(与下列执行效果相同)
A:select from table1,table2
以上就是关于网络怎么连接数据库全部的内容,包括:网络怎么连接数据库、怎么才能连接数据库啊、如何将本地数据库与远程数据库连接等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)