2009年06月17日

手机试贴

2004年12月16日

<a href=javascript:if(confirm(‘确定要删除吗?’))location=xxxx.asp?xxx=<%=rs(“xxxx”)%>’>删除</a>

2004年11月24日

1.函数array() 
 功能:创建一个数组变量 
 格式:array(list) 
 参数:list 为数组变量中的每个数值列,中间用逗号间隔 
 例子: 
 <% i = array (“1″,”2″,”3″) %> 
 结果: i 被赋予为数组 
 2.函数Cint() 
 功能:将一表达式/其它类型的变量转换成整数类型(int) 
 格式:Cint(expression) 
 参数:expression 是任何有效的表达式/其它类型的变量 
 例子: 
 <% 
 f = ”234″ 
 response.write cINT(f) + 2 
 %> 
 结果: 236 
 函数Cint()将字符”234″转换 成整数234.如果表达式为空, 或者无效时,返回值为0; 
 3.函数:Creatobject() 
 功能:创建及返回一个ActiveX对象. 
 格式:Creatobject(obname) 
 参数bname 是对象的名称 
 例子: 
 <% 
 Set con = Server.CreateObject(“ADODB.Connection”) 
 %> 
 结果: 
 4.函数Cstr() 
 功能:将一表达式/其它类型的变量转换成字符类型(string) 
 格式:Cstr(expression) 
 参数:expression是任何有效的表达式/其它类型的变量 
 例子: 
 <% 
 s = 3 + 2 
 response.write ”The result is:” & cStr(s) 
 %> 
 结果:函数Cstr()将整数 5 转换 成字符”5″. 
 5.函数Date() 
 功能:返回当前系统(server端)的日期 
 格式: Date() 
 参数:无 
 例子<% date () %> 
 结果:05/10/00 
 6.函数Dateadd() 
 功能:计算某个指定的时间和 
 格式: dateadd(timeinterval,number,date) 
 参数:timeinterval是时间单位(月,日..); number是时间间隔值,date是时间始点. 
 例子: 
 <% 
 currentDate = #8/4/99# 
 newDate = DateAdd(“m”,3,currentDate) 
 response.write newDate 
 %> <% 
 currentDate = #12:34:45 PM# 
 newDate = DateAdd(“h”,3,currentDate) 
 response.write newDate 
 %> 
 结果: 
 11/4/99 
 3:34:45 PM 
 其中 
 ”m” = ”month”; 
 ”d” = ”day”; 
 如果是currentDate 格式,则, 
 ”h” = ”hour”; 
 ”s” = ”second”; 
 7.函数Datediff() 
 功能:计算某量个指定的时间差 
 格式: datediff(timeinterval,date1,date2[,firstdayofweek[,firstdayofyear]]) 
 参数: timeinterval 是时间单位; date1,date2是有效的日期表达式,firstdayofweek,firstdayofyear 是任意选项. 
 例子: 
 <% 
 fromDate = #8/4/99# 
 toDate = #1/1/2000# 
 response.write ”There are ” & _ 
 DateDiff(“d”,fromDate,toDate) & _ 
 ” days to millenium from 8/4/99.” 
 %> 
 结果:There are 150 days to millenium from 8/4/99. 
 8.函数day() 
 功能:返回一个整数值,对应于某月的某日 
 格式: day(date) 
 参数: date是一个有效的日期表达式; 
 例子<% =date(#8/4/99#) %> 
 结果:4 
 9.函数formatcurrency() 
 功能:转换成货币格式 
 格式: formatcurrency(expression [,digit[,leadingdigit[,paren[,groupdigit]]]]) 
 参数: expression 是有效的数字表达式;digit表示小数点后的位数;leadingdigit,paren,groupdigit是任意选项. 
 例子<%=FormatCurrency(34.3456)%> 
 结果34.35 
 10.函数Formatdatetime() 
 功能:格式化日期表达式/变量 
 格式: formatdatetime(date[,nameformat]) 
 参数: date为有效的日期表达式/变量;nameformat是指定的日期格式常量名称. 
 例子<% =formatdatetime(“08/04/99″,vblongdate) %> 
 结果:Wednesday,August 04,1999 
 说明: 
 ——————————————————————————–
 描述
 返回表达式,此表达式已被格式化为日期或时间。 
 语法
 FormatDateTime(Date[, NamedFormat])
 FormatDateTime 函数的语法有以下参数:

 参数 描述 
 Date 必选项。要被格式化的日期表达式。 
 NamedFormat 可选项。指示所使用的日期/时间格式的数值,如果省略,则使用 vbGeneralDate。 

 
 设置
 NamedFormat 参数可以有以下值:
 常数 值 描述 
 vbGeneralDate 0 显示日期和/或时间。如果有日期部分,则将该部分显示为短日期格式。如果有时间部分,则将该部分显示为长时间格式。如果都存在,则显示所有部分。 
 vbLongDate 1 使用计算机区域设置中指定的长日期格式显示日期。 
 vbShortDate 2 使用计算机区域设置中指定的短日期格式显示日期。 
 vbLongTime 3 使用计算机区域设置中指定的时间格式显示时间。 
 vbShortTime 4 使用 24 小时格式 (hh:mm) 显示时间。 

 说明
 下面例子利用 FormatDateTime 函数把表达式格式化为长日期型并且把它赋给 MyDateTime: 
 Function GetCurrentDate 
 ”FormatDateTime 把日期型格式化为长日期型。
 GetCurrentDate = FormatDateTime(Date, 1) 
 End Function
 ——————————————————————————–
  [Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]  

 11.函数Isnumeric() 
 功能:返回一个布尔值,判断变量是否为数字变量,或者是可以转换成数字的其它变量. 
 格式:isnumeric(expression) 
 参数:expression 是任意的变量. 
 例子: 
 <% 
 i=”234″ 
 response.write isnumeric(i) 
 %> 
 结果: true. 
 12.函数Isobject() 
 功能:返回一个布尔值,判断变量是否为对象的变量, 
 格式: isobject(expression) 
 参数: expression 是任意的变量. 
 例子: 
 <% 
 set con =server.creatobject(“adodb.connection”) 
 response.write isobject(con) 
 %> 
 结果: true 
 13.函数:Lbound() 
 功能:返回一个数组的下界. 
 格式:Lbound(arrayname[,dimension]) 
 参数:arrayname 是数组变量,dimension 是任意项 
 例子: 
 <% 
 i = array(“1″,”2″,”3″) 
 response.write lbound(i) 
 %> 
 结果:0
14.函数Lcase() 
 功能:将一字符类型变量的字符全部变换小写字符. 
 格式:Lcase(string) 
 参数:string是字符串变量 
 例子: 
 <% 
 str=”THIS is Lcase!” 
 response.write Lcase(str) 
 %> 
 结果:this is lcase! 
 15.函数left() 
 功能:截取一个字符串的前部分; 
 格式:left(string,length) 
 参数:string字符串,length截取的长度. 
 例子: <% =left(“this is a test!”,6) %> 
 结果:this i 
 16.函数len() 
 功能:返回字符串长度或者变量的字节长度 
 格式:len(string *varname) 
 参数:string字符串;varname任意的变量名称 
 例子: 
 <% 
 strtest=”this is a test!” 
 response.write len(strtest) 
 %> 
 结果:15 
 17.函数ltrim() 
 功能:去掉字符串前的空格. 
 格式:ltrim(string) 
 参数:string 字符串. 
 例子: <% =ltrim (“ this is a test!”) 
 结果:this is a test! 
 18.函数Mid() 
 功能:从字符串中截取字符串. 
 格式:mid(string,start [,length]) 
 参数:string字符串,start截取的起点,length要截取的长度. 
 例子: 
 <% 
 strtest=”this is a test, Today is Monday!” 
 response.write mid(strtest,17,5) 
 %> 
 结果:Today 
 19.函数minute() 
 功能:返回一数值, 表示分钟 
 格式:minute(time) 
 参数: time是时间变量 
 例子lt;% =minute(#12:23:34#) %> 
 结果:23 
 20.函数month() 
 功能:返回一数值, 表示月份 
 格式:month(time) 
 参数:time是日期变量 
 例子<% =month(#08/09/99) %> 
 结果:9 
 21.函数monthname() 
 功能:返回月份的字符串(名称). 
 格式:Monthname(date [,abb]) 
 参数: date是日期变量,abb=true时 则月份的缩写, 
 例子: 
 <% =monthname(#4/5/99#) %> 
 结果:April 
 22.函数Now() 
 功能:返回系统的当前时间和日期. 
 格式:now() 
 参数:无 
 例子: 
 <% =now() %> 
 结果: 05/10/00 8:45:32 pm 
 23.函数:replace() 
 功能:在字符串中查找,替代指定的字符串. 
 格式:replace(strtobesearched,strsearchfor,strreplacewith [,start[,count[,compare]]]) 
 参数:strtobesearched是字符串; strsearchfor是被查找的子字符串;strreplacewith 是用来替代的子字符串.start,count,compare 是任意选项. 
 例子: 
 <% 
 strtest=”this is an apple.” 
 response.write replace(strtest,”apple”,”orange”) 
 %> 
 结果:this is an orange. 
 24.函数right() 
 功能:截取一个字符串的后部分 
 格式:right(string,length) 
 参数:string字符串,length截取的长度. 
 例子: 
 <% 
 strtest=”this is a test!” 
 response.write right(strtest,3) 
 %> 
 结果:st! 
 25.函数rnd() 
 功能:返回一个随机数值 
 格式:rnd[(number)] 
 参数:number是任意数值. 
 例子: 
 <% 
 randomize() 
 response.write rnd() 
 %> 
 结果:0/1数值之一,无randomize(), 则不能产生随机数. 
 26.函数round() 
 功能:完整数值 
 格式:round(expression[,numright]) 
 参数:expression数字表达式;numright任意选项. 
 例子: 
 <% 
 i=12.33654 
 response.write round(i) 
 %> 
 结果: 12 
 27.函数rtrim() 
 功能:去掉字符串后的空格. 
 格式:rtrim(string) 
 参数:string 是字符串 
 例子: 
 <% 
 response.write rtrim(“this is a test! ”) 
 %> 
 结果:this is a test! 
 28.函数second() 
 功能:返回一个整数值. 
 格式:second(time) 
 参数:time是一个有效的时间表达式; 
 例子lt;% =second(# 12:28:30#) %> 
 结果:30 
 29.函数strReverse() 
 功能:返回与原字符串排列逆向的字符串. 
 格式:strreverse(string) 
 参数:string是字符串 
 例子<% =strreverse(“this is a test!”) 
 结果:!tset a si siht 
 30.函数time() 
 功能:返回当前系统的时间值. 
 格式:time() 
 参数:无 
 结果:9:58:28 Am 
 31.函数trim() 
 功能:删去字符串前,后的空格. 
 格式:trim(string) 
 参数:string 字符串. 
 例子: 
 <% 
 strtest=” this is a test! ” 
 response.write trim(strtest) 
 %> 
 结果:this is a test! 
 32.函数UBound() 
 功能:返回一个数组的上界. 
 格式:Ubound(expression [,dimension]) 
 参数:expression 是数组表达式/数组变量,dimension 是任意项 
 例子: 
 <% 
 i = array(“1″,”2″,”3″) 
 response.write ubound(i) 
 %> 
 结果: 2 
 33.函数:UCase() 
 功能:将一字符类型变量的字符全部变换成大写字符. 
 格式:Ucase(string) 
 参数:string是字符串变量 
 例子: 
 <% 
 str=”THIS is Lcase!” 
 response.write Lcase(str) 
 %> 
 结果:THIS IS LCASE! 
 34.函数Vartype() 
 功能:返回变量的常量代码(整数) 
 格式:Vartype(varname) 
 参数:varname是任何类型的变量名称. 
 例子: 
 <% 
 i=5 
 response.write vartype(i) 
 %> 
 结果:2 (2表示整数,须要参考ASP常量代码.) 
 35.函数Weekday() 
 功能:返回一个整数,对应一周中的第几天. 
 格式:Weekday(date [,firstofweek]) 
 参数: date为日期变量,firstofweek为任选项. 
 例子: 
 <% 
 d= # 5/9/00 # 
 response.write weekday(d) %> 
 结果:3(3 表示是星期二) 
 36.函数weekdayname() 
 功能:返回字符串,对应星期几. 
 格式:weekdayname(weekday[,abb[,firstdayofweek]]) 
 参数:weekday为日期变量,abb,firstdayofweek为任选项. 
 例子: 
 <% 
 d = #8/4/99# 
 response.write weekdayname(d) 
 %> 
 结果: Wednesday 
 37.函数year() 
 功能:返回日期表达式所在的年份. 
 格式:year(date) 
 参数: date是有效的日期表达式 
 例子: 
 <% =year(#8/9/99#) %> 
 结果:1999 
 38.函数Mod()功能:取余数.
 例子:3 Mod 2 
 结果:1

2004年11月06日

‘工程->引用->Microsoft ActiveX Data Objects 2.0 Library (后面为版本号)
Dim rs As New ADODB.Recordset, cn As New ADODB.Connection

‘向数据库中添加数据
Private Sub Command2_Click()
    If rs.State = adStateOpen Then rs.Close
    rs.Open “SELECT * FROM USERPASSWORD”, cn, adOpenDynamic, adLockOptimistic
    rs.AddNew
    rs!UID = txtUid.Text
    rs!PWD = txtPwd.Text
    rs!TRUENAME = txtName.Text
    rs!CREATEDATE = Format(Now, “YYYY/MM/DD”)
    rs.Update
   
    Command1.Value = True
End Sub

Private Sub Form_Load()
    ‘连接 SQL SERVER 数据库
    cn.ConnectionString = “Driver={SQL Server};SERVER=DataServer;DATABASE=zxzx;UID=information;PWD=information*&#”
    cn.Open
    ‘查询字符串可以上这里查
    ‘http://www.connectionstrings.com/
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
On Error Resume Next
    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing
End Sub

###########################################

 

Private Sub Form_Load()
Dim strConn As String
Dim pubConn As New ADODB.Connection
Dim rsTable As New ADODB.Recordset
Dim strSQL As String

strConn = “Provider=SQLOLEDB.1;Persist Security Info=False;User ID=develop; password=12345;Data Source=ServerName”
pubConn.Open strConn

rsTable.CursorLocation = adUseClient
strSQL = “select  * from TableName”
rsTable.Open strSQL, pubConn, adOpenDynamic, adLockOptimistic
Set DataGrid1.DataSource = rsTable

End Sub

##########################################

dim cnn as new ADODB.Connection
dim rs as Adodb.recordset
dim s as string,i as long

cnn.CursorLocation = 3 ‘
cnn.CommandTimeout = 30
cnn.Open “Provider=SQLOLEDB;Data Source=192.168.0.11;User ID=sa;Password=sa;Initial Catalog=tempdb;Persist Security Info=True”

set rs = nothing
set rs = cnn.execute(“select * from sysobjects”)
while not rs.eof
    for i = 0 to rs.fields.count – 1
        s = s & rs(i) & vbtab
    next
    s = s & vbcrlf
    rs.movenext
wend
msgbox s

##########################################

2004年11月01日
本篇文章通过与传统的设计方法相比较,介绍了如何在ASP代码中调用VB组件的方法。在本篇文章中,我们假设读者具有VB和ASP的相关入门知识。

服务器端组件和客户端组件的比较

服务器端组件和客户端组件有许多不同之处。服务器端组件是在计算机服务器上注册的DLL文件,客户端组件则在浏览器运行的计算机上注册,在IE中,这些客户端组件被称作ActiveX浏览器插件组件。

ActiveX客户端组件可以使用VB编写,并通过互联网或内联网发送给浏览器,生成很精彩的效果。问题是,ActiveX客户端组件只限于IE,而使用VB编写的服务器端组件则能够产生纯HTML代码,适用于所有的浏览器。服务器端组件的最大问题是该组件必须在Windows+IIS环境中或与IIS的API兼容的应用中运行。相比较而言,在服务器端实现这种兼容性似乎更容易一些。

IIS服务器端组件驻留在与IIS相同的内存空间中,并随时准备服务器上处理的ASP网页的调用。从理论上说,我们可以在返回浏览器的ASP代码中插入任何文本或代码,但一般来说,大多数服务器端组件被用来处理需要大量时间的计算或数据库信息查找,然后将所得到的结果以HTML代码的形势返回给浏览器。

VB组件的解析

由于本篇文章旨在讨论编写VB组件的基本方法,因此在能够说明问题的情况下,其中的例子将是十分简单的。在详细讨论编写VB组件之前,我们将首先从概念上对VB组件作一番剖析。

在使用VB编写服务器端的组件时,有三个分层次的概念(在VB和ASP代码中都会用到)需要注意:

·Project名字

·Class名字

·Method名字

VB工程的名字就是Project名字。许多开发人员都将Project名字看作是组件名字,但VB只将它看作是工程的名字。在我们的例子中,Project名字是ExampleProject,当然了,我们可以随意命名自己的工程名字;Class名字名字是ExampleClass,Method名字是ExampleMethod。

工程名字(组件名字)也可以是由组件代码编译后得到的DLL文件的名字,该DLL文件将包含有被IIS用来向浏览器返回文本或HTML代码的经过编译的VB代码。

方法名字指的是管理特定代码功能的VB代码部分,例如计算日期或显示数据库中所有作者的清单。组件方法有点角个黑盒子,它完成特定的工作或根据输入的信息返回特定的信息。一般情况下,在一个组件中可以有多个方法。为了更有效地管理组件的方法,可以将方法按照相似的分类组合在一起,这就是组件类的作用。

组件类能够在内存中生成组件类代码的一个拷贝,在使用ASP代码创建对象时,它也被称作对象,这就是实例化。一旦有了组件类代码实例的对象引用,我们就可以从ASP代码中调用类中包含的方法。

在我们的例子中,工程、类、方法的名字将用来在ASP代码中实例化VB组件,并以方法参数的形式从ASP代码中向VB代码传送值,在ASP代码中接收从VB方法中返回的值。

从ASP文件中调用VB组件

我们用来调用VB组件的ASP文件将使用对象变量保存VB对象的引用。在ASP文件中,可以使用ASP Server对象的CreateObject()方法创建一个对象,该方法将返回一个它创建的对象的引用。在例子中,我们将使用objReference作为组件的对象变量。下面的代码显示ASP代码在实例化VB组件时需要使用组件的工程名和类名(ExampleProject和ExampleClass)。

实例化VB组件的ASP代码:


Set objReference = Server.CreateObject(“ExampleProject.ExampleClass”)

VB组件将从ASP代码中接受3个变量的值,并向ASP代码返回一个值,该值将存储在名字为strMethodReturn的ASP变量中。下面的代码显示出ASP代码是如何得到由VB组件返回的值的,它向VB方法传送三个名字分别为Param1、Param2和Parma3的三个参数值:

strMethodReturn = objReference.ExampleMethod(Param1, Param2, Param3)

Param1、Param2、Param3这三个参数必须与VB组件中方法的定义完全相同,下面是二行实例化VB组件的类、并调用类的方法获得返回值的ASP代码的例子:


Set objReference = Server.CreateObject(“ExampleProject.ExampleClass”)
strMethodReturn = objReference.ExampleMethod(Param1, Param2, Param3)

下面的图表直观地显示了VB组件的工程、类和方法名字是如何与ASP文件中的组件实例化代码协调的。在逐步地学习如何编写例子中的VB代码和ASP文件时,可以将下面的图表作为参考。

   

VB方法的作用

我们例子中简单的VB组件将获得用户的名字和年龄,然后返回一个以天计的用户的年龄,而且有一个可选项,能够提醒某个用户是否已经超过了45岁。

如果我们向组件传送一个虚构的Eric Clapton作为方法的第一个参数值,将第二个参数设置为56,我们将得到下面的返回字符串:

Eric Clapton is over 20440 days old.

如果我们将可选的第三个参数设置为True(这一参数将使方法判断用户是否已经超过45岁),我们将会得到下面的返回字符串:

Eric Clapton is over 20440 days OLD.

由于使用了三个完全不同的变量━━用户的姓名、年龄以及表示他们是否超过了45岁,因此我们需要使用三个方法参数将这些信息从ASP文件传送给VB代码。在VB中,考虑要使用哪些数据类型是十分重要的。我们将使用一个名字为strName的字符串型变量表示用户的姓名,名字为intAge的整型变量表示用户的年龄,名字为blnAgeEmphasisOn的布尔型变量表明用户是否已经超过了45岁。

三个方法参数(传送给VB组件的方法代码的变量):


strName (String)
intAge (Integer)
blnAgeEmphasisOn (Boolean)

在VB中创建服务器端组件

启动VB后,在“新工程”窗口中双击“ActiveX DLL”图标。一旦VB加载了新的ActiveX DLL工程,至少会看到二个打开的窗口:工程窗口和属性窗口。如果有一个窗口显示不出来,可以从VB的菜单中选择“查看”菜单项(分别使用“查看”->“工程管理器”、“查看”->“属性窗口”)。

由于VB对第一个工程和类的缺省命名分别是Project1、Class1,我们可以将它们分别改为ExampleProject 和ExampleClass。工程名字的修改可以在工程窗口中进行。在工程窗口中新输入的工程名字左侧有一个带有+或-的小方框。如果显示的是+号,选择该小方框,+号就会变成-号,缺省的类名(Class1)就会显示在工程名字的下面。在工程窗口中选择缺省的类名,在属性窗口中将缺省的类名修改为ExampleClass。

在保存工程时,VB会将包含类的代码保存在一个扩展名为CLS的文件,工程文件的扩展名为VBP,其中存储有工程的各种设置、文件名和文件存储的位置。

服务器端组件的属性值

在属性窗口中显示ExampleClass类的属性,注意Instancing属性的值为“5 MultiUse”,如果将工程的类型设置为标准的EXE工程,该属性的值就会随之发生改变。

在VB的菜单中选择“工程”->“ExampleProject属性”,就会显示出工程属性窗口。在“常规”标签的右下端的“线程模式”属性的值应当被设置为“单元线程”,这将使多个访问者能够同时使用我们的组件类的不同的实例。另外,选择“无人值守执行”和“驻留内存”二个选项,避免VB6中的内存泄露问题。

VB方法的代码

现在我们就需要使用VB的代码窗口来输入VB代码了。如果代码窗口还是一片空白,那就输入下面的代码好了:


Option Explicit
      ’它将要求我们必须定义所有的变量。
 
  Public Function ExampleMethod(ByVal strName As String, _
                           ByVal intAge As Integer, _
                  Optional ByVal blnAgeEmphasisOn As Boolean = False) As String

   

在上面的代码中,我们将方法定义成了一个Public函数,这意味着该组件之外的任何代码都能够调用它,由于是一个函数,它还会向调用它的代码返回一个值。


Public Function ExampleMethod() As String

上面的代码表示ExampleMethod()函数将向它的调用者返回一个字符串类型的值。

我们的VB方法带有3个从ASP代码接受值的参数变量,最后一个参数变量是可选的。所有用来从VB组件之外接收值的参数变量都需要在VB方法的括号间定义和使用,我们可以象在方法内定义的变量那样使用以这种方式定义为方法参数的变量,二者之间唯一的区别是外面的ASP代码来决定它们的值。

下面是三个变量和它们的数据类型:


         ByVal strName As String
           ByVal intAge As Integer
  Optional ByVal blnAgeEmphasisOn As Boolean = False
 

上面的代码定义了三个方法参数的数据类型,指明它们是按值传送的,而且第三个参数是可选的,如果没有第三个参数,则其缺省值为False。

然后,我们将在方法的定义中添加一些必要的逗号、空格和底划线(_),这样才能符合VB的语法要求。我们将把参数列表放在方法定义的括号中间,得到的方法定义如下:


Public Function ExampleMethod(ByVal strName As String, _
                             ByVal intAge As Integer, _
                    Optional ByVal blnAgeEmphasisOn As Boolean = False) As String
 

在VB的代码窗口输入上面的方法定义,就会生成一个End Function语句。方法的定义和End Function之间就是我们编写自己的代码的地方了。

我们在方法的主体中添加的第一行代码就是定义一个字符串变量,用来存储该方法返回的字符串数据。我们可以不使用字符串变量而使用字符串向调用方法的代码返回文本数据。


Dim strReturnString As String

下面我们就可以来建立返回的字符串了。我们可以通过方法的参数列表使用由ASP代码传送的strName变量值。首先将strName参数变量值与字符串“is over”连接起来。接下来我们将使用intAge参数变量计算一个已经生存的天数,然后在前面的字符串上再添加“age in days”字符串。需要注意的是,我们需要将intAge * 365二个整型数的乘积转换为字符串,然后才能将它组合在strReturnString字符串,VB中的Cstr()方法可以实现这一目的。


strReturnString = strName & ” is over ” & CStr(intAge * 365)

如果假设从ASP代码中传给组件的姓名为Eric Clapton,年龄参数为56,因此,strReturnString应当包含下面的内容:

Eric Clapton is over 20440

我们最终的字符串会根据intAge变量的值是否超过45和blnAgeEmphasisOn变量是否设置为true再添加上

“days old”或“days OLD”。下面的代码可以实现该功能:


If blnAgeEmphasisOn And intAge > 44 Then
       strReturnString = strReturnString & ” days OLD.”
  Else
       strReturnString = strReturnString & ” days old.”
  End If

如果ASP代码没有将blnAgeEmphasisOn变量的值作为方法参数传送给组件,根据我们的方法定义,它的值将被缺省地设置为false。如果它被设置为true,而且intAge变量的值大于45,我们将得到下面的输出:

Eric Clapton is over 20440 days OLD.

否则,我们会得到下面的输出:

Eric Clapton is over 20440 days old.

为了将上面的字符串返回给调用组件的ASP代码,我们将字符串的值赋给方法的名字:


ExampleMethod = strReturnString

完整的方法代码如下所示:


Public Function ExampleMethod(ByVal strName As String, _
                             ByVal intAge As Integer, _
                    Optional ByVal blnAgeEmphasisOn As Boolean = False) As String
 
      ’///// 建立局部变量
      Dim strReturnString As String
 
      ’///// 创建返回的变量的值
      strReturnString = strName & ” is over ” & CStr(intAge * 365)
 
      ’///// 完善strReturnString
      If blnAgeEmphasisOn And intAge > 44 Then
          strReturnString = strReturnString & ” days OLD.”
      Else
          strReturnString = strReturnString & ” days old.”
      End If
 
      ’///// 返回字符串
      ExampleMethod = strReturnString
 
  End Function

在ASP代码中调用VB方法

在ASP代码中实例化VB对象

我们需要的大部分ASP代码已经在前面的A Conceptual Overview进行了讨论。在ASP代码中,我们仍然需要依次完成下面的工作:

·使用ASP Server对象的CreateObject()方法实例化VB组件。

·使用合适的方法参数变量调用组件的方法。

·将从VB方法中返回的字符串值赋给ASP变量中的一个变量。

·然后在Response.Write()方法中使用该变量将字符串发送给浏览器。

我们将使用ASP文件中的一些代码对VB组件的类进行实例化,下面是VB组件实例化的代码:


Set objReference = Server.CreateObject(“ExampleProject.ExampleClass”)

ASP Server对象的CreateObject()方法返回VB代码对象的地址,因此我们能够在ASP中调用类的任何一个public方法。需要注意的是,作为ASP CreateObject()方法的方法参数的是VB工程和类的名字,objReference用来保持组件的类的对象实例的引用。

在ASP文件中使用组件的方法

现在,我们就可以使用组件的类方法ExampleMethod,得到一个表明一个人以天计的寿命。下面的代码使用参数的值,并将从方法中返回的字符串的值赋给一个名字为strMethodReturn的变量:


strMethodReturn = objReference.ExampleMethod(“Eric Clapton”, 56, True)

提示:当我们的组件被实例化后,objReference就表示CreateObject()方法中出现过的ExampleProject.ExampleClass。尽管我们可以将objReference.ExampleMethod看作与ExampleProject.ExampleClass.ExampleMethod()等同,但我们不能这样使用。

当然了,我们也可以使用变量而不是直接的值作为方法的参数,选择的参数变量的名字无须与VB方法参数表中的相同,它们只要与参数表中的非可选参数个数、类型、顺序相同就可以了。


aspName = “Eric Clapton” aspAge = 56 aspEmphasis = True strMethodReturn = objReference.ExampleMethod(aspName, aspAge, aspEmphasis)

使用变量取代值使代码显得更清晰,也更具有可管理性,尤其是代码变得很长时。

现在我们只要在ASP Response.Write()方法中将strMethodReturn返回给访问ASP代码的浏览器即可。下面是完整的ASP代码,在代码的结束处,我们添加了一行分离组件对象地址的代码,以清除组件的对象代码:


<%
‘///// 实例化组件对象
Set objReference = Server.CreateObject(“ExampleProject.ExampleClass”)

‘///// 设置作为方法参数的局部变量
aspName = “Eric Clapton”
aspAge = 56
aspEmphasis = True

‘///// 调用组件的方法,存储返回值
strMethodReturn = objReference.ExampleMethod(aspName, aspAge, aspEmphasis)

‘///// 将返回值发送给访问的浏览器
Response.Write(strMethodReturn)

‘///// 清除组件的对象
Set objReference = Nothing
%>

将上面的ASP代码存储在一个ASP文件中,将会产生下面的字符串输出:

Eric Clapton is over 20440 days OLD.

使ASP代码能够调用DLL文件

对我们的组件的测试就是让Windows知道它的存储位置以及ASP代码何时调用它。首先,在VB的菜单中选择“运行”图标或“运行/开始”,VB就会临时地向系统注册该组件。

提示:不能象加载HTML文件那样直接使用浏览器加载ASP文件,ASP文件必须通过WEB服务器被加载到浏览器上。

浏览器将显示出“Eric Clapton is over 20440 days OLD.”的字样。

为了使组件能够在其他的服务器上运行,它必须被编译成DLL文件,然后在服务器上注册。当然了,如果希望在开发用的计算机永久地使用该组件,也需要进行编译、注册。在其他计算机上运行该组件的唯一文件就是编译得到的DLL文件,当然了,这需要计算机已经安装了VB运行时间库文件。

如何编译组件源代码得到DLL文件以及如何在计算机上注册组件不是本篇文章的讨论范围,我们就不再详细叙述了。

作为编写IIS服务器端组件的一个副产品,我们可以从任何ASP文件和其他VB组件中调用编写的组件的方法,这将进一步提高代码的灵活性和模块化程度

作者:angelove 出处:赛迪网

2004年10月31日

1.用 Select 子句检索记录
Select 子句是每一个检索数据的查询核心。它告诉数据库引擎返回什么字段。
Select 子句的常见形式是:
Select *
该子句的意思是“返回在所指定的记录源中能找到的所有字段”。这种命令形式很方便,因为你无需知道从表中检索的字段名称。然而,检索表中的所有列是低效的。因此,因该只检索需要的字段,这样可以大大的提高查询的效率。
2.使用 From 子句指定记录源
From 子句说明的是查询检索记录的记录源;该记录源可以是一个表或另一个存储查询。
你还能从多个表中检索记录,这在后面的章节中将介绍。
例子:
Select * From students 检索students表中的所有记录
3.用 Where 子句说明条件
Where 子句告诉数据库引擎根据所提供的一个或多个条件限定其检索的记录。条件是一个表达式,可具有真假两种判断。
例子:
Select * From students Where name=”影子”
返回students中name字段为影子的列表,这次所返回的结果没有特定顺序,除非你使用了 Order By 子句。该子句将在后面的章节介绍。
注意:Where 子句中的文本字符串界限符是双引号,在VB中因改为单引号,因为在VB中字符串的界定符是双引号。
补充:
使用 And 和 Or 逻辑可以将两个或更多的条件链接到一起以创建更高级的 Where 子句。
例子:
Select * From students Where name=”影子” And number>100
返回name为影子number大于100的列表。
例子:
Select * From students Where name=”影子” And (number>100 Or number<50)
返回name为影子,number大于100或者小于50的列表。

Where 子句中用到的操作符
操作符 功能
< 小于
<= 小于或等于
> 大于
>= 大于或等于
= 等于
<> 不等于
Between 在某个取值范围内
Like 匹配某个模式
In 包含在某个值列表中
SQL中的等于和不等于等操作符与VB中的意义和使用相同

例子:
(1).Between 操作符
Use cust
Select * From students
Where number Between 1 and 100
Between 操作符返回的是位于所说明的界限之内的所有记录值。这个例子就返回 number 字段 1 到 100 之间的全部记录。

(2). Like 操作符和通配符
Use cust
Select * From students
Where name Like “%影%”
Like 操作符把记录匹配到你说明的某个模式。这个例子是返回含“影”的任意字符串。

四种通配符的含义
通配符 描述
% 代表零个或者多个任意字符
_(下划线) 代表一个任意字符
[] 指定范围内的任意单个字符
[^] 不在指定范围内的任意单个字符

全部示例子如下:
Like “BR%” 返回以”BR”开始的任意字符串
Like “br%” 返回以”Br”开始的任意字符串
Like “%een” 返回以”een”结束的任意字符串
Like “%en%” 返回包含”en”的任意字符串
Like “_en” 返回以”en”结束的三个字符串
Like “[CK]%” 返回以”C”或者”K”开始的任意字符串
Like “[S-V]ing” 返回长为四个字符的字符串,结尾是”ing”,开始是从S到V。
Like “M[^c]%” 返回以”M”开始且第二个字符不是”c”的任意字符串。

4. 使用 Order By 对结果排序
Order By 子句告诉数据库引擎对其检索的记录进行排序。可以对任何字段排序,或者对多个字段排序,并且可以以升序或隆序进行排序。
在一个正式的 Select 查询之后包含一个 Order By 子句,后跟想排序的字段(可以有多个)便可以说明一个排序顺序。
例子:
Use cust
Select * From students
Where name Like “%影%”
Order By number
对返回的结果按 number 进行排序。

以降序排序
如要以隆序排序,只需在排序的字段之后使用 Desc 关键字。
例子:
Use cust
Select * From students
Where name Like “%影%”
Order By number Desc

5. 使用 Top 显示某个范围的第一个记录或最后一个记录。
使用 Top 关键字可以只显示一个大记录前面或后面的少数几个记录。在查询中,Top 关键字与排序子句一起把结果集限制为少数几个记录或按某个百分比显示整个结果记录集合中的一部分。
例子:
Select Top 3 * From students 返回 students 表中的前3条记录
Select Top 10 Percent * From students 返回 students 表中前面的10%个记录
Select Top 3 * From students Order By number desc 返回 students 表中 number 最大的(最后)的3条记录

6. 用 As 对字段名进行别名化
为什么在查询中对字段命以别名,或重新命名,这样做的原因有两个:
☆所涉及的表的字段名很长,想使字段在结果集中更易处理一些。
☆创建的查询产生了某些计算或合计列,需要对之进行命名。
不管是什么原因对字段命以别名,在 SQL 中都可以容易地使用 As 子句做得。
例子:
Select number As 学号 ,name As 姓名 From students

7. 合并查询
合并查询( Union Query )用于合并具有相同字段结构的两个表的内容,如果想在一个结果集中显示多个记录源中的不相关的记录时,这十分有用。
例子:
Select *
From students
Union
Select *
From students1
该查询结果集把 students 和 students1 中的记录合并到一个结果中,其输出就和原表归档之前一模一样。
注意:缺省情况下,合并查询不会返回重复记录(如果记录归档系统在把记录拷到归档表中后不将相应的记录删除,这时该功能就有用了),可以加上 All 关键字而让合并查询显示重复记录。
例子:
Select *
From students
Union All
Select *
From students1
该合并查询显示 students 表和 students1 表的内容时,没有对重复记录进行处理
补充:
Union 运算符允许把两个或者多个查询结果合并到一个查询结果集中。如果比较 Union 和 Join 两咱运算符,那么 Union 运算符增加行的数量,而 Join 运算符增加列的数量。使用 Union 时应该注意,两个结果中的列的结构必须匹配,数据类型必须兼容等等。
Union 运算符的语法形式如下:
Select select_list
From clause
Where clause
Group By clause
Having clause
Union [All]
Select select_list
From clause
Where clause
Group By clause
Having clause
Order By clause
Compute clause
对于 Union 运算符,有下列几点需要说明:
·在默认情况下,Union 运算符删除全部冗余行。如果使用All 选项,那么冗余行不删除。
·在 Union 语句中的全部 select_list 必须有相同数量的列、兼容的数据类型并且按照同样的顺序出现。
·在结果集中,列名来自第一个 Select 语句。

8.连接查询
在实际使用过程中经常需要同时从两个表或者两个以上表中检索数据。连接就是允许同时从两个表或者两个以上表中检索数据,指定这些表中某个或者某些列作为连接条件。在 SQL Server 中,可以使用两种连接语法形式,一种是 Ansi 连接语法形式,这是连接用在 From 子句中,另外一种是 SQL Server 连接语句形式,这是连接用在 Where 子句中。
Ansi 连接语法形式如下:
Select table_name.column_name,table_name.column_name,…
From {table_name [join_type] Join table_name On search_conditions}
Where [search_conditions]
在 Ansi 语法形式中,可以 Ansi 连接关键字来确定使用的连接形式。例如:
☆使用 Inner Join 关键字,结果集中仅包含满足条件的行。
☆使用 Cross Join 关键字,结果集中包含两个表中所有行的组合。
☆使用 Outer Join 关键字,结果集中既包含那些满足条件的行,还包含那些其中某个表的全部行。
SQL Server 连接语法形式如下所示:
Select table_name.column_name,table_name.column_name,…
From [table_name,tab

摘要

本文讨论了Visual Basic应用程序访问SQL Server数据的几中常用的方法,分别说明了每种方法的内部机理并给出了每种方法的一个简单的实例,最后比较了每种方法的

性能和优缺点。

引言

Microsoft Visual Basic(简称VB)作为一种面向对象的可视化编程工具,具有简单易学的,灵活方便和易于扩充的特点。而且Microsoft为其提供了与SQL Server通信的API函数集及工具集。因此它越来越多地用作大型公司数据和客户机—服务器应用程序的前端。与后端的Microsoft SQL Server相结合,VB能够提供一个鲁棒的、高性能的客户机—服务器方案。

使用Visual Basic作为前端开发语言,与SQL Server接口有三种常用的方法,即:
*数据访问对象/Jet
*为ODBC API编程
*使用SQL Server的Visual Basic库(VBSQL)为DB库API编程
本文将讨论这三种VB应用程序管理SQL Server数据的方法,并比较每种方法的性
能和优缺点。

方法1.数据访问对象/JetVisual Basic支持Data Access Objects(DAOs)的子集。DAO的方法虽然不是性能最好的管理客户机—服务器之间的对话方式,但它确有许多优点。使用DAOs访问SQL Server的过程如下:应用程序准备好语句并送至Jet,Jet引擎(MASJT200.DLL)优化查询,载入驱动程序管理器并与之通讯,驱动程序管理器(ODBC.DLL)通地调用驱动器(SQLSRVR.DLL)的函数,实现连接到数据源,翻译并向SQL Server提交SQL语句且返回结果。下面是一个用DAOs访问SQL Server的VB实例。

‘Form Declarations
Dim mydb As Database
Dim mydynaset As Dynaset
Private Sub Form_Load()
Set mydb=OpenDatabase(“”,Fa|se,Fa|se,”ODBC;DSN=Myserver;WSID=LCL;DATABASE=sa|es”)
Set mydynaset=mydb CreateDynaset(“Select*from Customers”)
End Sub

上述例子是以非独占、非只读方式打开sales数据库,并检索Customers表中的所有字段。OpenDatabase函数的最后一个参数是ODBC连接字符串参数,它指明了Microsoft Access连接到SQL Server所需要知道的一些内容。其中“DSN”为数据源名,“WSID”为工作站名,

“DATABASE”为所要访问的数据库名。

方法2.用ODBC API编程

ODBC(Open Database Connectivity)的思想是访问异种数据库的一种可移植的方式。与数据资源对话的公用函数组装在一个称为驱动程序管理器(ODBC.DLL)的动态连接中。应用程序调用驱动程序管理器中的函数,而驱动程序管理器反过来通过驱动器反过来通来驱动器(SQLSRVR.DLL)把它们送到服务器中。用ODBC API编程,一般要用到以下一些函数。下面列出了常用的函数以及它们的功能。
函数 功能
SQLALLocEnv 初始化ODBC环境,返回环境句柄
SQLALLocConnect 为连接句柄分配内存并返回连接句柄
SQLConnect 连接一个SQL数据资源
SQLDriverConnect 连接一个SQL数据资源,允许驱动器向用户询问信息
SQLALLocStmt 为语句句柄分配内存并返回语句句柄
SQLExecDirect 把SQL语句送到服务器
SQLFetchAdvances 到结果集的下一行(或第一行)
SQLGetData 从结果集的特定的一列取回数据
SQLFreeStmt 释放与语句句柄相关的资源
SQLDisconnect 切断连接
SQLFreeConnect 释放与连接句柄相关的资源
SQLFreeEnv 释放与环境句柄相关的资源
下面的代码使用上面一些函数先登录到一个服务器数据库,并为随后的工作设置了语句
句柄。
Global giHEnv As Long
Global giHDB As Long
Global giHStmt As Long
Dim myResult As integer
Dim myConnection As Srting
Dim myBuff As String*256
Dim myBufflen As Integer
If SQLA||ocEnv(giHEnv)<>SQL_SUCCESS Then
MsgBox”A||ocation couldn’t happen!”
End if
if SQL||ocConnect(giHEnv,giHDB)<>SQL_SUCCESS Then
MsgBox “SQL Server couldn’t connect!”
End if
myConnection=”DSN=myServer;UID=|c|;PWD=;APP=ODBCTest;WS|D=LCL;DATABASE=sales”
myResult=SQLDriverConnect(giHDB,Test,form1.hWnd,myConnection.len(myConnection),
myBuff,256,myBufflen,SQL_DRIVER_COMPLETE_REQUIED)
myResult=SQLA||ocStmt(giHDS,giHStmt)
myResult=SQLFreeStmt(giHStmt,SQL_COLSE)
rsSQL=”Select*from Customers Where City=”Wuhan”"
myResult=SQLExecDirect(giHStmt,rsSQL,Len(rsSQL))

方法3.使用VBSQL对DB库API编程

DB库是SQL Server的本地API,SQL Server的Visual Basic库(VBSQL)为Visual Basic程序员提供API。从一定意义上说,VBSQL是连接Visual Basic程序到SQL Server的性能最好最直接的方式。VBSQL包含以下三个文件:

VBSQL.VBX 包含库函数,具有访问重要的消息和处理错误的能力
VBSQL.BI 包括所有的常量和变量说明
VBSQL.HLP Windows帮助文件,使用VBSQL的指南
使用VBSQL时,必需将VBSQL.BI加入到Visual Basic工程文件中,并确保VB程序运行时有
VBSQL.VBX文件。
一个典型的VBSQL对话中,一般要用到以下这些函数。
函数 功能
Sqllnit 在客户机上装载DB库
SqlOpenConnection 打开服务器连接,返回连接句柄
SqlCmd 在客户机上建立批处理命令
SqlExec 向服务器提交批处理命令
Sqlrexu|ts 把客户机定位在第一条(或下一条)结果集的开端
SqlNextRow 驱动每个结果集的行之间的循环
SqlData 访问一个特定列的数据
SqlC|ose 切断特定的连接
SqlExit 切断所有找开的连接
SqlWinExit 卸下DB库
一般的DB库API编程的过程是这样的:先通过调用SqlInit对DB库进行初始化,再调用
SqlConnection打开一个连接,然后就可做一些工作。下面的代码是一个初始化DB库并
登录到服务器的通用例程。
Private Sub |nitia|izeApp|ication()
DBL|B-VERS|ON=Sq||nit()
|f DBL|B_VERS|ON=”"Then
MsgBox”Could not initia|ize DBL|B!Exit app|ication.”, MB_|CONEXCLAMAT|ON
End
End if
End Sub
Private Function LoginToServer() As integer
loginToServer=SUCCEED
Status%=Sq|SetloginTime%(loginTimeOut)
|f giSq|Conn<>0 Then
Sq|C|ose(giSq|Conn) ‘关闭已打开的连接
giSq|Conn=Sq|OpenConnection(gsServerName,gsLogin|D,gsPassword,Progr amName,ProgramName)
|f giSq|Conn<>o Then
|iresu|t=Sq|Use(giSq|Conn,”Sales”)
Else
LogintoServer=FA|L
End |f
End Function

性能比较

以上三种访问SQL Server的方法各有各的特点。DAOs方法是基于对象的,因而便于使用,但是它从Visual Basic到SQL Server的最慢的方式。ODBC API和VBSQL方法从本质上讲是基于程序的。ODBC API方法通用性好,允许最强的互操作性,编程简单,但速度慢于VBSQL方法。VBSQL方法通过VBSQL控件,提供了重要的SQL` Server前端应用程序所需的灵活性、强大功能和良好性能。它具有真正的事件驱动及错误处理能力,完全支持异步处理、游标和计算列等。这些都是VBSQL方法超出其它方法的优势,但其编程稍复杂。至于实际使用哪一种接口方式,在很大程度上依赖于用户的应用程序的具体情况而定。

2004年10月28日

熟悉SQL SERVER 2000的数据库管理员都知道,其DTS可以进行数据的导入导出,其实,我们也可以使用Transact-SQL语句进行导入导出操作。在Transact-SQL语句中,我们主要使用OpenDataSource函数、OPENROWSET 函数,关于函数的详细说明,请参考SQL联机帮助。利用下述方法,可以十分容易地实现SQL SERVERACCESSEXCEL数据转换,详细说明如下:

?

一、?????????? SQL SERVER ACCESS的数据导入导出

常规的数据导入导出:

使用DTS向导迁移你的Access数据到SQL Server,你可以使用这些步骤:

  1在SQL SERVER企业管理器中的Tools(工具)菜单上,选择Data Transformation

  2Services(数据转换服务),然后选择? czdImport Data(导入数据)。

  3在Choose a Data Source(选择数据源)对话框中选择Microsoft Access as the Source,然后键入你的.mdb数据库(.mdb文件扩展名)的文件名或通过浏览寻找该文件。

  4在Choose a Destination(选择目标)对话框中,选择Microsoft OLE DB Prov ider for SQL Server,选择数据库服务器,然后单击必要的验证方式。

  5在Specify Table Copy(指定表格复制)或Query(查询)对话框中,单击Copy tables(复制表格)。

6在Select Source Tables(选择源表格)对话框中,单击Select All(全部选定)。下一步,完成。

?

Transact-SQL语句进行导入导出:

1.???????? SQL SERVER里查询access数据:

– ======================================================

SELECT *

FROM OpenDataSource( ‘Microsoft.Jet.OLEDB.4.0′,

‘Data Source=”c:\DB.mdb”;User ID=Admin;Password=’)…表名

————————————————————————————————-

?

2.???????? access导入SQL server

– ======================================================

SQL SERVER 里运行:

SELECT *

INTO newtable

FROM OPENDATASOURCE (‘Microsoft.Jet.OLEDB.4.0′,

????? ‘Data Source=”c:\DB.mdb”;User ID=Admin;Password=’ )…表名

————————————————————————————————-

?

3.???????? SQL SERVER表里的数据插入到Access表中

– ======================================================

SQL SERVER 里运行:

insert into OpenDataSource( ‘Microsoft.Jet.OLEDB.4.0′,

? ‘Data Source=” c:\DB.mdb”;User ID=Admin;Password=’)…表名

(列名1,列名2)

select 列名1,列名2 ?from ?sql

?

实例:

insert into? OPENROWSET(‘Microsoft.Jet.OLEDB.4.0′,

?? ‘C:\db.mdb’;'admin’;”, Test)

select id,name from Test

?

?

INSERT INTO OPENROWSET(‘Microsoft.Jet.OLEDB.4.0′, ‘c:\trade.mdb’; ‘admin’; ”, 表名)

SELECT *

FROM sqltablename

————————————————————————————————-

?

?

?

?

?

二、?????????? SQL SERVER EXCEL的数据导入导出

?

1、在SQL SERVER里查询Excel数据:

– ======================================================

SELECT *

FROM OpenDataSource( ‘Microsoft.Jet.OLEDB.4.0′,

‘Data Source=”c:\book1.xls”;User ID=Admin;Password=;Extended properties=Excel 5.0′)…[Sheet1$]

?

下面是个查询的示例,它通过用于 Jet OLE DB 提供程序查询 Excel 电子表格。

SELECT * 
FROM OpenDataSource ( 'Microsoft.Jet.OLEDB.4.0',
? 'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions

————————————————————————————————-

?

2、将Excel的数据导入SQL server :

– ======================================================

SELECT * into newtable

FROM OpenDataSource( ‘Microsoft.Jet.OLEDB.4.0′,

? ‘Data Source=”c:\book1.xls”;User ID=Admin;Password=;Extended properties=Excel 5.0′)…[Sheet1$]

?

实例:

SELECT * into newtable

FROM OpenDataSource( ‘Microsoft.Jet.OLEDB.4.0′,

? ‘Data Source=”c:\Finance\account.xls”;User ID=Admin;Password=;Extended properties=Excel 5.0′)…xactions

————————————————————————————————-

?

3、将SQL SERVER中查询到的数据导成一个Excel文件

– ======================================================

T-SQL代码:

EXEC master..xp_cmdshell ‘bcp 库名.dbo.表名out c:\Temp.xls -c -q -S”servername” -U”sa” -P”"‘

参数:S SQL服务器名;U是用户;P是密码

说明:还可以导出文本文件等多种格式

?

实例:EXEC master..xp_cmdshell ‘bcp saletesttmp.dbo.CusAccount out c:\temp1.xls -c -q -S”pmserver” -U”sa” -P”sa”‘

?

?EXEC master..xp_cmdshell ‘bcp “SELECT au_fname, au_lname FROM pubs..authors ORDER BY au_lname” queryout C:\ authors.xls -c -Sservername -Usa -Ppassword’

?

VB6中应用ADO导出EXCEL文件代码:

Dim cn? As New ADODB.Connection

cn.open “Driver={SQL Server};Server=WEBSVR;DataBase=WebMis;UID=sa;WD=123;”

cn.execute “master..xp_cmdshell ‘bcp “SELECT col1, col2 FROM 库名.dbo.表名” queryout E:\DT.xls -c -Sservername -Usa -Ppassword’”

————————————————————————————————-

?

4、在SQL SERVER里往Excel插入数据:

– ======================================================

insert into OpenDataSource( ‘Microsoft.Jet.OLEDB.4.0′,

‘Data Source=”c:\Temp.xls”;User ID=Admin;Password=;Extended properties=Excel 5.0′)…table1 (A1,A2,A3) values (1,2,3)

?

T-SQL代码:

INSERT INTO?

?OPENDATASOURCE(‘Microsoft.JET.OLEDB.4.0′,?

?‘Extended Properties=Excel 8.0;Data source=C:\training\inventur.xls’)…[Filiale1$]?

?(bestand, produkt) VALUES (20, ‘Test’)?

————————————————————————————————-

总结:利用以上语句,我们可以方便地将SQL SERVERACCESSEXCEL电子表格软件中的数据进行转换,为我们提供了极大方便!

2004年10月26日

NAT是网络地址翻译就是把公网IP翻译成私有地址, 又叫端口映射或端口转发. 采用路由方式是指ADSL拥有一个动态或固定的公网IP,ADSL直接接在HUB或交换机上,所有的电脑共享上网。这时ADSL的外部地址只有一个,比如61.177.*.*。 而内部的IP是人为设置的,比如ADSL设为192.168.0.1,下面的电脑就依次设为192.168.0.*(*表示1,2,3,…)。  
????如何实现NAT功能呢?一般路由器中有个虚拟服务器的设置。针对邮件服务器要做如下设置:进入“虚拟服务器”,在端口填入 25, 协议中选择: TCP, IP地址:192.168.16.x(安装邮件服务器电脑的局域网IP地址),同样方法设置110(pop3),6080(webmail)端口
  另一种方法就是开放主机。开放主机(DMZ Host)是针对IP地址,取消防火墙的功能,将该局域网的IP地址直接映射到外部IP之上,采用开放主机(DMZ)的方式,不必管端口是多少。这种方式只支持一台内部电脑。

使用 ADSL 端口映射 + 动态域名 + Winmail 让您轻松架设邮件系统!

几款ADSL Modem的端口映射做法
以在内部pc 192.168.1.2 上架设 mail server 为例,mail server 的 SMTP 默认端口是25.

?阿尔卡特 SpeedTouch HomePlus511 中设置端口映射
?进入ADSL的Web设置页面, 在左边的菜单中点“Advanced”/”NAT”
?进入NAT的设置界面后,点右边的New创建新的端口映射
???Protocol选Tcp,Inside IP填192.168.1.2,Outside IP填0.0.0.0
???Inside Port和Outside IP都填成 25
?按Apply确认。
?设置的 25 端口映射就出现在NAPT Settings下方。
?点左上角的Save All保存设置,否则Modem的NAT会自动清空,还要再进行设置。

? 阿尔卡特Speed Touch 515 设置端口映射
?先进入Modem的Web设置页面。
?打开左边的“Configuration”菜单,点击“Security”项。
?点击右下方格中的“Configure NAT to internal interfaces”。
?点击中间的“Configure Global Address Pools and Reserved Mappings”。
?点击第四项“Add Reserved Mappings”
??“Global IP Address”(公网IP)填上“0.0.0.0”。
??“internal IP Address”(内网IP)填上你的PC内网IP(192.168.1.2)
??“Transport”(网络协议)选“TCP”。
??“Port Number”(端口)填上 smtp 的端口(25)。
?点击“Apply”保存数据。
?点击左边菜单中的“Save Config”保存设置。

?华硕6000EV/6005HW ADSL MODEM中设置端口映射
?在主菜单中点“NAT”,会有个“nat channel list”,设置如下:
?在nat channel list里面的mupltiple port forwarding里面填写以下内容:
?action: add
?channel no:1
?protocol:tcp
?incoming port, begin:25, end :25
?new port begin:25,end :25
?new ip address:192.168.1.2
?保存设置

?LINKSYS ADSL路由器中中设置端口映射
?在主菜单中点“advanced”,接下来的菜单中有个“forwarding”,设置如下:
?extport: 25 to 25
?ip address:192.168.1.2
?然后点击“apply”就可以了。

?宽频蓝色小精灵路由器中设置端口映射
?在高级设置页面下点“Distributed Servers Setup(Virtual Serves,虚拟主机设置)”
?每个Virtual Server 定义为一个Service Port,所有对这个端口的访问都会重定向到相应的Service
?IP 所对应的计算机。
?Service Service Port Service IP Enable
?Email 25 192.168.1.2 √

?IM 701G 艾玛白色 ADSL Modem 设置端口映射
?进入ADSL设置,—-安全设置—-NAT的高级配置…—-增加Reserved Mapping…
?增加25 端口映射,
?如下所示:
???Global IP地址 内部的IP地址 传输类型 端口号
???和接口地址相同 192.168.1.2 tcp ??????25
?保存—-重启设备

?合勤642 Adsl Modem设置端口映射
?在运行里或MSdos窗口里输入 telnet 192.168.1.1, 输入密码(缺省值为1234)后即可进入ZyNOS系统
?进入Menu 11.1 – Remote Node Profile
?将 Edit Filter Sets= No 用空格键改为YES后,进入Menu 11.5 – Remote Node Filter菜单
?将protocol filters=6 用空格键去掉后回车存盘返回后 Edit Filter Sets= No 不要管它,回车存盘
?在Mail Menu 设置15. SUA Server Setup
? ?? Port # IP Address
? ?? —— —————
? ?? 1.25 192.168.1.2
?回车存盘

?实达 ADSL 2110EH 设置端口映射
?在IE中用http://192.168.10.1进入 实达ADSL2110EH ROUTER 管理配置页面
?选择Services——NAT Rule Configuration——NAT——NAT Options:NAT Rule Entry——Add——进入端口映射添加设置页面
?SMTP 端口映射设置参数如下:
???Rule ID:  2 
???Rule Flavor:  RDR 
???IF Name:  ALL 
???Protocol:  ANY 
???Local Address From:  192.168.1.2 (内网IP)
???Local Address To:  192.168.1.2 (内网IP)
???Global Address From:  0.0.0.0
???Global Address To:  0.0.0.0
???Destination Port From: 25
???Destination Port To:  25
???Local Port:  25
?设置完后,选择 Submit 提交
?选择Admin——Commit & Reboot——重启Modem。

?全创1100白色 ADSL MODEM中设置端口映射
?IE地址栏里输入 http://192.168.0.2/doc/setvs.htm
?一般默认的是用户:admin密码:12345678(或者123456)
?进入虚拟服务器设置
?“公共端口”、“私有端口”都填上要做的端口(25)
?“端口类型”选“TCP”。
?“主机IP地址”填自己PC的内网IP (192.168.1.2)。然后按一下“添加此设置”。
?IE地址栏里输入 192.168.0.2 进入主界面,点击“保存设置”,ADSL会重启

?大亚DB108和102设置端口映射
?IE地址栏里输入 http://192.168.1.1/doc/index1.htm
?进入虚拟服务器设置
?添加内网IP, 端口为25
?提交保存

?亨威科技留的 Super-Way NSM ADSL 请参考 http://www.superway-tech.com/ibook/

?动态主机的网站有些相关资料, 请参考 http://china.sharella.com/support/kbandfaqs/

2004年10月18日

在 Microsoft? SQL Server? 实例上创建 OLE 对象实例。

语法

sp_OACreate progid, | clsid,
????objecttoken OUTPUT
????[ , context ]

参数

progid

是要创建的 OLE 对象的程序标识符 (ProgID)。此字符串描述该 OLE 对象的类,其形式如下:

OLEComponent.Object

OLEComponent 是 OLE 自动化服务器的组件名称,Object 是 OLE 对象名。指定的 OLE 对象必须有效并且必须支持 IDispatch 接口。

例如,SQLDMO.SQLServer 是 SQL-DMO SQLServer 对象的 ProgID。SQL-DMO 的组件名称为 SQLDMO,SQLServer 对象是有效的,并且同所有 SQL-DMO 对象一样,SQLServer 对象支持 Idispatch

clsid

是要创建的 OLE 对象的类标识符 (CLSID)。此字符串描述该 OLE 对象的类,其形式如下:

‘{nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn}’

指定的 OLE 对象必须有效并且必须支持 IDispatch 接口。

例如,{00026BA1-0000-0000-C000-000000000046} 是 SQL-DMO SQLServer 对象的 CLSID。

objecttoken OUTPUT

是返回的对象令牌,并且必须是数据类型为 int 的局部变量。该对象令牌用于标识所创建的 OLE 对象,并将在调用其它 OLE 自动化存储过程时使用。

context

指定新创建的 OLE 对象要在其中运行的执行上下文。如果指定,那么此值必须为下列值之一:

1 = 仅为进程内 (.dll) OLE 服务器
4 = 仅为本地 (.exe) OLE 服务器
5 = 进程内 OLE 服务器和本地 OLE 服务器均可

如果未指定,其默认值为 5。此值将在调用 CoCreateInstance 时作为 dwClsContext 参数传递。

若允许使用进程内 OLE 服务器(通过使用上下文值 15 或者不指定上下文值),该服务器将可以访问 SQL Server 拥有的内存和其它资源。进程内 OLE 服务器可能会破坏 SQL Server 的内存或资源并导致不可预知的结果,如 SQL Server 访问违规。

当上下文值指定为 4 时,本地 OLE 服务器不能访问任何 SQL Server 资源,因而不能破坏 SQL Server 的内存或资源。

说明??此存储过程的参数按位置指定,而不是按名称指定。

返回代码值

0(成功)或非零数字(失败),是由 OLE 自动化对象返回的 HRESULT 的整数值。

有关 HRESULT 返回代码的更多信息,请参见 OLE 自动化返回代码和错误信息

注释

已创建的 OLE 对象在 Transact-SQL 语句批处理结束时会自动释放。

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_OACreate

示例
A. 使用 Prog ID

下面的示例通过使用 SQL-DMO SQLServer 对象的 ProgID 创建该对象。

DECLARE @object int DECLARE @hr int DECLARE @src varchar(255), @desc varchar(255) EXEC @hr = sp_OACreate 'SQLDMO.SQLServer', @object OUT IF @hr <> 0 BEGIN EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc RETURN END 
B. 使用 CLSID

下面的示例通过使用 SQL-DMO SQLServer 对象的 CLSID 创建该对象。

DECLARE @object int DECLARE @hr int DECLARE @src varchar(255), @desc varchar(255) EXEC @hr = sp_OACreate '{00026BA1-0000-0000-C000-000000000046}',  @object OUT IF @hr <> 0 BEGIN  EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT   SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc  RETURN END