摘 要:目前公用电话交换网应用极普及、成本最低廉的公用通讯网络,本文从分析比较数据库数据远程传输的实现策略出发,说明如何在应用程序中通过远程拨号网络实现数据库连接和操作,详细地描述了实现远程两台计算机连接所涉及的各方面设置和操作过程。
关键字:VB 连接 配置 Sybase 拨号网络 传输 PPP TCP/IP
随着计算机应用的日益广泛,常常会遇到远程数据传输和数据访问问题,没有网络就没有应用,在跨地区、跨省甚至跨国的企业应用系统中通信方式尤其重要。
一、公用电话交换网及其应用特点:
租用专用线路,利用率较低,也不经济;公用电话交换网(PSTN,Public Switch Telephone Network),即现代日常生活中常用的电话网,是当前初始投资最少,普及程度最高、通信费用最低的公用通讯网络,它在网络互连中有着广泛的应用,是一种不可替代的联网技术。特别是Bellcore发明的建立在PSTN基础之上的xDSL技术和产品的应用,结合骨干通讯线路上光纤、DWDM技术成熟与推广,使得联网速度可达到9Mbps~52Mbps之间,拓展了PSTN的发展和应用空间,
PSTN是一种以模拟技术为基础的电路交换网络,通道之间经由若干个电话交换机连接而成。当两个主机或路由器设备需要通过PSTN连接时,在两端的网络接入侧(即用户回路侧)使用调制解调器(Modem)实现信号的模/数、数/模转换。目前,大多数上网设备,如PC或者路由器,均提供有若干个串行端口,串行口和Modem之间采用RS-232等串行接口规范。这种连接方式的费用比较经济,收费价格与普通电话的收费相同,可适用于数据批量传输、通信频度低的应用环境。
电话网络的应用一般可分为两种类型,一种是同等级别机构之间以按需拨号(DDR)的方式实现互连,另一种是ISP为拨号上网用户提供的远程访问服务的功能。通过PSTN可以实现,拨号上Internet/Intranet/LAN;两个或多个LAN之间的网络互连;和其它广域网技术的互连。本文主要应用前一种类型为通信方式。
图1
以Sybase 11.9.2、Visual Basic 6.0为例,编制一个实用的财务管理软件,采用公用电话交换网进行远距离数据库数据传输和访问,应用企业机构分布见(图1),具体设置和通信编程细节详细叙述如下:
二、数据库数据远程传输的实现策略比较:
数据库远程传输的实现方法有多种:
图2
1.使用Internet Transfer控件(选择FTP协议)或用FTP传输文件的方式实现:
数据库远程传输大概可分如下三个阶段,如图2(A)所示。
①.本地数据库拆卸成文本文件;
②.本地卸出文件用FTP可靠地传输到远地;
③.远地数据库的重新装入。
存在编程繁琐,产生中间可理解文件,速度慢的缺点。
2.使用Winsock控件直接读写传输数据的方式实现:
数据库远程传输大概可分如下四个阶段,如图2(B)所示。
①.本地程序连接本地数据库,按字段读取传输数据;
②.本地程序使用Winsock控件将数据向远地发送;
③.远地程序使用Winsock控件将数据接收;
④.远地程序连接本地数据库,重新写入传输数据。
但有编程复杂,不易调试,运行不稳定,容易出现错误的缺点。
3.以客户端/服务器连接方式,实现远程数据传输:
利用Sybase数据库的Dsedit程序进行配置,使远地通信的两端互为客户端/服务器,用程序直接读写操作,进行传输,如图2(C)所示。具有编程简单,速度快,传输安全可靠的特点。是本人摸索出的一种方法,以下内容主要详细介绍这种实现方法。
三、以Windows NT操作系统为例安装设置“远程访问服务”:
1.首先在NT上安装拨号网络服务器,安装远程访问软件(RAS)。RAS可以在“定制安装”时,或是在WinNT的初始安装退出之后安装。在“快速安装”时,如果计算机内没有安装网卡,则默认安装RAS。
2.添加“远程访问服务”软件的方法:
(1)选择“控制面板”中的“网络”选项→“服务”(见图3)。
图3
(2)如果没有安装“远程访问服务”,单击“远程访问服务” →“添加”按钮→从“网络服务”下拉式列表内选择“远程访问服务”(见图4),然后选择“确定”。出现源文件路径的提示后,输入路径,并选择“确定”。
图4
(3)如果已安装“远程访问服务”,单击“远程访问服务” →“属性”按钮→出现“安装远程访问”,点击“添加”按钮→出现“添加RAS设备”(见图5)→点击“安装调制解调器”按钮→ 与安装调制解调器过程同,会询问是否自动检测MODEM,按提示安装MODEM。
图5
(4)安装调制解调器过程完成后(见图6),单击“COM1” →点击“配置”按钮。
图6
(5)“配置端口用法”在“端口用法”框中,选定端口的使用方式为“拨出与接收”(见图7)表示计算机可以作为客户或者服务器。
图7
(6)在“安装远程访问”对话框中,点击“网络”按钮→(见图8)
图8
(7)点击“配置”按钮→(见图9),即可设置“RAS服务器TCP/IP配置”。在配置RAS服务器时,网络的访问范围可设为整个网络,或仅限于RAS服务器。
图9
(8)完成端口和网络配置设置后,选择“继续”完成。
四、应用“域用户管理器”为远程登录用户设置所用用户名、密码等:
1.在“开始”→“程序”→“管理工具(公用)”→“域用户管理器”下,增加远程登录域用户,主菜单“用户”→“新用户”(见图10)→本例输入用户remoteuser(用户自定义)。
图10
2.点击“组”按钮→(见图11)
图11
3.点击“帐号”按钮→(见图12)
图12
4.点击“拨入”按钮→(见图13)
图13
5.增加远程登录域用户后,结果(见图14)。
图14
五.应用“远程访问系统管理”对远程访问进行管理:
1.在“开始”→“程序”→“管理工具(公用)”→“远程访问系统管理”(见图15)→查看远程访问服务是否启动。
图15
2.为“远程访问授权”,在主菜单“用户”→“权限”中,选中“赋予用户拨入的权限”(见图16)。
图16
六.设置网络IP地址和Sybase数据库中IP地址:
1.本地主机IP地址设置:“控制面板”→“网络”→“协议”→单击“TCP/IP通讯协议”(见图17)。
图17
→点击“属性”按钮→定义本机地址:本例为100.10.200.10(见图18)。
图19
2.设置Sybase本地服务器IP地址和增加SYBASE远程服务器IP地址:
(1)修改Sybase中服务器地址与本地主机IP地址相对应一致,具体如下:
“程序”→“Sybase”→“Dsedit”→“OK”→(放大后)→SERVERA(根据用户设置而异)→“Server Address”(右键)→“Modifity Attribute”→“Edit”,在“Network Address”中设置格式:服务器IP地址+“,”+Server端口号(为5000),本例为100.10.200.10,5000(见图19)。
图19
(2)①承上步复制protocol中NLWNSCK协议字样(快捷键为ctrl+c),点击OK。 ②增加远程Sybase服务器:点击主菜单的“Server Object” →“Add…”→输入服务名称“Server Name”:本例为“RemoteServerA”(任意命名)→配置同上步“Server address”相似,点击“RemoteServerA”→“Server Address”(右键)→“Modifity Attribute”→“Add”→把刚才复制的NLWNSCK协议字样粘贴在Protocol中(快捷键为Ctrl+V),并在“Network Address”中录入本例为100.10.200.20,5000(即所要连接远程服务器的服务器地址),点击OK(见图20)。
图20
3.设置后重新启动计算机。
七.程序处理细节
财务管理软件的数据库名称为finance,其中涉及数据传输处理方面,包括CommList一个表,其结构如下:
表CommList结构:
字段名称 宽度 注释
code nchar(16) 报表编号
subjectcode nchar(8) 科目代号
money numeric(15,2) 金额
flag nchar(1) 处理标志
图21
主要程序代码清单:
在Form1中添加1个Label控件;1个Text控件;5个Command控件;1个StatusBar控件;1个Adodc控件,Adodc1.visible=False;1个DataGrid控件,DataGrid1.DataSource=Adodc1,(见图21)。
1.添加表单(Form1.frm
'在工程菜单中引用Microsoft ActiveX Data Object 2.0 Library
Private Sub Form_Load()
'连接状态
'确定是否存在一个连接
bConnected = InternetConnected(eR, sName)
'连接的详细信息
If (eR And INTERNET_CONNECTION_MODEM) = INTERNET_CONNECTION_MODEM Then
Form1.StatusBar1.Panels(1) = "使用调制解调器链接;"
End If
If (eR And INTERNET_CONNECTION_LAN) = INTERNET_CONNECTION_LAN Then
Form1.StatusBar1.Panels(1) = StatusBar1.Panels(1) & "使用局域网链接;"
End If
If (eR And INTERNET_CONNECTION_PROXY) = INTERNET_CONNECTION_PROXY Then
Form1.StatusBar1.Panels(1) = StatusBar1.Panels(1) & "使用代理服务器链接;"
End If
'是否配置连接
If (eR And INTERNET_CONNECTION_CONFIGURED) = INTERNET_CONNECTION_CONFIGURED Then
Form1.StatusBar1.Panels(2) = "已配置连接"
Else
Form1.StatusBar1.Panels(2) = "未配置连接"
End If
'是否配置远程服务
If (eR And INTERNET_RAS_INSTALLED) = INTERNET_RAS_INSTALLED Then
Form1.StatusBar1.Panels(3) = "已安装远程服务(RAS)"
Else
Form1.StatusBar1.Panels(3) = "未安装远程服务(RAS)"
End If
'连接状态
If (eR And INTERNET_CONNECTION_OFFLINE) = INTERNET_CONNECTION_OFFLINE Then
Form1.StatusBar1.Panels(4) = "处于断开状态......"
Else
Form1.StatusBar1.Panels(4) = "处于链接状态......"
End If
End Sub
Private Sub adodc1_init()
Adodc1.CursorType = adOpenKeyset
Adodc1.ConnectionString = "Provider=MSDASQL;DRIVER={Sybase System 11};Persist Security Info=False;DSN=;SRVR=ServerA;DB=finance;UID=comm;PWD=commuser" '用户comm应有足够的权限
Adodc1.CommandType = adCmdText
Adodc1.RecordSource = "select * from CommList"
End Sub
'拨号连接
Private Sub Command1_Click(Index As Integer)
Form2.Show 1 '也可以直接调用“电话网络拨号”程序(rasphone.exe)
'注:拨号电话为:所连接远程服务器的电话号码,域为Domain,用户名称为remoteuser,用户口令为remoteuser(皆为上述远程服务器在“域用户管理器”中所设置内容)。
End Sub
'查询本地报表数据
Private Sub Command2_Click(Index As Integer)
Adodc1.ConnectionString = "Provider=MSDASQL;DRIVER={Sybase System
11};Persist Security
Info=False;DSN=;SRVR=ServerA;DB=finance;UID=comm;PWD=commuser"
Adodc1.CommandType = adCmdText
Adodc1.RecordSource = "select * from CommList"
Adodc1.Refresh
DataGrid1.Refresh
DataGrid1.Caption = "查询本地报表数据"
End Sub
'传输数据
Private Sub Command3_Click(Index As Integer)
Dim i As Integer
'注释: 连接本地数据库,如果不建立DSN,可采取无DSN连接方法
ConnString = "Provider=MSDASQL;DRIVER={Sybase System 11};" & "Persist Security Info=False;DSN=;" & "SRVR=ServerA;DB=finance;UID=comm;PWD=commuser"
If ConnectLocal(ConnString) Then
StrSQL = "Select * from CommList" '注释:strSQL可以是SQL语句(块),存储过程
rsLocal.CursorLocation = adUseClient
rsLocal.Open StrSQL, cnLocal '注释:cnLocal为打开的活动的连接
rsLocal.MoveFirst
Else
MsgBox "警告:与本地数据库联接失败!请检查参数配置是否正确?"
Exit Sub
End If
'注释: 连接远程数据库,如果不建立DSN,可采取无DSN连接方法
ConnString = "Provider=MSDASQL;DRIVER={Sybase System 11};" & "Persist Security Info=False;DSN=;" & "SRVR=RemoteServerA;DB=finance;UID=comm;PWD=commuser"
If ConnectRemote(ConnString) Then
rsRemote.Open "CommList", cnRemote, adOpenKeyset, adLockOptimistic, adCmdTable
rsRemote.MoveLast
'两个表中的字段类型应一致
i = 0
cnRemote.BeginTrans
Do While Not rsLocal.EOF
i = i + 1
rsRemote.AddNew
rsRemote(0) = rsLocal(0)
rsRemote(1) = rsLocal(1)
rsRemote(2) = rsLocal(2)
rsRemote(3) = rsLocal(3)
rsRemote.Update
rsLocal.MoveNext
'I用于显示已导入了多少条记录。
Loop
'询问是否提交所做的增加
If MsgBox("确认传输吗?", vbYesNo, "程序提示:") = vbYes Then
cnRemote.CommitTrans
Else
cnRemote.RollbackTrans
End If
rsLocal.Close
cnLocal.Close
Set cnLocal = Nothing
rsRemote.Close
cnRemote.Close
Set cnRemote = Nothing
Else
rsLocal.Close
cnLocal.Close
Set cnLocal = Nothing
MsgBox "警告:与远程数据库联接失败!请检查参数配置是否正确?"
Exit Sub
End If
End Sub
'查询远程报表数据
Private Sub Command4_Click(Index As Integer)
Dim myexit As Integer
On Error GoTo ErrHand
If (eR And INTERNET_CONNECTION_MODEM) = INTERNET_CONNECTION_MODEM Then
Adodc1.ConnectionString = "Provider=MSDASQL;DRIVER={Sybase System 11};Persist Security Info=False;DSN=;SRVR=RemoteServerA;DB=finance;UID=comm;PWD=commuser"
Adodc1.CommandType = adCmdText
Adodc1.RecordSource = "select * from CommList"
Adodc1.Refresh
DataGrid1.Refresh
DataGrid1.Caption = "查询远程报表数据"
Else if
myexit = MsgBox("没有使用调制解调器与远程机器建立链接!, VbOkOnly, "程序运行提示:")
End Sub
End If
ErrHand:
myexit = MsgBox("错误程序:" & Err.Source & Chr(10) & "错误代码:" & Err.Number & Chr(10) & "错误信息:" & Err.Description, vbAbortRetryIgnore, "错误信息提示:")
If myexit = 3 Then
Err.Clear
Unload Me
Else
If myexit = 4 Then
Err.Clear
Resume
Else
Err.Clear
Resume Next
End If
End If
End Sub
'退出
Private Sub Command5_Click(Index As Integer)
Dim temp As Long
temp = RasHangUp(hRasConn) '挂断电话
Unload Me
End Sub
Private Sub Form_Unload(Cancel As Integer)
Unload Me
End Sub
2.添加连接数据库模块(connection_Dbase.bas)
'用于连接本地数据库
Public cnLocal As New ADODB.Connection ' 注释:声明ADO连接对象,为工程级全局变量
Public rsLocal As New ADODB.Recordset
Public coLocal As New ADODB.Command
Public fiLocal As ADODB.Field
'用于连接远程数据库
Public cnRemote As New ADODB.Connection ' 注释:声明ADO连接对象,为工程级全局变量
Public rsRemote As New ADODB.Recordset
Public coRemote As New ADODB.Command
Public fiRemote As ADODB.Field
Public ConnString As String
Public StrSQL As String
'连接状态
'注释:本地数据库连接函数
Public Function ConnectLocal(ConnString As String) As Boolean
On Error GoTo ErrHandle
'注释:通过下句与ODBC数据源进行连接,不需用户选择数据源
cnLocal.Open ConnString
ConnectLocal = True
Exit Function
ErrHandle:
ConnectLocal = False
End Function
'注释:远程数据库连接函数
Public Function ConnectRemote(ConnString As String) As Boolean
On Error GoTo ErrHandle
'注释:通过下句与ODBC数据源进行连接,不需用户选择数据源
cnRemote.Open ConnString
ConnectRemote = True
Exit Function
ErrHandle:
ConnectRemote = False
End Function
3.添加链路连接状态模块(connection_state.bas)
(略)
4.添加网络拨号模块(phone_dial.bas)
(略)
八、注意事项
1.在Sybase服务的“Dsedit”设置中,“网络地址属性”(“Network Address Attribute”)项“协议”(“Protocol”)远程Sybase服务应设置为NLWNSCK(Net-Library Driver)或TCP(Transfer Control Protocol)。
2.应用“域用户管理器”为远程登录用户设置所用用户名、密码时,为了限制远程登录用户的访问权限,在“组员身份”中应选择恰当的隶属域。
3.在IP地址和子网掩码的配置过程中,注意使通信的双方具有相同的子网号,否则将使数据库连接不上。
4.由于PSTN是一种电路交换的方式,所以一条通路自建立直至释放,即使它们之间并没有任何数据需要传送,其全部带宽仅能被通路两端的设备使用。因此,通信传输完成以后尽早挂断连接。
|