﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-大鸟的学习乐园-文章分类-VBA</title><link>http://www.blogjava.net/dunkbird/category/30986.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 21 Aug 2009 13:10:01 GMT</lastBuildDate><pubDate>Fri, 21 Aug 2009 13:10:01 GMT</pubDate><ttl>60</ttl><item><title>Winsock控件</title><link>http://www.blogjava.net/dunkbird/articles/292089.html</link><dc:creator>大鸟</dc:creator><author>大鸟</author><pubDate>Fri, 21 Aug 2009 05:57:00 GMT</pubDate><guid>http://www.blogjava.net/dunkbird/articles/292089.html</guid><wfw:comment>http://www.blogjava.net/dunkbird/comments/292089.html</wfw:comment><comments>http://www.blogjava.net/dunkbird/articles/292089.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dunkbird/comments/commentRss/292089.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dunkbird/services/trackbacks/292089.html</trackback:ping><description><![CDATA[<div class="tit">Winsock控件</div>
<div class="date">2008-11-03 15:24</div>
<table style="table-layout: fixed; width: 100%">
    <tbody>
        <tr>
            <td>
            <div class="cnt" id="blog_text"><font face="宋体" size="3">Winsock控件对用户是不可视的，可以很容易地访问TCP和UDP网络服务。其可以被Microsoft Access, Visual Basic ,Visual C++或Visual FoxPro开发人员使用。要编写客户和服务器应用程序，不需要了解TCP或调用底层Winsock API的具体细节。通过设置Winsock控件的属性和调用该控件的方法，可以很容易地连接到远程计算机并进行双向的数据交换。<br />
            属性<br />
            BytesReceived属性，LocalHostName属性，LocalIP属性，LocalPort属性，RemoteHost属性（ActiveX控件），SocketHandle属性，State属性（Winsock控件），Protocol属性（Winsock控件），Name属性，Parent属性，RemoteHost属性（ActiveX控件），RemotePort属性（ActiveX控件），Index属性（ActiveX控件），Tag属性（ActiveX控件），Object属性（ActiveX控件）。<br />
            方法<br />
            Accept方法，Bind方法，Close方法（Winsock控件），Listen方法，PeerData方法，SendData方法，GetData方法（WinSock控件），GetData方法（ActiveX控件）。<br />
            事件<br />
            Close事件，ConnectionRequest事件，DataArrival事件，SendComplete事件，SendProgress事件，Error事件，Connect事件（Winsock控件），Connect事件。<br />
            Winsock 控件对用户来说是不可见的，它提供了访问 TCP 和 UDP 网络服务的方便途径。Microsoft Access、Visual Basic、Visual C++ 或 Visual FoxPro 的开发人员都可使用它。为编写客户或服务器应用程序，不必了解 TCP 的细节或调用低级的 Winsock APIs。通过设置控件的属性并调用其方法就可轻易连接到一台远程机器上去，并且还可双向交换数据。<br />
            TCP 基础<br />
            数据传输协议允许创建和维护与远程计算机的连接。连接两台计算机就可彼此进行数据传输。<br />
            如果创建客户应用程序，就必须知道服务器计算机名或者 IP 地址（RemoteHost 属性），还要知道进行&#8220;侦听&#8221;的端口（RemotePort 属性），然后调用 Connect 方法。<br />
            如果创建服务器应用程序，就应设置一个收听端口（LocalPort 属性）并调用 Listen 方法。当客户计算机需要连接时就会发生 ConnectionRequest 事件。为了完成连接，可调用 ConnectionRequest 事件内的 Accept 方法。<br />
            建立连接后，任何一方计算机都可以收发数据。为了发送数据，可调用 SendData 方法。当接收数据时会发生 DataArrival 事件。调用 DataArrival 事件内的 GetData 方法就可获取数据。<br />
            UDP 基础<br />
            用户数据文报协议 (UDP) 是一个无连接协议。跟 TCP 的操作不同，计算机并不建立连接。另外 UDP 应用程序可以是客户机，也可以是服务器。<br />
            为了传输数据，首先要设置客户计算机的 LocalPort 属性。然后，服务器计算机只需将 RemoteHost 设置为客户计算机的 Internet 地址，并将 RemotePort 属性设置为跟客户计算机的 LocalPort 属性相同的端口，并调用 SendData 方法来着手发送信息。于是，客户计算机使用 DataArrival 事件内的 GetData 方法来获取已发送的信息。</font></div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/dunkbird/aggbug/292089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dunkbird/" target="_blank">大鸟</a> 2009-08-21 13:57 <a href="http://www.blogjava.net/dunkbird/articles/292089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VB Socket编程(WinSock控件编写网上聊天程序)</title><link>http://www.blogjava.net/dunkbird/articles/292088.html</link><dc:creator>大鸟</dc:creator><author>大鸟</author><pubDate>Fri, 21 Aug 2009 05:54:00 GMT</pubDate><guid>http://www.blogjava.net/dunkbird/articles/292088.html</guid><wfw:comment>http://www.blogjava.net/dunkbird/comments/292088.html</wfw:comment><comments>http://www.blogjava.net/dunkbird/articles/292088.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dunkbird/comments/commentRss/292088.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dunkbird/services/trackbacks/292088.html</trackback:ping><description><![CDATA[<font face="宋体" size="3">用VB5中WinSock控件编写网上聊天程序 <br />
