??xml version="1.0" encoding="utf-8" standalone="yes"?>
AcceptҎQBindҎQCloseҎQWinsock控gQ,ListenҎQPeerDataҎQSendDataҎQGetDataҎQWinSock控gQ,GetDataҎQActiveX控gQ?br />
事g
Close事gQConnectionRequest事gQDataArrival事gQSendComplete事gQSendProgress事gQError事gQConnect事gQWinsock控gQ,Connect事g?br />
Winsock 控g对用h说是不可见的Q它提供了访?TCP ?UDP |络服务的方侉K径。Microsoft Access、Visual Basic、Visual C++ ?Visual FoxPro 的开发h员都可用它。ؓ~写客户或服务器应用E序Q不必了?TCP 的细节或调用低?Winsock APIs。通过讄控g的属性ƈ调用其方法就可轻易连接到一台远E机器上去,q且q可双向交换数据?br />
TCP 基础
数据传输协议允许创徏和维护与q程计算机的q接。连接两台计机可彼此q行数据传输?br />
如果创徏客户应用E序Q就必须知道服务器计机名或?IP 地址QRemoteHost 属性)Q还要知道进?#8220;侦听”的端口(RemotePort 属性)Q然后调?Connect Ҏ?br />
如果创徏服务器应用程序,应讄一个收听端口(LocalPort 属性)q调?Listen Ҏ。当客户计算机需要连接时׃发生 ConnectionRequest 事g。ؓ了完成连接,可调?ConnectionRequest 事g内的 Accept Ҏ?br />
建立q接后,M一方计机都可以收发数据。ؓ了发送数据,可调?SendData Ҏ。当接收数据时会发生 DataArrival 事g。调?DataArrival 事g内的 GetData Ҏ可获取数据?br />
UDP 基础
用户数据文报协议 (UDP) 是一个无q接协议。跟 TCP 的操作不同,计算机ƈ不徏立连接。另?UDP 应用E序可以是客hQ也可以是服务器?br />
Z传输数据Q首先要讄客户计算机的 LocalPort 属性。然后,服务器计机只需?RemoteHost 讄为客戯机?Internet 地址Qƈ?RemotePort 属性设|ؓ跟客戯机?LocalPort 属性相同的端口Qƈ调用 SendData Ҏ来着手发送信息。于是,客户计算Z?DataArrival 事g内的 GetData Ҏ来获取已发送的信息?/font>
]]>
Sockets是在Unixpȝ上提出来的,一开始主要是用于本地通讯Q但很快应用到C/S体系上。MicroSoft公司在此基础上创Z WinSock控gQ专门用于Windows接口Q与Sockets完全兼容。Winsock控g对用h说是不可见的Q它提供了访?TCP ?UDP |络服务的方侉K径。Microsoft Access、Visual Basic、Visual C++ ?Visual FoxPro 的开发h员都可用它。ؓ~写客户或服务器应用E序Q不必了?TCP 的细节或调用低?Winsock APIs。通过讄控g的属性ƈ调用其方法就可轻易连接到一台远E机器上去,q且q可双向交换数据。下面就利用VB5中的WinSock控g~写一个网?聊天E序?
一Q网l通信协议的基和选择
1Q? TCPQ数据传输协议)基础
数据传输协议允许创徏和维护与q程计算机的q接。连接两台计机可彼此q行数据传输?
如果创徏客户应用E序Q就必须知道服务器计机名或?IP 地址QRemoteHost 属性)Q还要知道进?#8220;侦听”的端口(RemotePort 属性)Q然后调?Connect Ҏ?
如果创徏服务器应用程序,应讄一个收听端口(LocalPort 属性)q调?Listen Ҏ。当客户计算机需要连接时׃发生 ConnectionRequest 事g。ؓ了完成连接,可调?ConnectionRequest 事g内的 Accept Ҏ?
建立q接后,M一方计机都可以收发数据。ؓ了发送数据,可调?SendData Ҏ。当接收数据时会发生 DataArrival 事g。调?DataArrival 事g内的 GetData Ҏ可获取数据?
1Q? UDPQ用h据文报协议)基础
用户数据文报协议 (UDP) 是一个无q接协议。跟 TCP 的操作不同,计算机ƈ不徏立连接。另?UDP 应用E序可以是客hQ也可以是服务器?
Z传输数据Q首先要讄客户计算机的 LocalPort 属性。然后,服务器计机只需?RemoteHost 讄为客戯机?Internet 地址Qƈ?RemotePort 属性设|ؓ跟客戯机?LocalPort 属性相同的端口Qƈ调用 SendData Ҏ来着手发送信息。于是,客户计算Z?DataArrival 事g内的 GetData Ҏ来获取已发送的信息?
1Q? 选择通讯协议
在?WinSock 控gӞ首先需要考虑使用什么协议。可以用的协议包括 TCP ?UDP。两U协议之间的重要区别在于它们的连接状态:
TCP 协议是有q接的协议,可以它同电话系l相比。在开始数据传输之前,用户必须先徏立连接?
UDP 协议是一U无q接协议Q两台计机之间的传输类g传递邮Ӟ消息从一台计机发送到另一台计机Q但是两者之间没有明的q接。另外,单次传输的最大数据量取决于具体的|络?
到底选择哪一U协议通常是由需要创建的应用E序军_的。下面的几个问题有助于选择适宜的协议:
1. 在收发数据的时候,应用E序是否需要得到客L或者服务器的确认信息?如果需要,使用 TCP 协议Q在收发数据之前先徏立明的q接?
2. 数据量是否特别大Q例如图象与声音文gQ?在连接徏立之后,TCP 协议维护连接ƈ保数据的完整性。不q,q种q接需要更多的计算资源Q因而是比较“昂贵”的?
3. 数据发送是间歇的,q是在一个会话内Q例如,如果应用E序在某个Q务完成的时候需要通知某个计算机,UDP 协议是更适宜的。UDP 协议适合发送少量的数据?
通讯协议的选择是通过讄WinSock的Protocol属性来实现的。下面选择TCP通讯协议~写|上聊天E序Q在此之前必ȝ道一个极光要的参数---服务器端的IP地址或计机名?
二)定计算机的名字
1. 在计机的桌面上Q右键单?#8220;|上d”?
2. 选择“属?#8221;?
3. 单击“标识”选项卡?
4. ?#8220;计算机名U?#8221;框中可以扑ֈ计算机的名称?
定计算机的 IP地址
1. 单击“d?#8221;上的“启动”?
2. 选择“q行”?
3. 若服务器端操作系lؓwin95则在“打开”中填?#8220;winipcfg”Q若服务器端操作pȝ为winnt则在“打开”中填?#8220;ipconfig”?
4. 按下“定”键?
上面扑ֈ的计机名称或IP地址可以作ؓWinSock的RemoteHost 属性的倹{?
三) winsock控g的State属性?
state 属性的讄值是Q???
??q?
sckclosed 0 ~省的。关?
sckopen 1 打开
scklistening 2 侦听
sckconnectionpending 3 q接挂v
sckresolvinghost 4 识别L
sckhostresolved 5 已识别主?
sckconnecting 6 正在q接
sckconnected 7 已连?
sckclosing 8 同人员正在关闭q接
sckerror 9 错误
下面主要要用到sckClosed.sckConnected两个State属性的倹{?
四)|上聊天E序的编?
4Q? E序中服务器端所L作用?
从图CZ可以看到服务器端的两个winsock控g之间q不存在直接的通讯Q同时sckServer1和sckClient2?sckServer2和sckClient1之间是不能直接通讯的。这也即是说若sckClient1向sckClient2发出信息Q信息首先被 sckServer1接受QsckServer1再将信息传给E序的信息处理部分,信息处理部分再将处理好的信息传给sckServer2Q再?sckServer2传给sckClient2。反之亦然。那么服务器端的信息处理部分又进行什么工作呢Q?
1. 寚w讯的通道C一些限制?
2. 对用后已关闭的通道Q必能够重C用以节省资源?
3. 必须Ҏ传递的数据包信息作甑别Q从而作Z同的处理?
通过解开数据的包头就可区分不同的信息?
|上聊天有两U方式:W一U,以广播方式;W二U,以点对点的方式。广播方式即所有客户都能收到某一客户发出的信息。点对点的方式即惌“悄悄?”的一对客户专门开辟了一间谈话的“屋”Q别的客户不?#8220;?#8221;C们的谈话。在下面的程序中看到如何利用数据的不同包头来区分用h想以q播方式q是 以点对点的方式进行谈话的Q点对点方式数据的包头ؓ“PT”,q播方式则无包头Q?
4Q? 客户端的E序
1. 在客L创徏一个新的工E将其命名ؓ“ClientPrj”
2. 缺省窗体命名ؓ frmClient?
3. 窗体的标题改ؓ“Client”?
4. 在窗体中d一?WinSock 控gQƈ其命名?tcpClient?
5. ?frmClient 中添加一个ListBox 控g。将其命名ؓlstReceive?
6. ?frmClient 中添加一?TextBox 控g。将其命名ؓ txtSend?
7. 在窗体上放两?CommandButton 控gQƈ其命名?cmdConnect和cmdSent?
8. cmdConnect控g的标题改?Connect, cmdSent控g的标题改?Sent?
9. 在窗体中d如下的代码?
Private Sub cmdConnect_Click()
On Error GoTo ErrorPro
sckClient.Connect
Exit Sub
ErrorPro:
MsgBox "服务器未开或网l出错!"
End
End Sub
Private Sub cmdSent_Click()
sckClient.SendData txtSent.Text
End Sub
Private Sub Form_Load()
' RemoteComputerName为服务器端的计算机名或IP地址?
sckClient.RemoteHost = "RemoteComputerName"
sckClient.RemotePort = 1000
End Sub
Private Sub sckClient_Close()
MsgBox "服务器通道已关闭!"
End
End Sub
Private Sub sckClient_Connect()
MsgBox "q接成功Q?
cmdConnect.Enabled = False
End Sub
Private Sub sckClient_DataArrival(ByVal bytesTotal As Long)
Dim s As String
sckClient.GetData s
lstReceive.AddItem s
End Sub
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)
sckClient.Close
cmdConnect.Enabled = True
End Sub
4Q? 服务器端的程?
1. 在服务器端创Z个新的工E将其命名ؓ“ServerPrj”?
2. 缺省窗体命名ؓ“frmServer”?
3. 在窗体中d一个ListBox控gQ将其命名ؓ“lstReceive”?
4. 在窗体中d三个WinSock控gQ将其分别命名ؓ“sckListen”QsckBusy?#8220;sckServer”q将“sckServer”?#8220;Index”属性设|ؓ0?
5. 在窗体中d如下代码.?
'最大通道?
Private MaxChan As Integer
Private Sub Form_Load()
Dim i As Integer
MaxChan = 10
For i = 1 To MaxChan - 1
Load sckServer(i)
Next i
sckListen.LocalPort = 1000
sckListen.Listen
End Sub
Private Sub sckBusy_Close()
sckBusy.Close
End Sub
Private Sub sckBusy_DataArrival(ByVal bytesTotal As Long)
sckBusy.SendData "服务器忙Q请E后再连接!"
DoEvents
End Sub
Private Sub sckListen_ConnectionRequest(ByVal requestID As Long)
Dim i As Integer
'军_由哪一Winsock接受h
For i = 0 To MaxChan - 1
If sckServer(i).State = 0 Then
Exit For
End If
Next i
If sckServer(i).State = 0 Then
sckServer(i).Accept requestID
Exit Sub
End If
'如果所有Winsock都用完则׃门的“?#8221;Winsock接受hQ以免用戯求得不到响应
sckBusy.Close
sckBusy.Accept requestID
End Sub
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)
sckListen.Close
sckListen.LocalPort = 1000
sckListen.Listen
End Sub
Private Sub sckServer_Close(Index As Integer)
sckServer(Index).Close
End Sub
Private Sub sckServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim s As String
Dim i As Integer
sckServer(Index).GetData s
If UCase(Left(Trim(s), 2)) = "PT" Then '判断是否为悄悄话Q点对点方式
If IsNumeric(Mid(Trim(s), 3, 1)) Then
i = Mid(Trim(s), 3, 1)
sckServer(i).SendData "Channel " & Index & " " & Right(Trim(s), Len(Trim(s)) - 3)
DoEvents
End If
Else 'q播方式
For i = 0 To MaxChan - 1
'利用winsock的State属性给所有连接在服务器上的客户发消息
If sckServer(i).State = 7 Then
sckServer(i).SendData "Channel " & Index & " " & Trim(s)
DoEvents
End If
Next i
End If
lstReceive.AddItem "Channel " & Index & " " & Trim(s)
End Sub
Private Sub sckServer_Error(Index As Integer, 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)
sckServer(Index).Close
End Sub
从程序中可以看到Q第一Q程序中限制了通道敎ͼ10路)。第二,通过判断WinSock控g的State属性是否ؓ0Q关闭状态)Q来重新使用?关闭的WinSock控g。第三,通过lWinSock控g传递的信息加上包头Q来对信息进行不同的处理Q程序中若信息前加上?#8220;PT"QPrivate TalkQ?"通道?#8221;的包_由此q道客h要同拥有?#8220;通道?#8221;的另一客户q行“悄悄?#8221;Q否则就以广播方式将信息发给所有客P?
五) l束?
WinSock控g不仅仅是用来~制|上聊天E序Q而且可以用来~制各种|络游戏或网l通信E序。实际上WinSock控g是编制各UC/SE序 的利器。在实际使用中通常是将WinSock控g装在Activex DLLQ进E内Q、Activex EXEQ进E外Q部件的cMQ类中引用)来用的。通过区分所传信息前的不同的包头Q用RaiseEvent命o引发不同 的事Ӟ再对事g分别q行处理。这样不仅增加了E序的可调试性和安全性,而且更符合事仉动编E方法的特点?/font>
]]>
下面是Winsock控g的相兛_性,Ҏ和事件?略去一些暂用不到的)
*属?
-------------------------------------------------------------------------
LocalHostName | 本地机器?
LocalIP | 本地机器IP地址
LocalPort | 本地机器通信E序的端?0 <端口 <65536)
RemoteHost | q程机器?
RemotePort | q程机器的通信E序端口
state | q接的当前状?文后有详l说?
Protocal | 使用TCP或UDP协议(q里我们?#8216;0-sckTCPProtocal’)
--------------------------------------------------------------------------
*Ҏ
--------------------------------------------------------------------------
Listen
ListenҎ用于服务器程序,{待客户讉K?
格式QWinsock对象.listen
Connect
ConnectҎ用于向远E主机发接请?
格式QWinsock对象.connect [q程LIP,q程端口]
Accept
AcceptҎ用于接受一个连接请?
格式QWinsock对象.accept Request ID
Senddata
此方法用于发送数?
格式QWinsock对象.senddata 数据
Getdata
用来取得接收到的数据
格式QWinsock对象.getdata 变量 [,数据cd [,最大长度]]
Close
关闭当前q接
格式QWinsock对象.close
*事g
----------------------------------------------------------------------------
Close | q程机器关闭q接时触?
Connect | q接建立好,可以q行通信时触?客户?
ConnectRequest | 有请求连接到达时产生(服务器端)
DataArrival | 有数据到达时触发
Error | 发生错误时发?
SendProgress | 数据传送进?
-----------------------------------------------------------------------------
服务器程序的实现q程是:
Q?Q服务器E序必须讄好LocalPort属性,作ؓ侦听端口Q该gؓ一个整敎ͼ只要是一个其它TCP/IP应用E序没有使用q的值即可)?
Q?Q用ListenҎq入侦听状态,{待客户机程序的q接h?
Q?Q客hE序发出q接hQ服务器程序生ConnectionRequest事gQ该事g得到一个参数requestID?
Q?Q服务器E序用AcceptҎ接受客户机程序的requestIDh。这P服务器程序就可以用SendDataҎ发送数据了。AcceptҎ必须用上一步得到的requestID作ؓ其参数?
Q?Q当服务器程序接收到数据Ӟ产生DataArrival事gQ参数BytesTotal包含接收到的数据字节数。在该事件中Q可以用GetDataҎ接收数据?
Q?Q如果接受到Close事gQ则用CloseҎ关闭TCP/IPq接?
客户机程序的实现q程是:
Q?Q?客户E序讄Remotehost属性,以便指定q行服务器程序的L 名,该字W串可在“控制面板||络|标识|计算机名”中查到?
Q?Q?讄RemotePort属?以便指定服务器程序的侦听端口?
Q?Q用ConnectҎQ向服务器提接请求?
Q?Q服务器接受客户机程序的hQ客hE序产生Connect事gQ就可以用SendDataҎ发送数据了?
Q?Q当客户机程序接收到数据Ӟ产生DataArrival事gQ参数BytesTotal包含接收到的数据字节数。在该事件中Q可以用GetDataҎ接收数据?
Q?Q如果接受到Close事gQ则用CloseҎ关闭q接?
Winsock控gq有两个重要的属性,即Protocol和State。Protocol讑֮使用的协议是TCPq是UDPQ取?sckTCPProtocol表示TCP, 取值sckUDPProtocol则表CUDP。因为Winsock控g的缺省设|是sckTCPProtocolQ所以程序中q没有?Protocol属性。State属性反映的是当前TCP/IP的连接状态,取值如?所C?
? Winsock控g的State属性及其描q?
常数 ?描述
SckClosed 0 ~省|关闭
SckOpen 1 打开
SckListening 2 侦听
SckConnectionPending 3 q接挂v
SckResolvingHost 4 识别L
SckHostResolved 5 已识别主?
SckConnecting 6 正在q接
SckConnected 7 已连?
SckClosing 8 同人员正在关闭q接
SckError 9 错误
先在一台计机上运行服务器E序Q此时窗口上只有一?#8220;退?#8221;按钮?再在另一台计机上运行客hE序Q在“q接”按钮双的文本框中输入服务器的主机名后单?#8220;q接”按钮。如果连接成功,则服务器和客hE序H口都会?C个文本框。这Ӟ两端都可以在上面的文本框中输入文字,q些文字会立卛_下面的文本框中出现?
服务器程序用的控g如下Q?
Q?QCommand1Q退出按钮;
Q?QtextsendQ发送数据文本框Q?
Q?QWinsockserverQ?服务器WinsockQ?
Q?Qtextget Q接收数据文本框?
服务器程序的界面如图所C?
服务器程序的源代码如下:
Private Sub Command1_Click()
End
End Sub
Private Sub Form_Load()
textsend.Visible = False
textget.Visible = False
Winsockserver.LocalPort = 1001
Winsockserver.Listen
End Sub
Private Sub textsend_Change()
Winsockserver.SendData textsend.Text
End Sub
Private Sub Winsockserver_Close()
Winsockserver.Close
End
End Sub
Private Sub Winsockserver_ConnectionRequest(ByVal requestID As Long)
textsend.Visible = True
textget.Visible = True
If Winsockserver.State <> sckClosed Then Winsockserver.Close
Winsockserver.Accept requestID
End Sub
Private Sub Winsockserver_DataArrival(ByVal bytesTotal As Long)
Dim tmpstr As String
Winsockserver.GetData tmpstr
textget.Text = tmpstr
End Sub
客户机程序用的控g如下Q?
Q?QCommand1Q退出按钮;
Q?QCommand2Q连接按钮;
Q?QWinsockclientQ客户WinsockQ?
Q?QText1Q主机名文本框;
Q?QTextsendQ发送数据文本框Q?
Q?QTextgetQ接收数据文本框Q?
客户机程序的源代码如下:
Private Sub Command1_Click()
End
End Sub
Private Sub Command2_Click()
Winsockclient.Connect
End Sub
Private Sub Form_Load()
textsend.Visible = False
textget.Visible = False
Winsockclient.RemotePort = 1001
Winsockclient.RemoteHost = "sccdsz"
End Sub
Private Sub Text1_Change()
Winsockclient.RemoteHost = Text1.Text
End Sub
Private Sub textsend_Change()
Winsockclient.SendData textsend.Text
End Sub
Private Sub Winsockclient_Close()
Winsockclient.Close
End
End Sub
Private Sub winsockclient_Connect()
textsend.Visible = True
textget.Visible = True
Command2.Visible = False
End Sub
Private Sub winsockclient_DataArrival(ByVal bytesTotal As Long)
Dim tmpstr As String
Winsockclient.GetData tmpstr
textget.Text = tmpstr
End Sub
我试q了Q可以用
Private Sub Workbook_Open()
Dim cbr As CommandBar
Dim ctrMenu As CommandBarControl
Dim ctr As CommandBarControl
Set cbr = Application.CommandBars("Worksheet Menu Bar")
For Each ctr In cbr.Controls
If ctr.Caption = "custom" Then
Exit Sub
End If
Next
Set ctlMenu = cbr.Controls.Add(Type:=msoControlPopup)
With ctlMenu
.Caption = "custom"
With .Controls.Add(Type:=msoControlButton)
.Caption = "aa"
.OnAction = "action1"
End With
With .Controls.Add(Type:=msoControlButton)
.Caption = "bb"
.OnAction = "action2"
End With
End With
End Sub
Z么要考虑到这个问题呢Q?/p>
׃历史的原因,客户以前的数据很多都是在存入在文本数据库中,如Acess、Excel、Foxpro。现在系l升U及数据库服务器如SQLServer、ORACLE后,l常需要访问文本数据库中的数据Q所以就会生这L需求。前D|间出差的目Q就是面临这L一个问题:SQLServer和VFP之间的数据交换?/p>
要完成标题的需要,在SQLServer中是一仉常简单的事情?/p>
通常的可以有3U方式:1、DTS工具 2、BCP 3、分布式查询
DTS׃需要说了,因ؓ那是囑Ş化操作界面,很容易上手?/p>
q里主要讲下后面两们Q分别以查、增、删、改作ؓ单的例子Q?/p>
下面废话׃说了Q直接以T-SQL的Ş式表现出来?/p>
一、SQLServer和Access
1、查询Access中数据的ҎQ?/p>
select * from OpenRowSet('microsoft.jet.oledb.4.0',';database=c:\db2.mdb','select * from serv_user')
?/p>
select * from OpenDataSource('Microsoft.Jet.OLEDB.4.0','Data Source="c:\DB2.mdb";User ID=Admin;Password=')...serv_user
2、从SQLServer向Access写数据:
insert into OpenRowSet('microsoft.jet.oledb.4.0',';database=c:\db2.mdb','select * from Accee?)
select * from SQLServer?br />
或用BCP
master..xp_cmdshell'bcp "serv-htjs.dbo.serv_user" out "c:\db3.mdb" -c -q -S"." -U"sa" -P"sa"'
上面的区别主要是QOpenRowSet需要mdb和表存在QBCP会在不存在的时候生成该mdb
3、从Access向SQLServer写数据:有了上面的基Q这个就很简单了
insert into SQLServer?select * from
OpenRowSet('microsoft.jet.oledb.4.0',';database=c:\db2.mdb','select * from Accee?)
或用BCP
master..xp_cmdshell'bcp "serv-htjs.dbo.serv_user" in "c:\db3.mdb" -c -q -S"." -U"sa" -P"sa"'
4、删除Access数据Q?/p>
delete from OpenRowSet('microsoft.jet.oledb.4.0',';database=c:\db2.mdb','select * from serv_user')
where lock=0
5、修改Access数据Q?/p>
update OpenRowSet('microsoft.jet.oledb.4.0',';database=c:\db2.mdb','select * from serv_user')
set lock=1
SQLServer和Access大致p么多?/p>
二、SQLServer和Excel
1、向Excel查询
select * from OpenRowSet('microsoft.jet.oledb.4.0','Excel 8.0;HDR=yes;database=c:\book1.xls;','select * from [Sheet1$]') where c like '%f%'
select * from
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\book1.xls',[sheet1$])
1)hdr=yes时可以把xls的第1行作为字D늜待,如第1个中hdr=no的话Qwhere时就会报?br /> 2)[]和美?必须要,否则M$可不认这个̎
2、修改Execl
update OpenRowSet('microsoft.jet.oledb.4.0','Excel 8.0;hdr=yes;database=c:\book1.xls;','select * from [Sheet1$]')
set a='erquan' where c like '%f%'
3、导入导?/p>
insert into OpenRowSet('microsoft.jet.oledb.4.0','Excel 8.0;hdr=yes;database=c:\book1.xls;','select * from [Sheet2$]')(id,name)
select id,name from serv_user
或BCP
master..xp_cmdshell'bcp "serv-htjs.dbo.serv_user" out "c:\book2.xls" -c -q -S"." -U"sa" -P"sa"'
从Excel向SQLServer导入Q?/p>
select * into serv_user_bak
from OpenRowSet('microsoft.jet.oledb.4.0','Excel 8.0;HDR=yes;database=c:\book1.xls;','select * from [Sheet1$]')
如果表serv_user_bak不存在,则创?/p>
有关BCP和分布式查询的详l解{,查SQLServer自带的帮助吧?br /> SQLServer和txt文g、HTML文g、VFP文g的数据交换都昑־非常Ҏ了。。。?/p>
其实q些内容在帮助里都有Q偶只不q是ȝ了一下,方便大家参考,呵呵~~
以上内容都经q测试~~