'Option Explicit ‘WINSOCK 客戶端代碼
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Byte, Source As Byte, ByVal Length As Long)
Dim strSQL As String
Private Sub Command1_Click()
If sockClient.State <> sckClosed Then sockClient.Close
If txtServerName.Text <> vbNullString Then
sockClient.RemoteHost = txtServerName.Text '設定遠程計算機名稱
Else
MsgBox "必須輸入服務器名稱或IP地址", vbInformation, "提示"
Exit Sub
End If
If txtServerPort.Text <> vbNullString Then
sockClient.RemotePort = txtServerPort.Text '設定遠程埠名稱
Else
MsgBox "必須輸入遠程埠", vbInformation, "提示"
Exit Sub
End If
sockClient.Protocol = sckTCPProtocol '設定 Winsock 控制元件所使用的協議是TCP。
sockClient.Connect '要求連接到遠程計算機
Me.Label3.Caption = "已連接"
End Sub
Private Sub Command2_Click()
strSQL = Me.Text1.Text
If sockClient.State = sckConnected Then
sockClient.SendData strSQL
DoEvents
End If
End Sub
Private Sub Form_Load()
Me.Label3.Caption = "未連接"
txtServerName.Text = "112.74.36.215"
Text1.Text = "QFII815,select TOP 500 * from BillIndex" 'QFII815是資料庫名字
End Sub
Private Sub sockClient_DataArrival(ByVal bytesTotal As Long)
Dim tmpData() As Byte
Dim Finis As String, FinisData(3) As Byte '存取結尾標志
Static rsLength As Long
Static iCount As Integer
Static rsData() As Byte '記錄集陣列
Dim arrData() As Byte
Dim objRec As Recordset
sockClient.GetData tmpData, vbArray + vbByte
'把接收的資料保存在rsData中
If iCount = 0 Then '第一次接收
rsData = tmpData
iCount = 1
Else
ReDim Preserve rsData(rsLength + bytesTotal)
CopyMemory rsData(rsLength + 1), tmpData(0), bytesTotal
End If
rsLength = UBound(rsData) 'rsData的長度
CopyMemory FinisData(0), rsData(rsLength - 3), 4
Finis = FinisData
If Finis = "`!" Then '假如是結尾,截斷結尾標志資料
ReDim Preserve tmpData(rsLength - 4)
Set objRec = BinToRs(rsData) '還原記錄集
Set MSHFlexGrid1.DataSource = objRec ' 顯示資料 '客戶端表顯示倒是成功了
Erase rsData
iCount = 0
rsLength = 0
End If
End Sub
Public Function BinToRs(vData As Variant) As Recordset '將服務器回傳的二進制轉換為記錄集
Dim objStream As Stream
Dim objRs As Recordset
Set objRs = New Recordset
Set objStream = New Stream
objStream.Open
objStream.Type = adTypeBinary
objStream.Write vData
objStream.Position = 0
objRs.Open objStream
Set BinToRs = objRs
Set objRs = Nothing
Set objStream = Nothing
End Function
如題:就是如何像本機直連一樣,獲取記錄資料,如 rs1.Open strsql01, cnn1, adOpenKeyset,執行后,If rs1.RecordCount > 0 Then 這樣子判斷?
2、目測你是想向服務端發送sql陳述句,然后服務端回傳資料集,客戶端接收以后處理。強烈不建議你這麼做,一旦你的這個通訊被別人識破,那么他就可以發送任意SQL陳述句。建議的方法是服務端開放若干個單一功能的服務介面,比如你例子里面取TOP 500 BillIndex 就封裝成一個介面,暴露給客戶端比如就是取 top n BillIndex 。客戶端只要呼叫這個介面,并告知n值。至于獲取的邏輯由服務端處理,訪問什么資料庫訪問哪張表過濾條件業務邏輯全部封裝在服務端,對于客戶端來說只是一個黑盒子。