<br />
<br />
<br />
Sockets是在Unix系统上提出来的，一开始主要是用于本地通讯，但很快就应用到C/S体系上。MicroSoft公司在此基础上创建了 WinSock控件，专门用于Windows接口，与Sockets完全兼容。Winsock控件对用户来说是不可见的，它提供了访问 TCP 和 UDP 网络服务的方便途径。Microsoft Access、Visual Basic、Visual C++ 或 Visual FoxPro 的开发人员都可使用它。为编写客户或服务器应用程序，不必了解 TCP 的细节或调用低级的 Winsock APIs。通过设置控件的属性并调用其方法就可轻易连接到一台远程机器上去，并且还可双向交换数据。下面就利用VB5中的WinSock控件编写一个网上 聊天程序。 <br />
<br />
<br />
一）网络通信协议的基础和选择 <br />
<br />
<br />
1．1 TCP（数据传输协议）基础 <br />
<br />
数据传输协议允许创建和维护与远程计算机的连接。连接两台计算机就可彼此进行数据传输。 <br />
如果创建客户应用程序，就必须知道服务器计算机名或者 IP 地址（RemoteHost 属性），还要知道进行&#8220;侦听&#8221;的端口（RemotePort 属性），然后调用 Connect 方法。 <br />
如果创建服务器应用程序，就应设置一个收听端口（LocalPort 属性）并调用 Listen 方法。当客户计算机需要连接时就会发生 ConnectionRequest 事件。为了完成连接，可调用 ConnectionRequest 事件内的 Accept 方法。 <br />
建立连接后，任何一方计算机都可以收发数据。为了发送数据，可调用 SendData 方法。当接收数据时会发生 DataArrival 事件。调用 DataArrival 事件内的 GetData 方法就可获取数据。 <br />
<br />
1．2 UDP（用户数据文报协议）基础 <br />
<br />
用户数据文报协议 (UDP) 是一个无连接协议。跟 TCP 的操作不同，计算机并不建立连接。另外 UDP 应用程序可以是客户机，也可以是服务器。 <br />
为了传输数据，首先要设置客户计算机的 LocalPort 属性。然后，服务器计算机只需将 RemoteHost 设置为客户计算机的 Internet 地址，并将 RemotePort 属性设置为跟客户计算机的 LocalPort 属性相同的端口，并调用 SendData 方法来着手发送信息。于是，客户计算机使用 DataArrival 事件内的 GetData 方法来获取已发送的信息。 <br />
<br />
1．3 选择通讯协议 <br />
<br />
在使用 WinSock 控件时，首先需要考虑使用什么协议。可以使用的协议包括 TCP 和 UDP。两种协议之间的重要区别在于它们的连接状态： <br />
TCP 协议是有连接的协议，可以将它同电话系统相比。在开始数据传输之前，用户必须先建立连接。 <br />
UDP 协议是一种无连接协议，两台计算机之间的传输类似于传递邮件：消息从一台计算机发送到另一台计算机，但是两者之间没有明确的连接。另外，单次传输的最大数据量取决于具体的网络。 <br />
<br />
到底选择哪一种协议通常是由需要创建的应用程序决定的。下面的几个问题将有助于选择适宜的协议： <br />
<br />
1. 在收发数据的时候，应用程序是否需要得到客户端或者服务器的确认信息？如果需要，使用 TCP 协议，在收发数据之前先建立明确的连接。 <br />
<br />
2. 数据量是否特别大（例如图象与声音文件）？在连接建立之后，TCP 协议将维护连接并确保数据的完整性。不过，这种连接需要更多的计算资源，因而是比较&#8220;昂贵&#8221;的。 <br />
<br />
3. 数据发送是间歇的，还是在一个会话内？例如，如果应用程序在某个任务完成的时候需要通知某个计算机，UDP 协议是更适宜的。UDP 协议适合发送少量的数据。 <br />
<br />
通讯协议的选择是通过设置WinSock的Protocol属性来实现的。下面选择TCP通讯协议编写网上聊天程序，在此之前必须知道一个极其重要的参数---服务器端的IP地址或计算机名。 <br />
<br />
二）确定计算机的名字 <br />
<br />
1. 在计算机的桌面上，右键单击&#8220;网上邻居&#8221;。 <br />
<br />
2. 选择&#8220;属性&#8221;。 <br />
<br />
3. 单击&#8220;标识&#8221;选项卡。 <br />
<br />
4. 在&#8220;计算机名称&#8221;框中可以找到计算机的名称。 <br />
<br />
确定计算机的 IP地址 <br />
<br />
1. 单击&#8220;任务条&#8221;上的&#8220;启动&#8221;。 <br />
<br />
2. 选择&#8220;运行&#8221;。 <br />
<br />
3. 若服务器端操作系统为win95则在&#8220;打开&#8221;中填入&#8220;winipcfg&#8221;，若服务器端操作系统为winnt则在&#8220;打开&#8221;中填入&#8220;ipconfig&#8221;。 <br />
<br />
4. 按下&#8220;确定&#8221;键。 <br />
<br />
上面找到的计算机名称或IP地址可以作为WinSock的RemoteHost 属性的值。 <br />
<br />
三） winsock控件的State属性。 <br />
<br />
<br />
<br />
<br />
state 属性的设置值是： 常 数 <br />
值 描 述 <br />
<br />
sckclosed 0 缺省的。关闭 <br />
sckopen 1 打开 <br />
scklistening 2 侦听 <br />
sckconnectionpending 3 连接挂起 <br />
sckresolvinghost 4 识别主机 <br />
sckhostresolved 5 已识别主机 <br />
sckconnecting 6 正在连接 <br />
sckconnected 7 已连接 <br />
sckclosing 8 同级人员正在关闭连接 <br />
sckerror 9 错误 <br />
<br />
<br />
下面主要要用到sckClosed.sckConnected两个State属性的值。 <br />
<br />
四）网上聊天程序的编制 <br />
<br />
4．1 程序中服务器端所起的作用。 <br />
<br />
从图示中可以看到服务器端的两个winsock控件之间并不存在直接的通讯，同时sckServer1和sckClient2及 sckServer2和sckClient1之间是不能直接通讯的。这也即是说若sckClient1向sckClient2发出信息，信息首先被 sckServer1接受，sckServer1再将信息传给程序的信息处理部分，信息处理部分再将处理好的信息传给sckServer2，再由 sckServer2传给sckClient2。反之亦然。那么服务器端的信息处理部分又进行什么工作呢？ <br />
<br />
1. 对通讯的通道数作一些限制。 <br />
<br />
2. 对使用后已关闭的通道，必须能够重新使用以节省资源。 <br />
<br />
3. 必须对所传递的数据包信息作甑别，从而作出不同的处理。 <br />
<br />
通过解开数据的包头就可区分不同的信息。 <br />
<br />
网上聊天有两种方式：第一种，以广播方式；第二种，以点对点的方式。广播方式即所有客户都能收到某一客户发出的信息。点对点的方式即想说&#8220;悄悄话 &#8221;的一对客户专门开辟了一间谈话的&#8220;小屋&#8221;，别的客户不能&#8220;听&#8221;到他们的谈话。在下面的程序中将看到如何利用数据的不同包头来区分用户是想以广播方式还是 以点对点的方式进行谈话的（点对点方式数据的包头为&#8220;PT&#8221;,广播方式则无包头）。 <br />
<br />
4．2 客户端的程序 <br />
<br />
1. 在客户端创建一个新的工程将其命名为&#8220;ClientPrj&#8221; <br />
<br />
2. 将缺省窗体命名为 frmClient。 <br />
<br />
3. 将窗体的标题改为&#8220;Client&#8221;。 <br />
<br />
4. 在窗体中添加一个 WinSock 控件，并将其命名为 tcpClient。 <br />
<br />
5. 在 frmClient 中添加一个ListBox 控件。将其命名为lstReceive。 <br />
<br />
6. 在 frmClient 中添加一个 TextBox 控件。将其命名为 txtSend。 <br />
<br />
7. 在窗体上放两个 CommandButton 控件，并将其命名为 cmdConnect和cmdSent。 <br />
<br />
8. 将cmdConnect控件的标题改为 Connect, 将cmdSent控件的标题改为 Sent。 <br />
<br />
9. 在窗体中添加如下的代码。 <br />
<br />
Private Sub cmdConnect_Click() <br />
<br />
On Error GoTo ErrorPro <br />
<br />
sckClient.Connect <br />
<br />
Exit Sub <br />
<br />
ErrorPro: <br />
<br />
MsgBox "服务器未开或网络出错！" <br />
<br />
End <br />
<br />
End Sub <br />
<br />
Private Sub cmdSent_Click() <br />
<br />
sckClient.SendData txtSent.Text <br />
<br />
End Sub <br />
<br />
Private Sub Form_Load() <br />
<br />
' RemoteComputerName为服务器端的计算机名或IP地址。 <br />
<br />
sckClient.RemoteHost = "RemoteComputerName" <br />
<br />
sckClient.RemotePort = 1000 <br />
<br />
End Sub <br />
<br />
<br />
<br />
Private Sub sckClient_Close() <br />
<br />
MsgBox "服务器通道已关闭！" <br />
<br />
End <br />
<br />
End Sub <br />
<br />
<br />
<br />
Private Sub sckClient_Connect() <br />
<br />
MsgBox "连接成功！" <br />
<br />
cmdConnect.Enabled = False <br />
<br />
End Sub <br />
<br />
<br />
<br />
Private Sub sckClient_DataArrival(ByVal bytesTotal As Long) <br />
<br />
Dim s As String <br />
<br />
sckClient.GetData s <br />
<br />
lstReceive.AddItem s <br />
<br />
End Sub <br />
<br />
<br />
<br />
Private Sub sckClient_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, _ ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean) <br />
<br />
sckClient.Close <br />
<br />
cmdConnect.Enabled = True <br />
<br />
End Sub <br />
<br />
4．3 服务器端的程序 <br />
<br />
1. 在服务器端创建一个新的工程将其命名为&#8220;ServerPrj&#8221;。 <br />
<br />
2. 将缺省窗体命名为&#8220;frmServer&#8221;。 <br />
<br />
3. 在窗体中添加一个ListBox控件，将其命名为&#8220;lstReceive&#8221;。 <br />
<br />
4. 在窗体中添加三个WinSock控件，将其分别命名为&#8220;sckListen&#8221;，sckBusy和&#8220;sckServer&#8221;并将&#8220;sckServer&#8221;的&#8220;Index&#8221;属性设置为0。 <br />
<br />
5. 在窗体中添加如下代码.。 <br />
<br />
'最大通道数 <br />
<br />
Private MaxChan As Integer <br />
<br />
<br />
<br />
Private Sub Form_Load() <br />
<br />
Dim i As Integer <br />
<br />
MaxChan = 10 <br />
<br />
For i = 1 To MaxChan - 1 <br />
<br />
Load sckServer(i) <br />
<br />
Next i <br />
<br />
sckListen.LocalPort = 1000 <br />
<br />
sckListen.Listen <br />
<br />
End Sub <br />
<br />
<br />
<br />
Private Sub sckBusy_Close() <br />
<br />
sckBusy.Close <br />
<br />
End Sub <br />
<br />
<br />
<br />
Private Sub sckBusy_DataArrival(ByVal bytesTotal As Long) <br />
<br />
sckBusy.SendData "服务器忙，请稍后再连接！" <br />
<br />
DoEvents <br />
<br />
End Sub <br />
<br />
<br />
<br />
Private Sub sckListen_ConnectionRequest(ByVal requestID As Long) <br />
<br />
Dim i As Integer <br />
<br />
'决定由哪一Winsock接受请求 <br />
<br />
For i = 0 To MaxChan - 1 <br />
<br />
If sckServer(i).State = 0 Then <br />
<br />
Exit For <br />
<br />
End If <br />
<br />
Next i <br />
<br />
If sckServer(i).State = 0 Then <br />
<br />
sckServer(i).Accept requestID <br />
<br />
Exit Sub <br />
<br />
End If <br />
<br />
'如果所有Winsock都用完则由专门的&#8220;忙&#8221;Winsock接受请求，以免用户要求得不到响应 <br />
<br />
sckBusy.Close <br />
<br />
sckBusy.Accept requestID <br />
<br />
End Sub <br />
<br />
<br />
<br />
Private Sub sckListen_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, _ ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean) <br />
<br />
sckListen.Close <br />
<br />
sckListen.LocalPort = 1000 <br />
<br />
sckListen.Listen <br />
<br />
End Sub <br />
<br />
<br />
<br />
Private Sub sckServer_Close(Index As Integer) <br />
<br />
sckServer(Index).Close <br />
<br />
End Sub <br />
<br />
<br />
<br />
Private Sub sckServer_DataArrival(Index As Integer, ByVal bytesTotal As Long) <br />
<br />
Dim s As String <br />
<br />
Dim i As Integer <br />
<br />
sckServer(Index).GetData s <br />
<br />
If UCase(Left(Trim(s), 2)) = "PT" Then '判断是否为悄悄话，点对点方式 <br />
<br />
If IsNumeric(Mid(Trim(s), 3, 1)) Then <br />
<br />
i = Mid(Trim(s), 3, 1) <br />
<br />
sckServer(i).SendData "Channel " &amp; Index &amp; " " &amp; Right(Trim(s), Len(Trim(s)) - 3) <br />
<br />
DoEvents <br />
<br />
End If <br />
<br />
Else '广播方式 <br />
<br />
For i = 0 To MaxChan - 1 <br />
<br />
'利用winsock的State属性给所有连接在服务器上的客户发消息 <br />
<br />
If sckServer(i).State = 7 Then <br />
<br />
sckServer(i).SendData "Channel " &amp; Index &amp; " " &amp; Trim(s) <br />
<br />
DoEvents <br />
<br />
End If <br />
<br />
Next i <br />
<br />
End If <br />
<br />
lstReceive.AddItem "Channel " &amp; Index &amp; " " &amp; Trim(s) <br />
<br />
End Sub <br />
<br />
<br />
<br />
Private Sub sckServer_Error(Index As Integer, ByVal Number As Integer, Description As String, _ <br />
<br />
ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As _ <br />
<br />
Long, CancelDisplay As Boolean) <br />
<br />
sckServer(Index).Close <br />
<br />
End Sub <br />
<br />
从程序中可以看到：第一，程序中限制了通道数（10路）。第二，通过判断WinSock控件的State属性是否为0（关闭状态），来重新使用已 关闭的WinSock控件。第三，通过给WinSock控件传递的信息加上包头，来对信息进行不同的处理（程序中若信息前加上了&#8220;PT"（Private Talk）+"通道数&#8221;的包头，由此就知道客户想要同拥有此&#8220;通道数&#8221;的另一客户进行&#8220;悄悄话&#8221;，否则就以广播方式将信息发给所有客户）。 <br />
<br />
<br />
五） 结束语 <br />
<br />
WinSock控件不仅仅是用来编制网上聊天程序，而且可以用来编制各种网络游戏或网络通信程序。实际上WinSock控件是编制各种C/S程序 的利器。在实际使用中通常是将WinSock控件封装在Activex DLL（进程内）、Activex EXE（进程外）部件的类中（类中引用）来使用的。通过区分所传信息前的不同的包头，用RaiseEvent命令引发不同 的事件，再对事件分别进行处理。这样不仅增加了程序的可调试性和安全性，而且更符合事件驱动编程方法的特点。</font>
<img src ="http://www.blogjava.net/dunkbird/aggbug/292088.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dunkbird/" target="_blank">大鸟</a> 2009-08-21 13:54 <a href="http://www.blogjava.net/dunkbird/articles/292088.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VB Socket编程(Winsock控件创建TCP/IP客户机/服务器程序)</title><link>http://www.blogjava.net/dunkbird/articles/292087.html</link><dc:creator>大鸟</dc:creator><author>大鸟</author><pubDate>Fri, 21 Aug 2009 05:53:00 GMT</pubDate><guid>http://www.blogjava.net/dunkbird/articles/292087.html</guid><wfw:comment>http://www.blogjava.net/dunkbird/comments/292087.html</wfw:comment><comments>http://www.blogjava.net/dunkbird/articles/292087.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dunkbird/comments/commentRss/292087.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dunkbird/services/trackbacks/292087.html</trackback:ping><description><![CDATA[<p><font face="宋体" size="3">Winsock控件建立在TCP、UDP协议的基础上，完成与远程计算机的通信。即使对TCP/IP不太熟悉的用户，使用该控件也可以在十几分钟内创建一 个简单的客户机/服务器程序。下面我们对Winsock控件的事件、方法、属性按其在程序中出现的顺序分别作详细的介绍，以便更好地理解程序源代码。 <br />
下面是Winsock控件的相关属性，方法和事件。(略去一些暂用不到的) <br />
*属性 <br />
------------------------------------------------------------------------- <br />
LocalHostName | 本地机器名 <br />
LocalIP | 本地机器IP地址 <br />
LocalPort | 本地机器通信程序的端口(0 &lt;端口 &lt;65536) <br />
RemoteHost | 远程机器名 <br />
RemotePort | 远程机器的通信程序端口 <br />
state | 连接的当前状态(文后有详细说明) <br />
Protocal | 使用TCP或UDP协议(这里我们选&#8216;0-sckTCPProtocal&#8217;) <br />
-------------------------------------------------------------------------- <br />
*方法 <br />
-------------------------------------------------------------------------- <br />
Listen <br />
Listen方法用于服务器程序，等待客户访问。 <br />
格式：Winsock对象.listen <br />
Connect <br />
Connect方法用于向远程主机发出连接请求 <br />
格式：Winsock对象.connect [远程主机IP,远程端口] <br />
Accept <br />
Accept方法用于接受一个连接请求 <br />
格式：Winsock对象.accept Request ID <br />
Senddata <br />
此方法用于发送数据 <br />
格式：Winsock对象.senddata 数据 <br />
Getdata <br />
用来取得接收到的数据 <br />
格式：Winsock对象.getdata 变量 [,数据类型 [,最大长度]] <br />
Close <br />
关闭当前连接 <br />
格式：Winsock对象.close <br />
*事件 <br />
---------------------------------------------------------------------------- <br />
Close | 远程机器关闭连接时触发 <br />
Connect | 连接建立好，可以进行通信时触发(客户端) <br />
ConnectRequest | 有请求连接到达时产生(服务器端) <br />
DataArrival | 有数据到达时触发 <br />
Error | 发生错误时发生 <br />
SendProgress | 数据传送进度 <br />
----------------------------------------------------------------------------- <br />
<br />
服务器程序的实现过程是： <br />
（1）服务器程序必须设置好LocalPort属性，作为侦听端口，该值为一个整数（只要是一个其它TCP/IP应用程序没有使用过的值即可）。 <br />
（2）使用Listen方法进入侦听状态，等待客户机程序的连接请求。 <br />
（3）客户机程序发出连接请求，使服务器程序产生ConnectionRequest事件，该事件得到一个参数requestID。 <br />
（4）服务器程序用Accept方法接受客户机程序的requestID请求。这样，服务器程序就可以用SendData方法发送数据了。Accept方法必须用上一步得到的requestID作为其参数。 <br />
（5）当服务器程序接收到数据时，产生DataArrival事件，参数BytesTotal包含接收到的数据字节数。在该事件中，可以用GetData方法接收数据。 <br />
（6）如果接受到Close事件，则用Close方法关闭TCP/IP连接。 <br />
客户机程序的实现过程是： <br />
（1） 客户程序设置Remotehost属性，以便指定运行服务器程序的主机 名，该字符串可在&#8220;控制面板|网络|标识|计算机名&#8221;中查到。 <br />
（2） 设置RemotePort属性,以便指定服务器程序的侦听端口。 <br />
（3）使用Connect方法，向服务器提出连接请求。 <br />
（4）服务器接受客户机程序的请求，客户机程序产生Connect事件，就可以用SendData方法发送数据了。 <br />
（5）当客户机程序接收到数据时，产生DataArrival事件，参数BytesTotal包含接收到的数据字节数。在该事件中，可以用GetData方法接收数据。 <br />
（6）如果接受到Close事件，则用Close方法关闭连接。 <br />
Winsock控件还有两个重要的属性，即Protocol和State。Protocol设定使用的协议是TCP还是UDP：取值 sckTCPProtocol表示TCP, 取值sckUDPProtocol则表示UDP。因为Winsock控件的缺省设置是sckTCPProtocol，所以程序中并没有使用 Protocol属性。State属性反映的是当前TCP/IP的连接状态，取值如表1所示。 <br />
表1 Winsock控件的State属性及其描述 <br />
常数 值 描述 <br />
SckClosed 0 缺省值，关闭 <br />
SckOpen 1 打开 <br />
SckListening 2 侦听 <br />
SckConnectionPending 3 连接挂起 <br />
SckResolvingHost 4 识别主机 <br />
SckHostResolved 5 已识别主机 <br />
SckConnecting 6 正在连接 <br />
SckConnected 7 已连接 <br />
SckClosing 8 同级人员正在关闭连接 <br />
SckError 9 错误 <br />
先在一台计算机上运行服务器程序，此时窗口上只有一个&#8220;退出&#8221;按钮。 再在另一台计算机上运行客户机程序，在&#8220;连接&#8221;按钮右边的文本框中输入服务器的主机名后单击&#8220;连接&#8221;按钮。如果连接成功，则服务器和客户机程序窗口都会出 现两个文本框。这时，两端都可以在上面的文本框中输入文字，这些文字会立即在下面的文本框中出现。 <br />
服务器程序使用的控件如下： <br />
（1）Command1：退出按钮； <br />
（2）textsend：发送数据文本框； <br />
（3）Winsockserver： 服务器Winsock； <br />
（4）textget ：接收数据文本框。 <br />
服务器程序的界面如图所示。 <br />
服务器程序的源代码如下： <br />
Private Sub Command1_Click() <br />
End <br />
End Sub <br />
Private Sub Form_Load() <br />
textsend.Visible = False <br />
textget.Visible = False <br />
Winsockserver.LocalPort = 1001 <br />
Winsockserver.Listen <br />
End Sub <br />
<br />
Private Sub textsend_Change() <br />
Winsockserver.SendData textsend.Text <br />
End Sub <br />
Private Sub Winsockserver_Close() <br />
Winsockserver.Close <br />
End <br />
End Sub <br />
<br />
Private Sub Winsockserver_ConnectionRequest(ByVal requestID As Long) <br />
textsend.Visible = True <br />
textget.Visible = True <br />
If Winsockserver.State &lt;&gt; sckClosed Then Winsockserver.Close <br />
Winsockserver.Accept requestID <br />
End Sub <br />
<br />
Private Sub Winsockserver_DataArrival(ByVal bytesTotal As Long) <br />
Dim tmpstr As String <br />
<br />
Winsockserver.GetData tmpstr <br />
textget.Text = tmpstr <br />
End Sub <br />
<br />
客户机程序使用的控件如下： <br />
（1）Command1：退出按钮； <br />
（2）Command2：连接按钮； <br />
（3）Winsockclient：客户Winsock； <br />
（4）Text1：主机名文本框； <br />
（5）Textsend：发送数据文本框； <br />
（6）Textget：接收数据文本框； 　　 <br />
客户机程序的源代码如下： <br />
Private Sub Command1_Click() <br />
End <br />
End Sub <br />
Private Sub Command2_Click() <br />
Winsockclient.Connect <br />
End Sub <br />
Private Sub Form_Load() <br />
textsend.Visible = False <br />
textget.Visible = False <br />
Winsockclient.RemotePort = 1001 <br />
Winsockclient.RemoteHost = "sccdsz" <br />
End Sub <br />
Private Sub Text1_Change() <br />
Winsockclient.RemoteHost = Text1.Text <br />
End Sub <br />
Private Sub textsend_Change() <br />
Winsockclient.SendData textsend.Text <br />
End Sub <br />
Private Sub Winsockclient_Close() <br />
Winsockclient.Close <br />
End <br />
End Sub <br />
Private Sub winsockclient_Connect() <br />
textsend.Visible = True <br />
textget.Visible = True <br />
Command2.Visible = False <br />
End Sub <br />
Private Sub winsockclient_DataArrival(ByVal bytesTotal As Long) <br />
Dim tmpstr As String <br />
Winsockclient.GetData tmpstr <br />
textget.Text = tmpstr <br />
End Sub <br />
<br />
我试过了，可以用</font></p>
<img src ="http://www.blogjava.net/dunkbird/aggbug/292087.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dunkbird/" target="_blank">大鸟</a> 2009-08-21 13:53 <a href="http://www.blogjava.net/dunkbird/articles/292087.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>excel 自定义菜单</title><link>http://www.blogjava.net/dunkbird/articles/291016.html</link><dc:creator>大鸟</dc:creator><author>大鸟</author><pubDate>Thu, 13 Aug 2009 07:25:00 GMT</pubDate><guid>http://www.blogjava.net/dunkbird/articles/291016.html</guid><wfw:comment>http://www.blogjava.net/dunkbird/comments/291016.html</wfw:comment><comments>http://www.blogjava.net/dunkbird/articles/291016.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dunkbird/comments/commentRss/291016.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dunkbird/services/trackbacks/291016.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>Private Sub Workbook_Open()</p>
<p>&nbsp;&nbsp;&nbsp; Dim cbr As CommandBar<br />
&nbsp;&nbsp;&nbsp; Dim ctrMenu As CommandBarControl<br />
&nbsp;&nbsp;&nbsp; Dim ctr As CommandBarControl<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Set cbr = Application.CommandBars("Worksheet Menu Bar")<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; For Each ctr In cbr.Controls<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If ctr.Caption = "custom" Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit Sub<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Next<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Set ctlMenu = cbr.Controls.Add(Type:=msoControlPopup)<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; With ctlMenu<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Caption = "custom"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; With .Controls.Add(Type:=msoControlButton)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Caption = "aa"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .OnAction = "action1"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End With<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; With .Controls.Add(Type:=msoControlButton)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Caption = "bb"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .OnAction = "action2"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End With<br />
&nbsp;&nbsp;&nbsp; End With<br />
&nbsp;&nbsp;&nbsp; <br />
End Sub<br />
</p>
<img src ="http://www.blogjava.net/dunkbird/aggbug/291016.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dunkbird/" target="_blank">大鸟</a> 2009-08-13 15:25 <a href="http://www.blogjava.net/dunkbird/articles/291016.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VB COM基础讲座之ActiveX EXEs</title><link>http://www.blogjava.net/dunkbird/articles/245232.html</link><dc:creator>大鸟</dc:creator><author>大鸟</author><pubDate>Tue, 09 Dec 2008 05:23:00 GMT</pubDate><guid>http://www.blogjava.net/dunkbird/articles/245232.html</guid><wfw:comment>http://www.blogjava.net/dunkbird/comments/245232.html</wfw:comment><comments>http://www.blogjava.net/dunkbird/articles/245232.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dunkbird/comments/commentRss/245232.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dunkbird/services/trackbacks/245232.html</trackback:ping><description><![CDATA[到现在为止，本教程一直讨论基于activex dlls中的类的内容，但是没有一本教程不说明与dll相似的activex exes。 <br />
<br />
　　 所以，想在这里实际编写一个activex exe工程。事实上，它和activex dll没有太大的区别，甚至没有区别。在启动visual basic后选择\"activex exe\"就可创建，然后像以前一样构造自己的类。 <br />
<br />
　　 但这里不想再作更详细的讨论，因为activex exe和activex dll除了在运行时有一些微小区别外，其他都相同。 <br />
<br />
　　 它们的区别首先表现在它们的\"进程空间\"的不同。所谓\"进程空间\"是用于运行、处理和存取的一块计算机内存。任何windows程序，如microsoft word等，都有自己的\"进程空间\"，它很像程序的桌面那样。 <br />
<br />
　　 当使用activex dlls工程运行时，dll是在使用它的程序的进程空间中运行的，而activex exe是在进程空间外面工作的。但是，activex exe还有自己的\"桌面\"。这究竟如何理解呢？ <br />
<br />
　　 假如，activex dll变得不稳定或意外受损时，使用它的应用程序常常出现蓝屏的死机现象，而在exes中却不会发生，因为它有自己的\"进程空间\"，即使被破坏，也仅仅是桌面受损，当然用户程序应该很好地去修复它。 <br />
<br />
　　 其次，它们的区别还表现在装载的速度上。由于dll是直接装载到已存在的进程空间，所以它的速度非常快。而exes由于还要分配自己的进程空间，所以速度上相对慢一点。 <br />
<br />
　　 上述两点区别可以说是它们真正的区别。 <br />
<br />
　　 总之，如果使用不同的windows工具来实现相应的activex组件，那么相应的工程类型就应该有所不同。例如，若使用mts，则应创建dll工程，若使用dcom，则应创建exe工程。当然，即使现在不理解这此缩写字母的含义，我们也不必担心。因为它们是针对高级用户的，并用于com远程的工具组件。以后有机会再来给出相应的教程。 <br />
<br />
　　 这里再来分析第二点的区别。 <br />
<br />
　　 如果现在需要创建这样的一个程序，它不断地检测一个数据库是否有什么改变。那么我们想到的是在程序中使用一些\"timer\"(计时器)，每隔10分钟激发一次并检测该数据库。但问题来了，在该进程空间的其他所有代码都要被停止运行直至数据库检测完毕。 <br />
<br />
　　 而activex exes伟大之处，就在于它有自己的进程空间。所以在其中添加的计时器也只会工作在自己的进程空间中而不会影响其他使用它的程序。也就是说，对于前面的工程来说，若使用activex exe来检测数据库，则不会停止其他使用它的程序的运行；即使需要从其他程序中返回一个消息，也可以通过其他事件而获得。 <br />
<br />
　　 需要说明的是，运行代码远离正规程序而通过事件与使用的应用程序会话的方法称为\"异步处理\"。通常当需要对e-mail或数据库作定期检查时，或当运行一个长的报表以及计算大的统计数据时，我们就需使用这种异步处理方式。 <br />
<br />
　　 不怕你惊讶的话，我们可以将前面论述的内容总结成这样的一句话： <br />
<br />
　　 \"activex dlls是在进程内运行，而activex exes是在进程外运行\"。 <br />
<br />
　　 好了，下一节将创建并测试一个自己的activex exe工程，并使用大家还不太熟悉的\"异步处理\"技巧。然后，提出一个称为\"实例\"的有意义的概念，最后指明怎样获得更多的com知识使自己达到一个新的水平。 
<img src ="http://www.blogjava.net/dunkbird/aggbug/245232.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dunkbird/" target="_blank">大鸟</a> 2008-12-09 13:23 <a href="http://www.blogjava.net/dunkbird/articles/245232.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VB读写文本文件</title><link>http://www.blogjava.net/dunkbird/articles/195794.html</link><dc:creator>大鸟</dc:creator><author>大鸟</author><pubDate>Fri, 25 Apr 2008 01:02:00 GMT</pubDate><guid>http://www.blogjava.net/dunkbird/articles/195794.html</guid><wfw:comment>http://www.blogjava.net/dunkbird/comments/195794.html</wfw:comment><comments>http://www.blogjava.net/dunkbird/articles/195794.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dunkbird/comments/commentRss/195794.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dunkbird/services/trackbacks/195794.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/dunkbird/articles/195794.html'>阅读全文</a><img src ="http://www.blogjava.net/dunkbird/aggbug/195794.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dunkbird/" target="_blank">大鸟</a> 2008-04-25 09:02 <a href="http://www.blogjava.net/dunkbird/articles/195794.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VBA  DB 操作总结篇（代码调试OK）</title><link>http://www.blogjava.net/dunkbird/articles/195359.html</link><dc:creator>大鸟</dc:creator><author>大鸟</author><pubDate>Thu, 24 Apr 2008 00:44:00 GMT</pubDate><guid>http://www.blogjava.net/dunkbird/articles/195359.html</guid><wfw:comment>http://www.blogjava.net/dunkbird/comments/195359.html</wfw:comment><comments>http://www.blogjava.net/dunkbird/articles/195359.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/dunkbird/comments/commentRss/195359.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dunkbird/services/trackbacks/195359.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/dunkbird/articles/195359.html'>阅读全文</a><img src ="http://www.blogjava.net/dunkbird/aggbug/195359.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dunkbird/" target="_blank">大鸟</a> 2008-04-24 08:44 <a href="http://www.blogjava.net/dunkbird/articles/195359.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQLServer和Access、Excel数据传输简单总结</title><link>http://www.blogjava.net/dunkbird/articles/195179.html</link><dc:creator>大鸟</dc:creator><author>大鸟</author><pubDate>Wed, 23 Apr 2008 09:31:00 GMT</pubDate><guid>http://www.blogjava.net/dunkbird/articles/195179.html</guid><wfw:comment>http://www.blogjava.net/dunkbird/comments/195179.html</wfw:comment><comments>http://www.blogjava.net/dunkbird/articles/195179.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dunkbird/comments/commentRss/195179.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dunkbird/services/trackbacks/195179.html</trackback:ping><description><![CDATA[<p>所谓的数据传输，其实是指SQLServer访问Access、Excel间的数据。</p>
<p>为什么要考虑到这个问题呢？</p>
<p>由于历史的原因，客户以前的数据很多都是在存入在文本数据库中，如Acess、Excel、Foxpro。现在系统升级及数据库服务器如SQLServer、ORACLE后，经常需要访问文本数据库中的数据，所以就会产生这样的需求。前段时间出差的项目，就是面临这样的一个问题：SQLServer和VFP之间的数据交换。</p>
<p>要完成标题的需要，在SQLServer中是一件非常简单的事情。</p>
<p>通常的可以有3种方式：1、DTS工具 2、BCP 3、分布式查询</p>
<p>DTS就不需要说了，因为那是图形化操作界面，很容易上手。</p>
<p>这里主要讲下后面两们，分别以查、增、删、改作为简单的例子：</p>
<p>下面废话就不说了，直接以T-SQL的形式表现出来。</p>
<p><br />
一、SQLServer和Access</p>
<p>1、查询Access中数据的方法：</p>
<p>select * from OpenRowSet('microsoft.jet.oledb.4.0',';database=c:\db2.mdb','select * from serv_user')</p>
<p>或</p>
<p>select * from OpenDataSource('Microsoft.Jet.OLEDB.4.0','Data Source="c:\DB2.mdb";User ID=Admin;Password=')...serv_user</p>
<p>2、从SQLServer向Access写数据：</p>
<p>insert into OpenRowSet('microsoft.jet.oledb.4.0',';database=c:\db2.mdb','select * from Accee表')<br />
select * from SQLServer表<br />
或用BCP</p>
<p>master..xp_cmdshell'bcp "serv-htjs.dbo.serv_user" out&nbsp; "c:\db3.mdb" -c -q -S"." -U"sa" -P"sa"'</p>
<p>上面的区别主要是：OpenRowSet需要mdb和表存在，BCP会在不存在的时候生成该mdb</p>
<p>3、从Access向SQLServer写数据：有了上面的基础，这个就很简单了</p>
<p>insert into SQLServer表 select * from <br />
OpenRowSet('microsoft.jet.oledb.4.0',';database=c:\db2.mdb','select * from Accee表')</p>
<p>或用BCP</p>
<p>master..xp_cmdshell'bcp "serv-htjs.dbo.serv_user" in&nbsp; "c:\db3.mdb" -c -q -S"." -U"sa" -P"sa"'</p>
<p>4、删除Access数据：</p>
<p>delete from OpenRowSet('microsoft.jet.oledb.4.0',';database=c:\db2.mdb','select * from serv_user')<br />
where lock=0</p>
<p>5、修改Access数据：</p>
<p>update OpenRowSet('microsoft.jet.oledb.4.0',';database=c:\db2.mdb','select * from serv_user')<br />
set lock=1</p>
<p>SQLServer和Access大致就这么多。</p>
<p><br />
二、SQLServer和Excel</p>
<p><br />
1、向Excel查询</p>
<p>select * from OpenRowSet('microsoft.jet.oledb.4.0','Excel 8.0;HDR=yes;database=c:\book1.xls;','select * from [Sheet1$]') where c like '%f%'</p>
<p>select * from <br />
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'<br />
,'Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\book1.xls',[sheet1$])</p>
<p>1)hdr=yes时可以把xls的第1行作为字段看待，如第1个中hdr=no的话，where时就会报错<br />
2)[]和美圆$必须要，否则M$可不认这个账</p>
<p>2、修改Execl</p>
<p>update OpenRowSet('microsoft.jet.oledb.4.0','Excel 8.0;hdr=yes;database=c:\book1.xls;','select * from [Sheet1$]')<br />
set a='erquan' where c like '%f%'</p>
<p>3、导入导出</p>
<p><br />
insert into OpenRowSet('microsoft.jet.oledb.4.0','Excel 8.0;hdr=yes;database=c:\book1.xls;','select * from [Sheet2$]')(id,name)<br />
select id,name from serv_user</p>
<p>或BCP</p>
<p>master..xp_cmdshell'bcp "serv-htjs.dbo.serv_user" out&nbsp; "c:\book2.xls" -c -q -S"." -U"sa" -P"sa"'</p>
<p>从Excel向SQLServer导入：</p>
<p>select * into serv_user_bak <br />
from OpenRowSet('microsoft.jet.oledb.4.0','Excel 8.0;HDR=yes;database=c:\book1.xls;','select * from [Sheet1$]')</p>
<p>如果表serv_user_bak不存在，则创建</p>
<p>有关BCP和分布式查询的详细解答，就查SQLServer自带的帮助吧。<br />
SQLServer和txt文件、HTML文件、VFP文件的数据交换都显得非常容易了。。。。</p>
<p>其实这些内容在帮助里都有，偶只不过是总结了一下，方便大家参考，呵呵~~</p>
<p>以上内容都经过测试~~<br />
</p>
<div style="visibility: hidden; overflow: hidden; width: 1px; color: white; height: 1px">转自：动态网制作指南 www.knowsky.com</div>
<img src ="http://www.blogjava.net/dunkbird/aggbug/195179.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dunkbird/" target="_blank">大鸟</a> 2008-04-23 17:31 <a href="http://www.blogjava.net/dunkbird/articles/195179.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>