急!!!请帮忙解决用WINSOCK从服务器的SQLSERVER数据库表中的记录传给客户端的ACCESS表中.
我的方法是:客户端的界面中输入的数据通过WINSOCK保存的服务器中的的SQLSERVER数据库中的表中,若保存成功,就读出表中的所有记录(很多条)传给客户端接收,并分条保存在ACCESS表中,传完后,读到界面的网格中.
我写的不行的程序(写出来,让高手更明白我想解决的问题)
原程序:
服务器:
'接受并处理数据
Private Sub SockToCln_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim StrArrival As String, StrGet() As String
Dim strBack As String
Dim RdrID As String
Dim bkNum As Long
Dim StatNum As Integer
Dim UsrID As String
Dim UsrPwd As String
'接受数据
Me.SockToCln(Index).GetData StrArrival, vbString
If Len(StrArrival) < 1 Then Exit Sub
'拆分接收到的数据
StrGet() = Split(StrArrival, ",", -1)
'判断类型
Select Case StrGet(0)
Case "gs" '窗体的客户
If StrGet(1) = 2 Then '保存公司用户集合
CheckUsergsSave StrGet(2), StrArrival, Index
Exit Sub
End If
End Select
'检验sock连接
If Me.SockToCln(Index).State <> sckConnected Then
Exit Sub
End If
'发送返回信息
Me.SockToCln(Index).SendData strBack
End SubPrivate Function CheckUsergsSave(ByVal Flag As Integer, ByVal smE As String, indexM As Integer) As String
Dim rsCheck As New ADODB.Recordset
Dim DBstr As String, i As Integer, Z As Double, M As Double
Dim bEnter As Boolean
Dim FindItm As ListItem, LtItm As ListItem
Dim SqlStr As String, Smlllq As String
Dim StrGet() As String
On Error GoTo Errork
'1.读出数据库中的记录
'4.返回响应信息
'拆分接收到的数据
StrGet() = Split(smE, ",", -1)
'连接数据库
SqlStr = LinkSql(0, IDNAmeS, PwdNameS, "(local)", "infoN")
LinKServerLogin SqlStr, 1
Select Case Flag
Case 0 '保存
DBstr = "select * from gs_info where gs_n='" & StrGet(2) & "' and gs_name='" & StrGet(4) & "' "
'打开数据集
rsCheck.Open DBstr, DBCnn, adOpenStatic, adLockOptimistic, -1
'查找到的记录数为0
With rsCheck
If (rsCheck.EOF And rsCheck.BOF) Then '找不到该管理员名
DBCnn.BeginTrans
.AddNew
For i = 3 To UBound(StrGet)
If Trim(StrGet(i)) <> "" Then
.Fields(i - 3) = StrGet(i)
Else
If .Fields(i - 3).Type = adTinyInt Then
.Fields(i - 3) = 0
Else
.Fields(i - 3) = " "
End If
End If
Next
.Update
DBCnn.CommitTrans
Else
DBCnn.BeginTrans
For i = 2 To UBound(StrGet)
.Fields(i) = StrGet(i + 2)
Next
.Update
DBCnn.CommitTrans
End If
End With
'关闭数据集
rsCheck.Close
'----------------------------------
'//读出记录数总数
DBstr = "select * from gs_info order by gs_n"
rsCheck.Open DBstr, DBCnn, adOpenStatic, adLockReadOnly, -1
With rsCheck
If Not (rsCheck.EOF And rsCheck.BOF) Then
DBCnn.BeginTrans
.MoveLast
ZCount = .RecordCount
DBCnn.CommitTrans
Else
Z = 0
End If
End With
rsCheck.Close
'----------------------------------
'读出记录
ReDim CheckData(ZCount)
DBstr = "select * from gs_info "
rsCheck.Open DBstr, DBCnn, adOpenStatic, adLockReadOnly, -1
DBCnn.BeginTrans
With rsCheck
If Not (rsCheck.EOF And rsCheck.BOF) Then
.MoveFirst
M = 0
Do While Not .EOF
'返回响应信息
CheckUsergsSave = "gs,gs,"
CheckUsergsSave = CheckUsergsSave + "2,1," + Str(ZCount)
CheckUsergsSave = CheckUsergsSave + "," + Str(M)
For i = 0 To .Fields.Count - 1
If IsNull(.Fields(i).Value) = True Or Trim(.Fields(i).Value) = "" Then
CheckUsergsSave = CheckUsergsSave + ", "
Else
CheckUsergsSave = CheckUsergsSave + "," + Trim(.Fields(i).Value)
End If
Next
'检验sock连接
If Me.SockToCln(indexM).State <> sckConnected Then Exit Function
'发送返回信息
Me.SockToCln(indexM).SendData CheckUsergsSave
deepN (300) '延时程序
.MoveNext
M = M + 1
Loop
Else
CheckUsergsSave = CheckUsergsSave + "2,1," + Str(Z)
'检验sock连接
If Me.SockToCln(indexM).State <> sckConnected Then
Exit Function
End If
'发送返回信息
Me.SockToCln(indexM).SendData CheckUsergsSave
End If
End With
DBCnn.CommitTrans
'关闭数据集
rsCheck.Close
LinKServerLogin SqlStr, 0 '关闭数据库
End Select
Exit Function
Errork:
MsgBox Err.Description
End Function
'客户
'接收
Private Sub SockToSvr_DataArrival(ByVal bytesTotal As Long)
Dim StrArrival As String, StrGet() As String
Dim Start As Integer
Dim I As Integer, j As Integer, k As Integer
Dim LtItm As ListItem
Set mText = New TimerState
'接收数据,String类型
Me.SockToSvr.GETdata StrArrival, vbString
If Len(StrArrival) < 1 Then Exit Sub
'拆分接收到的数据
StrGet() = Split(StrArrival, ",", -1)
'得到帧头,按不同类型做响应的处理
Select Case StrGet(0)
Case "gs" '读出公司名
Select Case StrGet(2)
Case 2
If StrGet(3) = 1 Then '保存成功
'写数据库的表
If Trim(StrGet(5)) = m Then '第一次接收,清空表
'//删除表中记录
DeleteM App.Path & "\" & PathGsMDB, "gs"
End If
If m = Val(StrGet(5)) Then '分条保存记录表中
SaveTabeL App.Path & "\" & PathGsMDB, "gs", StrArrival
m = m + 1
Me.SockToSvr.SendData StrGet(0) & ",4," & StrGet(5) '发送
End If
If m = Val(StrGet(4)) Then
'-----
Call mText.TimerTask(StrGet(1) + "," + StrGet(2) + "," + StrGet(3), StrArrival) '产生事件将数据显示到网格中
End If
End If
End Select
End Sub
我的方法是:客户端的界面中输入的数据通过WINSOCK保存的服务器中的的SQLSERVER数据库中的表中,若保存成功,就读出表中的所有记录(很多条)传给客户端接收,并分条保存在ACCESS表中,传完后,读到界面的网格中.
我写的不行的程序(写出来,让高手更明白我想解决的问题)
原程序:
服务器:
'接受并处理数据
Private Sub SockToCln_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim StrArrival As String, StrGet() As String
Dim strBack As String
Dim RdrID As String
Dim bkNum As Long
Dim StatNum As Integer
Dim UsrID As String
Dim UsrPwd As String
'接受数据
Me.SockToCln(Index).GetData StrArrival, vbString
If Len(StrArrival) < 1 Then Exit Sub
'拆分接收到的数据
StrGet() = Split(StrArrival, ",", -1)
'判断类型
Select Case StrGet(0)
Case "gs" '窗体的客户
If StrGet(1) = 2 Then '保存公司用户集合
CheckUsergsSave StrGet(2), StrArrival, Index
Exit Sub
End If
End Select
'检验sock连接
If Me.SockToCln(Index).State <> sckConnected Then
Exit Sub
End If
'发送返回信息
Me.SockToCln(Index).SendData strBack
End SubPrivate Function CheckUsergsSave(ByVal Flag As Integer, ByVal smE As String, indexM As Integer) As String
Dim rsCheck As New ADODB.Recordset
Dim DBstr As String, i As Integer, Z As Double, M As Double
Dim bEnter As Boolean
Dim FindItm As ListItem, LtItm As ListItem
Dim SqlStr As String, Smlllq As String
Dim StrGet() As String
On Error GoTo Errork
'1.读出数据库中的记录
'4.返回响应信息
'拆分接收到的数据
StrGet() = Split(smE, ",", -1)
'连接数据库
SqlStr = LinkSql(0, IDNAmeS, PwdNameS, "(local)", "infoN")
LinKServerLogin SqlStr, 1
Select Case Flag
Case 0 '保存
DBstr = "select * from gs_info where gs_n='" & StrGet(2) & "' and gs_name='" & StrGet(4) & "' "
'打开数据集
rsCheck.Open DBstr, DBCnn, adOpenStatic, adLockOptimistic, -1
'查找到的记录数为0
With rsCheck
If (rsCheck.EOF And rsCheck.BOF) Then '找不到该管理员名
DBCnn.BeginTrans
.AddNew
For i = 3 To UBound(StrGet)
If Trim(StrGet(i)) <> "" Then
.Fields(i - 3) = StrGet(i)
Else
If .Fields(i - 3).Type = adTinyInt Then
.Fields(i - 3) = 0
Else
.Fields(i - 3) = " "
End If
End If
Next
.Update
DBCnn.CommitTrans
Else
DBCnn.BeginTrans
For i = 2 To UBound(StrGet)
.Fields(i) = StrGet(i + 2)
Next
.Update
DBCnn.CommitTrans
End If
End With
'关闭数据集
rsCheck.Close
'----------------------------------
'//读出记录数总数
DBstr = "select * from gs_info order by gs_n"
rsCheck.Open DBstr, DBCnn, adOpenStatic, adLockReadOnly, -1
With rsCheck
If Not (rsCheck.EOF And rsCheck.BOF) Then
DBCnn.BeginTrans
.MoveLast
ZCount = .RecordCount
DBCnn.CommitTrans
Else
Z = 0
End If
End With
rsCheck.Close
'----------------------------------
'读出记录
ReDim CheckData(ZCount)
DBstr = "select * from gs_info "
rsCheck.Open DBstr, DBCnn, adOpenStatic, adLockReadOnly, -1
DBCnn.BeginTrans
With rsCheck
If Not (rsCheck.EOF And rsCheck.BOF) Then
.MoveFirst
M = 0
Do While Not .EOF
'返回响应信息
CheckUsergsSave = "gs,gs,"
CheckUsergsSave = CheckUsergsSave + "2,1," + Str(ZCount)
CheckUsergsSave = CheckUsergsSave + "," + Str(M)
For i = 0 To .Fields.Count - 1
If IsNull(.Fields(i).Value) = True Or Trim(.Fields(i).Value) = "" Then
CheckUsergsSave = CheckUsergsSave + ", "
Else
CheckUsergsSave = CheckUsergsSave + "," + Trim(.Fields(i).Value)
End If
Next
'检验sock连接
If Me.SockToCln(indexM).State <> sckConnected Then Exit Function
'发送返回信息
Me.SockToCln(indexM).SendData CheckUsergsSave
deepN (300) '延时程序
.MoveNext
M = M + 1
Loop
Else
CheckUsergsSave = CheckUsergsSave + "2,1," + Str(Z)
'检验sock连接
If Me.SockToCln(indexM).State <> sckConnected Then
Exit Function
End If
'发送返回信息
Me.SockToCln(indexM).SendData CheckUsergsSave
End If
End With
DBCnn.CommitTrans
'关闭数据集
rsCheck.Close
LinKServerLogin SqlStr, 0 '关闭数据库
End Select
Exit Function
Errork:
MsgBox Err.Description
End Function
'客户
'接收
Private Sub SockToSvr_DataArrival(ByVal bytesTotal As Long)
Dim StrArrival As String, StrGet() As String
Dim Start As Integer
Dim I As Integer, j As Integer, k As Integer
Dim LtItm As ListItem
Set mText = New TimerState
'接收数据,String类型
Me.SockToSvr.GETdata StrArrival, vbString
If Len(StrArrival) < 1 Then Exit Sub
'拆分接收到的数据
StrGet() = Split(StrArrival, ",", -1)
'得到帧头,按不同类型做响应的处理
Select Case StrGet(0)
Case "gs" '读出公司名
Select Case StrGet(2)
Case 2
If StrGet(3) = 1 Then '保存成功
'写数据库的表
If Trim(StrGet(5)) = m Then '第一次接收,清空表
'//删除表中记录
DeleteM App.Path & "\" & PathGsMDB, "gs"
End If
If m = Val(StrGet(5)) Then '分条保存记录表中
SaveTabeL App.Path & "\" & PathGsMDB, "gs", StrArrival
m = m + 1
Me.SockToSvr.SendData StrGet(0) & ",4," & StrGet(5) '发送
End If
If m = Val(StrGet(4)) Then
'-----
Call mText.TimerTask(StrGet(1) + "," + StrGet(2) + "," + StrGet(3), StrArrival) '产生事件将数据显示到网格中
End If
End If
End Select
End Sub
解决方案 »
- 如何将字符串型"2008-10-02 0000"(即2008年10月2日00:00分)改成日期型
- 怎样知道数据库查询后datagrid有多少行啊?
- 两情相愿,物色到的女友要跟我这只破船,追她的可比我都有钱,比我英俊,比我更优秀!~~~V
- access表,如何用VB将分类数据追加到另一个表中?
- 怎样把vsflexgrid网格的数据打印在vacticvereport2.0 上,最好是有具体代码。跪求!!!!!!!!!!!!!!!!
- WebBrowser怎样访问本地html?敬请各位高手指点,谢谢。
- 这个程序怎么写?(50分!!!)
- 为什么网页引用控件,结果控件中的wmi部件中的SWbemLocator 访问遭到拒绝
- 如何让ComboBox 控件里的内容显示完毕
- 求教acptvb,怎样能使我写的VB 函数可以接受函数地址作为参数?
- 求个VB邮箱发信代码?
- 求毕业设计:word练习系统
两个数据库中间为什么要加个winsock????
SQL本来就支持网络访问,何必要多加个控件呢?
1: 你现在运行到哪里有问题,是收不到还是写不进数据库还是回传有问题??
答:写收到的数据串不是一条,而是写了好几条记录连在一起,我要传一条,接收一条并保存一条.
2. 两个数据库中间为什么要加个winsock????
SQL本来就支持网络访问,何必要多加个控件呢?
原因是:我这个网络中的第一层结构,我要用三层结构(并且数据还要进行后台运算后分层上传,后再传给客户机),并且以后可能要连上INTER,这个问题总要会的有.
3.Winsock完全可以远程访问SQLServer.LZ找些例子看看吧。
例子我就是没找到,找到的只是发文件
4.我有例子,留下Email.
谢谢你,我的Email:[email protected],请将例子发给我
用winsock那可真够你写的,呵呵
我的例子难度等级Advance Level.研究透它,你就能搞顶Winsock & remote Databace的应用。
Good Luck!