VB6.0中的MSChart控件是一个功能强大的高级图表工具,拥有丰富的图表绘制功能,可显示二维和三维的棒图、区域图、线形图、饼图等多种常用图表。近日我为了在双击图表的某个区域时将与该区域相对应的数据库的内容在DataGrid控件上显示出来,遇到了许多困难,最后用一个自定义的变量SelectSeries解决了问题,具体方法如下:
设数据库名称为“学生信息”,有一Access表“学生成绩”,其内容为一个班学生的考试成绩,包括学号、姓名、成绩3个字段,成绩字段格式是字符型,值为“优”、“良”、“中”、“差”中的一个。
窗体Form1包括一个MSChart控件McScore,类型为二维饼图,用于显示每种成绩的学生数;一个ADO控件AdScore用于连接数据库;一个DataGrid控件DgScore用于以表格形式显示数据库内容。
工作过程为:双击饼图的某个区域,则DgScore显示相应成绩的学生名单。
代码如下:
Option Explicit
Dim SelectedSeries as Integer ′自定义变量
Dim Rs() as String ′提取记录集用的字符串数组
Private Sub Form_Load()
′设定DataGrid控件的数据源
DgScore.DataSource=″AdScore″
′设定ADO控件的连接字串和初始的记录源,即显示内容
AdScore.ConnectString=″Provider=Microsoft.OLEDB.3.51;Persist_Security Info=False;Data Source=学生信息″
AdScore.RecordSource=″selet * from学生成绩order by成绩″
AdScore.Refresh
′预设好提取记录用的SQL语句
Rs(1)=″select* from学生成绩where成绩=″+Chr(34)+″优″+_Chr(34)+″order by成绩″
Rs(2)=″select *from学生成绩where成绩=″+Chr(34)+″良″+_Chr(34)+″order by成绩″
Rs(3)=″select * from学生成绩where成绩=″+Chr(34)+″中″+_Chr(34)+″order by成绩″
Rs(4)=″select * from学生成绩where成绩=″+Chr(34)+″差″_Chr(34)+″order by成绩″
End Sub
Private Sub McScore_SeriesSelected(Series as Integer,MouseFlags as _Integer,Cancel as Integer)
SelectedSeries=Series
End Sub
Private Sub McScore_PointSelected(Series as Integer,DataPoint as_Integer,MouseFlags as
Integer,Cancel as Integer)
SelectedSeries=Series
End Sub
Private Sub McScore_Db1Click()
′改变ADO控件的记录源并刷新
Adoc1.RecordSource=Rs(SeletedSeries)
Adoc1.Refresh
End Sub
(湖南 高文杰)
02.txt
《 巧用CLIPBOARD建立图像数据库 》
VisualBasic中的数据控件(datacontrol)能连接众多的数据库源并且操纵简便,用来开发数据库管理应用程序,可以轻而易举地完成以前需要大量编写程序才能完成的任务。
使用其缺省数据库(Access格式)的二进制类型(Binary)字段来存放图形图像数据可建立包含图像的数据库,只是图像的格式受限制(缺省为.bmp类型)。
那么,能否在VB中建立一个不受图像格式限制的图像数据库呢?下面通过实例介绍实现方法:1.定义数据库结构用数据管理器(datamanager)建立一个包含表ImgTable的数据库Imge1.mdb。
其中表ImgTable的结构定义为:
字段名 类型
No Integer
ImgData Binary
这里,同时预先建立几个ImgData内容为空的记录,供测试用。
2.添加控件及代码
在Form1上画出标签(Label1)、按钮(Command1)、图片框(Picture1)、数据控件(Data1)各一个,属性及代码如下:
Data1DatabaseName=″C:\VB40\IMGE1MDB″
Data1RecordSource=ImgTable
Label1DataSource=ImgTable
Label1DataField=No
Picture1DataSource=ImgTable
Picture1DataField=ImgData
SubCommand1_Click()
′从Clipboard截取图像数据到图片框控件中
Picture1Picture=ClipboardGetData()
End Sub
3.往Clipboard送图像可采用各种支持Clipboard的图像编辑器,如在Photoshop上处理好图像,然后将其“拷贝”或“剪切”至Clipboard。
4.从Clipboard截取图像到数据库
切换至VB,运行Form1。用鼠标点击按钮Command1,将图像从Clipboard“粘贴”到图片框中。然后,利用数据控件将当前记录往后(或往前)滑动,图片框中的图像便自动保存至数据库中。
5.重复3、4步,利用Clipboard可建立一个不受图像格式限制的图像数据库,而且,比起字段中放置图像文件名再依此调用图像文件的方法更易管理。
另外,对于一些数据库的增加、查询、修改等操纵功能,可配合使用数据库对象(如Database、TableDef、Field、Dynaset、Snapshot等)去完成。
以上程序在VisualBasic3.0/4.0上通过。
(浙江 胡文俊)
03.txt
《 在VB中存取数据库中的图片 》
一、 数据库的设计
数据库可以采用微软的Access97或者SQL Server来进行,首先新建一张表,取名为Table,添加三个字段,分别是:姓名 Char型(SQL Server中)文本型(Access中);编号Char型(SQL Server中)文本型(Access中);照片image型(SQL Server中)OLE对象(Access中),设计好后存盘。为了可以进行远程调用,我们采用ODBC的方法进行,双击打开控制面板里的ODBC数据源,界面如图1所示:
点“系统DSN”选项卡,按“添加”按钮选择对应的数据源驱动程序Access的*.mdb或者SQL Server,依照添加向导加添加数据源,下面就可以开始程序的编写了。
二、 程序的编写
运行VB,新建一个工程。本程序采用ADO控件和动态链接库访问数据库,需要加入ADO的运行库,单击“工程\引用”菜单,出现引用对话框,选择Microsoft ActiveX Data Objects2.0 Library并确定。
添加一个Form,四个Label控件,两个TextBox控件,一个PictureBox控件,一个ADODC控件,三个CommandButton控件,一个CommandDialog控件,如果ADODC和CommandDialog控件没有出现在工具框上,请单击菜单“工程\部件”。点“控件”选项卡,在其中选中Microsoft ADO Data Control 6.0(OLEDB)和Microsoft Common Dialog Control 6.0两项按“确定”按钮。
下面是以上各个控件的一些属性:
Form1.MaxButton=False
Label1.Caption=姓名:
Label2.Caption=编号:
Label3.Name= ResName
Label3.BackColor= &H80000009&
Label3.BorderStyle=1-Fixed Single
Label3.DataField=姓名
Label3.DataSource= AdoCtr
Label4.Name= ResNumb
Label4.BackColor= &H80000009&
Label4.BorderStyle=1-Fixed Single
Label4.DataField=编号
Label4.DataSource= AdoCtr
Text1.Name= Names
Text2.Name= Numb
CommonDialog1.Name= CDlg
Adodc1.Name=AdoCtr
CommonButton1.Name=PreView
CommonButton1.Caption=预览
CommonButton2.Name=Save
CommonButton2.Caption=保存
CommonButton3.Name= Update
CommonButton3.Caption=更新
PictureBox1.Name= PicBox
PictureBox1.AutoSize=False
PictureBox1.AutoRedraw=False
PictureBox1.DataField=照片
PictureBox1.DataSource=AdpCtr
下面是程序代码:
′此工程需有Microsoft ActiveX Data Object 2.1 Library(msado15.dll)
Dim Constr As String ′ODBC路径
Dim FileName As String ′图片文件名
Const BLOCKSIZE = 4096 ′每次读写块的大小
04.txt
Access97的报表解决方案
利用OLE自动化解决ACESS97中文版报表生成器直线不能往下顺延的缺陷
ACCESS97 是一个非常优秀的数据库软件, 它不仅能充当办公自动化的桌面数据管理工具, 也是一个开发Client/Server 产品的优秀前端开发工具. 它的特点是易学易用、工具丰富、不需写大量代码就可以在很短的时间内开发出界面优美且功能强大的系统,长期以来受到广大开发者的青睐。但笔者在使用时发现其报表生成器中有一个明显不适合我国国情的缺陷,就是当设置报表DETAIL 节上的字段长度因为横向空间不够而设为自动向下顺延(Can Grow 属性为True)时,如果字段旁有竖线(国内大部分公文报表都有竖线,而国外则很少有),则竖线不能和字段一起向下顺延。使整个报表看起来不美观。这个缺陷在ACCESS2.0 和ACCESS97 中文版上都有, 而在FoxPro2.5B/3.0/5.0 下却没有。据微软技术服务部的工作人员说是由于本地化时测试不够原因所致。为此,笔者在ACCESS 内采用了OLE 自动化!
方法,将ACCESS97 查询生成的表送交EXCEL97 进行处理(分类汇总、打印、预演),较好地解决了这个问题。由于ACCESS97 和EXCEL97 的VBA 在97 版本上几乎完全兼容,在EXCEL97 下录制的宏代码只需在ACCESS 下稍加修改就行了,所以采用此方法和用内部报表生成器设计所用的时间差不多。整个工作需要下面几步:
在EXCEL97 下设计好报表的样式,包括表头、页眉、页码等,对需要自动翻转的列,在" 单元格格式设置" 下设为" 自动换行"。
在EXCEL97 下录制好当数据送入后进行的操作宏(如分类汇总、加边框线,加空行、打印输出、预演等动作)。
在ACCESS 下用VBA 语句和DAO 对象的方法将数据送入EXCEL 表内,并将EXCEL 下宏操作变成ACCESS 下的语句。
以下是ACCESS97 下的程序代码,实际应用程序界面是一个对话框屏幕(FORM), 上面有五个下拉框(Comb_) 和一个文字框(Text), 由用户选择相应的信息,然后用户按" 确定" 命令按钮执行程序。其中有些属性和方法在ACCESS2.0 下不能使用, 可采用相应的语句.
Private Sub 确认_Click()
On Error GoTo ErrorHandler
Dim stDocName As String
Dim k As Integer
stDocName = "Pqry_YEAR"
DoCmd.OpenQuery stDocName ' 从原始表内根据用户输入的信息条件运行" 生成表查询", 生成一个供打印用的表.
' 增加空记录处理-- 为了保证记录数少时也打印整张表.
If Val(Me![Comb 空行]) > 0 Then ' 如果用户输入了大于0 的数值, 表示加空行
For k = 1 To Val(Me![Comb 空行])
CurrentDb.Execute "INSERT INTO Pqry_YEAR
( 项目类) VALUES (' 空行空行空行');"
Next k
End If
Dim msgVar As Integer
' 定义EXCEL 对象变量
'------------------------------
Dim xlobj As Object
Dim xlsheetobj As Object
Dim xlrange As Object
'------------------------------
' 定义ACESS 记录集对象变量
Dim dbs As Database, rst As Recordset
Dim strSQL As String
Dim recTotal, fieldTotal As Integer ' recTotal:
表示该表内记录总数;
fieldTotal 表示字段总数
Dim i, j As Integer
i = 0
j = 0
' Return reference to current database.
Set dbs = CurrentDb ' 当前数据库
Set rst = dbs.OpenRecordset("Pqry_YEAR ") ' 选择记录集
recTotal = rst.RecordCount ' 得出记录数
fieldTotal = rst.Fields.Count ' 得出字段数
'----------------------------------
' 建立EXCEL 对象
Set xlobj = CreateObject("Excel.Application.8")
' 打开设计好的EXCEL 表--REPORT.XLS
xlobj.Workbooks.Open FileName:=pPathname & " REPORT.xls"
Set xlsheetobj = xlobj.ActiveWorkbook.Worksheets("REPORT ")
' 指向工作表
' 如果是改动过的表, 不再打开
If MsgBox(" 当前打印表格文件中已有数据,
是否需要更新?"
& Chr(13) & _
" 提示: 只有对数据进行改动后, 才需要更新.", 68)
= vbYes Then
DoCmd.Hourglass True ' 由于时间较长,
将鼠标设为沙漏形状
xlsheetobj.Rows("5:200").Select ' 选定区域
xlobj.Selection.Delete Shift:=-4162 '
注意! 原录制宏中-4162 为xlnone, 是EXCEL97 的常量, 但在ACCESS 下却不认, 只能到EXCEL 下的对象浏览器去查询对应的常数.
' 开始向EXCEL 传送数据
Do Until rst.EOF
For j = 1 To fieldTotal
xlsheetobj.cells(5 + i, j).Value = rst.Fields(j - 1)
Next j
rst.MoveNext
i = i + 1
Loop
rst.Close
'在EXCEL中调整,具体常数参见EXCEL下的对象浏览器
xlsheetobj.Range("A4:Q" & Trim(Str(recTotal + 4))).
Select ' 选定范围
'以下为设置边框线录制的宏代码,已删除了相似的语句.
xlobj.Selection.Borders(5).LineStyle = -4142
xlobj.Selection.Borders(6).LineStyle = -4142
With xlobj.Selection.Borders(7)
.LineStyle = 1
.Weight = -4138
.ColorIndex = -4105
End With
With xlobj.Selection
' 确定是合计在表上还是在表尾
If Me![Fram 位置] = 1 Then
.Subtotal GroupBy:=2, Function:=-4157,
TotalList:=Array(6, 9, 10, _
11, 12, 13, 14, 15, 16), Replace:=True,
PageBreaks:=False, _
SummaryBelowData:=False
Else
.Subtotal GroupBy:=2, Function:=-4157,
TotalList:=Array
(6, 9, 10, _
11, 12, 13, 14, 15, 16), Replace:=True,
PageBreaks:=False, _
SummaryBelowData:=True
End If
End With
' 根据用户的选择设置页眉和页尾。
With xlsheetobj.PageSetup
.LeftHeader = "" & Chr(10) & "" & Chr(10) & "
" & Mid(Me![Cmbo 单位], 4)
.CenterHeader = "&"" 宋体, 加粗""&18 " & Me!
[Cmbo 年度] & " 年" & Mid(Me![Cmbo 类别], 4) & "XXX 表"
End With
xlsheetobj.Range("A1").Select
' 将空行内容清掉
k = Val(Me![Comb 空行])
If Val(Me![Comb 空行]) > 0 Then
Dim content As String
i = 5
content = xlsheetobj.cells(i, 2).formulaR1C1
Do While InStr(1, content, " 空行空行空行") = 0
i = i + 1
content = xlsheetobj.cells(i, 2).formulaR1C1
Loop
xlsheetobj.Range("B" & Trim(Str(i - k + 5)) & ":" & "Q"
& Trim(Str(i + 5))).Select
xlobj.Selection.ClearContents
xlsheetobj.Range("A1").Select
End If
Else ' 不更新
xlsheetobj.Activate
End If
xlobj.ActiveWindow.SelectedSheets.PrintPreview ' 预演报表
' 如为打印:xlobj.ActiveWindow.SelectedSheets.PrintOut
DoCmd.Hourglass False ' 恢复鼠标形状
xlobj.Visible = True ' 让EXCEL 可见
清除对象变量空间,节省内存
Set dbs = Nothing
Set xlobj = Nothing
xlobj.quit ' 关闭EXCEL
Exit Sub
ErrorHandler: ' 出错处理
DoCmd.Hourglass False
MsgBox "Error number " & Err.Number & ": " & Err.Description
' Resume with statement following occurrence of error.
Resume Next
End Sub
通过这个例子我们看到在OFFICE97 下利用OLE 自动化扩展应用程序的功能是多么方便和强大。用EXCEL 完成的报表的优点是格式美观, 修改方便. 缺点是第一次生成EXCEL 表格时速度较慢.
本例是用EXCEL 对数据进行报表操作, 其实也可参照此例的方法在EXCEL 上建立图形统计、财务分析、数据透视表分析等应用程序,只要在EXCEL 下录制相应的宏,再加到ACCESS 下就行了。
05.txt
Access下如何使用通用对话框
作者:王樵民 王利峰
很多用ACCEE97开发过数据库的用户都有这种体会:要想在窗体中添加一个命令按钮实现打开通用对话框的功能真是很困难。因为ACCESS97本身并未提供这类控件,所以必须通过编写有关的宏才能实现该功能,但是编写出的宏限制很多,比如:在选择文件类型时不能同时存在多种文件格式,必须预定义好某一种格式等等。
因为该控件存放于VB6中,所以具体使用方法和在VB中类似。
其他控件 Microsoft Common Dialog Control,Version 6.0
在窗体上形成对话框控件
修改控件的名称如:Dialog1
设置其属性:在对话框上单击右键 CommonDialog 对象的属性弹出属性对话框(如下图)。可以看到,属性页的内容包括“打开/另存为”、“颜色”、“字体”、“打印”和“帮助”五组选项。可以根据提示在属性页中直接进行属性设置,也可通过编程来设置这些属性。
下面分别对各组选项加以说明:
A、“打开/另存为”:
对话框标题是“打开/另存为”窗体的标题,如打开文件时可输入“打开文件”,另存文件时可输入“保存文件”。文件名称是要打开/另存文件的默认值,一般打开/另存时此处为空。初始化路径是打开/另存文件的默认路径,一般为空。过滤器是用来在“打开/另存为”处理中,通过对该属性的设置来控制文件的类型。其设置方法为ACCESS文件|*.mdb|文本文件|*.txt|所有文件|*.*
B、颜色
C、字体
D、打印
E、帮助
过滤器属性的设置方法:
Dialog1.filter = “ACCESS文件|*.mdb|文本文件|*.txt|所有文件|*.*”
通过FileName属性获取选定的文件名。
常用对话框控件属性及方法表
属性
说明
Copies
要打印的份数
FromPage
打印的起始页
ToPage
打印的结束页
Hdc
选定打印机的设备上下文
方法
说明
ShowOpen
打开
ShowSave
另存为
ShowColor
颜色
ShowFont
字体
ShowPrinter
打印
ShowHelp
调用Windows “帮助”
例:打开文件对话框的命令如下:
dim filename1 As String
Dialog1.showopen 显示打开文件对话框
Filename1= Dialog1.filename 获取所选择的文件名
例:打开保存文件对话框的命令如下:
dim filename1 As String
Dialog1.showsave 显示保存文件对话框
Filename1=Dialog1.filename 获取所选择的文件名
其它几种对话框的打开方式与上面的方法相同,值得一提的是可以通过该控件控制打印机的使用,非常方便。
06.txt
ADO简介
简介
ActiveX Data Objects (ADO) 是微软最新的数据访问技术。它被设计用来同新的数据访问层OLE DB Provider一起协同工作,以提供通用数据访问(Universal Data Access)。OLE DB是一个低层的数据访问接口,用它可以访问各种数据源,包括传统的关系型数据库,以及电子邮件系统及自定义的商业对象。
ADO向我们提供了一个熟悉的,高层的对OLE DB的Automation封装接口。对那些熟悉RDO的程序员来说,你可以把OLE DB比作是ODBC驱动程序。如同RDO对象是ODBC驱动程序接口一样,ADO对象是OLE DB的接口;如同不同的数据库系统需要它们自己的ODBC驱动程序一样,不同的数据源要求它们自己的OLE DB提供者(OLE DB provider)。目前,虽然OLE DB提供者比较少,但微软正积极推广该技术,并打算用OLE DB取代ODBC。
ADO向VB程序员提供了很多好处。包括易于使用,熟悉的界面,高速度以及较低的内存占用(已实现ADO2.0的Msado15.dll需要占用342K内存,比RDO的Msrdo20.dll的368K略小,大约是DAO3.5的Dao350.dll所占内存的60%)。同传统的数据对象层次(DAO和RDO)不同,ADO可以独立创建。因此你可以只创建一个"Connection"对象,但是可以有多个,独立的"Recordset"对象来使用它。ADO针对客户/服务器以及WEB应用程序作了优化。
本文的目的是带你进入ADO广阔的世界并开始使用它。
在哪里能得到ADO?
目前ADO1.5版已经可以从微软网站免费下载。到目前为止,微软网站仍是你获取有关ADO最新信息的最佳场所。ADO1.5是作为OLE DB SDK的一部分提供的。你可以从下面这个网址下载:
http://www.microsoft.com/data/oledb/download.htm
在下载之前请先确认OLE DB SDK提供的各项特性。下载文件大约有15M,如果完全安装的话要占用80M的硬盘空间。如果你只对ADO感举趣,就选择最小安装,这样只会占用你15M的硬盘空间。关于ADO的网页在:
http://www.microsoft.com/data/ado/adoinfo.htm.
在这里你可以找到许多关于ADO的示例代码和文章,尤其是在"Workshop"系列的文章中。你也可以从本站下载ADO2.5的帮助文件。
尽管OLE DB SDK提供自己的ADO帮助文件,你会发现ADO1.0的帮助文件更易于使用。同时它还向你提供ADO对象模型的图示
ADO是如何组织起来的?
以前的对象模型,如DAO和RDO是层次型的。也就是说一个较低的数据对象如Recordset是几个较高层次的对象,如Environment和QueryDef,的子对象。在创建一个QueryDef对象的实例之前,你不能创建DAO Recordset对象的实例。但ADO却不同,它定义了一组平面型顶级对象.
最重要的三个ADO对象是Connection, Recordset和Command. 本文将主要介绍Connection和Recordset这两个对象。每个Connection的属性定义了与数据源的连接。Recordset对象接收来自数据源的数据。Recordset可以与Connection一起起使用,先建立一个连接,然后获取数据。尽管如此,Recordset也可以被单独创建,其Connection参数可以在Open属性定义。
如何使用ADO?
一旦安装了ADO,在VB的工程->引用对话框中你就可以看到象下图所示的东西了:
选择 "ActiveX Data Objects 1.5 Library" (ADODB).在其下的 "ADO Recordset 1.5 Library"是一个客户端的版本(ADOR),它定义了有聚的数据访问对象。ADOR 对于客户端的数据访问来说是足够的了,因为你不需要Connection对象来建立与远程数据源的联系。
如果你想要访问更多的外部数据源,你需要安装这些外部数据源自己的OLE DB Provider,就象你需要为新的数据库系统安装新的ODBC驱动程序一样。如果该外部数据源没有自己的OLE DB Provider,你就得使用OLE DB SDK来自己为这个外部数据源创建一个OLE DB Provider了。这已不是本文讨论的范围了。
示例
下面的示例代码以Northwinds数据库作为远程数据源,然后用ADO来访问它。首先在控制面板中打开“32位数据源”,单击“添加”按钮。在弹出的对话框中选择 "Microsoft Access Driver (*.mdb)" 作为数据源驱动程序。
然后按下图所示,在对话框中填写下面的内容
选择数据库Northwinds所在路径。单击完成,退出ODBC设备管理器。
启动一个新的VB工程,在窗体的Load事件中输入下面的代码:
Private Sub Form_Load()
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
'Set Connection properties
cn.ConnectionString = "DSN=RDC Nwind;UID=;PWD=;"
cn.ConnectionTimeout = 30
cn.Open
If cn.State = adStateOpen Then _
MsgBox "Connection to NorthWind Successful!"
cn.Close
End Sub
按F5运行程序,看看,一个消息框弹出来告诉你连接成功了。请注意,这里我特别注明了是ADODB.Connection,而不是ADOR.Connection,这样做是为了将二者区分开(如果你引用了ADODB和ADOR的话,这样做很有必要)。连接字符串看上去同RDO的连接字符串差不多。事实上,二者确实差不多。
如果我们要访问一个SQL server数据库,你的Connection代码看上去应象下面所示:
'设置连接属性cn.Provider = "MSDASQL"
cn.ConnectionString = "driver={SQL Server};" & "server=prod1;uid=bg;pwd=;database=main"
cn.Open
"Provider"属性指向SQL Server的OLE DB Provider.
回到我们的示例程序,让我们创建一个Recordset对象来访问“Orders”表,并从该表的"ShipCountry"字段中产生头十个不重复的国家名。修改窗体Load事件中的代码,让它看上去象下面这样。
Private Sub Form_Load()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sSQL As String
Dim sOut As String
Dim Count As Integer
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
' Set properties of the Connection.
cn.ConnectionString = "DSN=RDC Nwind;UID=;PWD=;"
cn.ConnectionTimeout = 30
cn.Open
If cn.State = adStateOpen Then _
MsgBox "Connection to NorthWind Successful!"
sSQL = "SELECT DISTINCT Orders.ShipCountry FROM Orders"
Set rs = cn.Execute(sSQL)
'Enumerate the recordset
sOut = ""
For Count = 1 To 10
sOut = sOut & rs("ShipCountry") & vbCrLf
rs.MoveNext
Next Count
MsgBox sOut, vbExclamation, "ADO Results"
cn.Close
End Sub
运行程序后,你会看到如下图所示的消息框。
不幸的是,目前这个Recrodset对象是只读的和forward cursor。如果你想要获取更多的功能,你需要创建一个独立的Recordset对象,该对象拥有自己的Connection属性,就象下面的代码所示:
Private Sub Form_Load()
Dim rs As ADODB.Recordset
Dim sSQL As String
Dim sOut As String
Dim Count As Integer
Set rs = New ADODB.Recordset
sSQL = "SELECT DISTINCT Orders.ShipCountry FROM Orders"
rs.Open sSQL, "DSN=RDC Nwind;UID=;PWD=;", adOpenDynamic
'Report Recordset Connection information
MsgBox rs.ActiveConnection, , "Connection Info"
'Enumerate the recordset
sOut = ""
For Count = 1 To 10
sOut = sOut & rs("ShipCountry") & vbCrLf
rs.MoveNext
Next Count
MsgBox sOut, vbExclamation, "ADO Results"
rs.Close
End Sub
上面代码返回的结果同前例一样,但是本代码中的Recordset是独立的。这一点是DAO和RDO做不到的。Recordset对象的Open方法打开一个代表从SQL查询返回的记录的游标。虽然你可以用Connection对象同远程数据源建立连接,但请记住,在这种情况下,Connection对象和Recordset对象是平行的关系。
总结
本文仅向你介绍了ADO强大的功能的冰山一角。微软承诺,在将来ADO将会取代DAO和RDO。所以现在你应该考虑如何将你的数据访问代码投向ADO的怀抱。这种转变不会很痛苦,因为ADO的语法同现有的语法差不多。也许微软或第三方会在将来开发出转换向导来简化这一转换过程。从现在起,你就应开发纯ADO代码的程序。你也可以继续使用DAO或RDO代码来开发你的程序,但落伍的感觉总是不好的。
07.txt
ADO控件和DATA控件的冲突(不能共存)的解决方法
你知道ADO控件和DATA控件有冲突吗?试一试下面的例子:
Dim db As Database
Dim rs As Recordset
Set db = OpenDatabase("d:\stock\yline.mdb")
Set rs = db.OpenRecordset("select count(*) as totalcount from yline where 条件") ***
MsgBox (rs(0))
rs.Close
db.Close
Set rs = Nothing
Set db = Nothing
‘注明,这个例子在一般情况下运行正常
只有当一个FROM中已有ADO控件,你运行上面的例子
程序就会在 *** 处的语句中出现实时错误 '13' ,类型不匹配的错误
这就是ADO控件和DATA控件的冲突,如果你想共存的话,下面的对你就有用了。
1.如果你是新建一个程序
当你新建一个程序时,在FROM中要先添加DATA控件,再添加ADO控件,OK一切正常
2.如果你已有一个程序,还想添加一个FROM(其中包括DATA控件)
解决方法是:1.新建FORM,建一个DATA控件,输入你要输入的代码,保存文件
2.添加文件,把你原来的工程文件添加进来
3.改变工程属性,把启动对象设置为你原来的工程
注意事项:ADO控件在DATA控件前面加入=“错误”
ADO控件在DATA控件后面加入=“正确”
08.txt
ADO三大对象的属性、方法、事件及常数(二)
Command对象
Command对象的主要目的是执行参数化的存储过程。其形式要么是临时准备(prepared),要么是持久的预编译(precompiled)过的SQL语句。如果想(存储)一个或多个查询以供在同一Connection上多次执行,Command对象也是很有用的。当想创建Recordset时,一种高效的方法是绕过Command对象而采用Recordset.Open方法。
属性
属性名称 数据类型和用途
ActiveConnection 指针类型,指向Command所关联的Connection对象。对于现存的已打开连接,可使用Set cmmName.ActiveConnection=cnnName。另外,也可以不用相关Connection对象名称而使用有效的连接字符串去创建一个新的连接。默认值为Null。
CommandText 可读写String类型。为ActiveConnection指定一条SQL语句、表名、存储过程名或提供者能接受的任意字符串。CommandType属性的值决定了CommandText属性值的格式。默认值为空字符串:""
CommandTimeout 可读写Long类型,指定中止一个Command.Execute调用之前必须等待的时间。这时的值优先于Connection.ComandTimeout中的设定值。默认值为30秒。
CommandType 可读写Long类型,指定数据提供者该如何解释CommandText属性值。CommandType等效于Connection.Execute方法中的可选参数lngOption。详见CommandType所用到的常数。默认值为adCmdUnkown.
Name 可读写String类型,指定Command的名称。
Prepared 可读写Boolean类型,判断数据源是否把CommandText中的SQL语句编译为prepared statement(一种临时性存储过程)。prepared statement仅存活于Command的ActiveConnection生命周期中。许多客户/服务器RDBMS,包括SQL SERVER,都支持prepared statement。如果数据源不支持prepared statement,则把该属性设为True,将导致一个自陷错误。
State 可读写Long类型,指定Commnad状态。见State常数。
注意:最好每次都为CommandType指定的一个合适的常数值,否则会降低系统运行的效率。
方法
方法 用途
Createparameter 在执行该方法之前,必须首先声明一个ADODB.Parameter对象。调用语法为:
cmmName.CreateParameter [strName[,lngType[,lngDirection[,lngSize[,varValue]]]]]
Execute 调用语法同Connection.Execute大致相同。
常数
State常数
常数 含义
adStateClosed Connection(或其他对象)是关闭的(默认值)
adStateConnecting 正在连接数据源的状态
adStateExecuting Connection或Command对象的Execute方法已被调用
adStateFetching 返回行(row)到Recordset对象
adStateOpen Connection(或其他对象)是打开的(活动的)
CommandType所用到的常数
Command类型常数 含义
adCmdUnknown Command类型未定(默认值),由数据提供者去判别Command语法
adCmdFile Command是和对象类型相应的文件名称
adCmdStoredProc Command是存储过程名称
adCmdTable Command是能产生内部SELECT * FROM TableName查询的表名称
adCmdTableDirect Command是能直接从表中获取行内容的表名称
adCmdText Command是一条SQL语句
09.txt
ADO三大对象的属性、方法、事件及常数(二)
Command对象
Command对象的主要目的是执行参数化的存储过程。其形式要么是临时准备(prepared),要么是持久的预编译(precompiled)过的SQL语句。如果想(存储)一个或多个查询以供在同一Connection上多次执行,Command对象也是很有用的。当想创建Recordset时,一种高效的方法是绕过Command对象而采用Recordset.Open方法。
属性
属性名称 数据类型和用途
ActiveConnection 指针类型,指向Command所关联的Connection对象。对于现存的已打开连接,可使用Set cmmName.ActiveConnection=cnnName。另外,也可以不用相关Connection对象名称而使用有效的连接字符串去创建一个新的连接。默认值为Null。
CommandText 可读写String类型。为ActiveConnection指定一条SQL语句、表名、存储过程名或提供者能接受的任意字符串。CommandType属性的值决定了CommandText属性值的格式。默认值为空字符串:""
CommandTimeout 可读写Long类型,指定中止一个Command.Execute调用之前必须等待的时间。这时的值优先于Connection.ComandTimeout中的设定值。默认值为30秒。
CommandType 可读写Long类型,指定数据提供者该如何解释CommandText属性值。CommandType等效于Connection.Execute方法中的可选参数lngOption。详见CommandType所用到的常数。默认值为adCmdUnkown.
Name 可读写String类型,指定Command的名称。
Prepared 可读写Boolean类型,判断数据源是否把CommandText中的SQL语句编译为prepared statement(一种临时性存储过程)。prepared statement仅存活于Command的ActiveConnection生命周期中。许多客户/服务器RDBMS,包括SQL SERVER,都支持prepared statement。如果数据源不支持prepared statement,则把该属性设为True,将导致一个自陷错误。
State 可读写Long类型,指定Commnad状态。见State常数。
注意:最好每次都为CommandType指定的一个合适的常数值,否则会降低系统运行的效率。
方法
方法 用途
Createparameter 在执行该方法之前,必须首先声明一个ADODB.Parameter对象。调用语法为:
cmmName.CreateParameter [strName[,lngType[,lngDirection[,lngSize[,varValue]]]]]
Execute 调用语法同Connection.Execute大致相同。
常数
State常数
常数 含义
adStateClosed Connection(或其他对象)是关闭的(默认值)
adStateConnecting 正在连接数据源的状态
adStateExecuting Connection或Command对象的Execute方法已被调用
adStateFetching 返回行(row)到Recordset对象
adStateOpen Connection(或其他对象)是打开的(活动的)
CommandType所用到的常数
Command类型常数 含义
adCmdUnknown Command类型未定(默认值),由数据提供者去判别Command语法
adCmdFile Command是和对象类型相应的文件名称
adCmdStoredProc Command是存储过程名称
adCmdTable Command是能产生内部SELECT * FROM TableName查询的表名称
adCmdTableDirect Command是能直接从表中获取行内容的表名称
adCmdText Command是一条SQL语句
10.txt
ADO三大对象的属性、方法、事件及常数(三)
Recordset对象
属性
属性名称 数据类型和用途
AbsolutePage 可读写Long类型,要么是设置或返回当前记录所处的页面序号,要么是一个PositionEnum常数,见AbsolutePage用到的常数。在获取或设置AbsolutePage的值之前,必须先设定PageSize的值。AbsolutePage是从1开始计数的。如果当前记录位于第一页时,AbsolutePage的返回值为1,对AbsolutePage设置将使当前记录指针指向指定页的第一条记录。
AbsolutePosition* 可读写的Long类型(从1开始计数),设置或返回当前记录年处的位置。AbsolutePosition的最大取值是RecordCount属性的值。
ActiveCommand 可读写的String类型,Recordset所关联的先前打开的Command对象名称
ActiveConnection 指针类型,指向Recordset所关联的先前打开的Connection对象,或指向一条完整有效的ConnectionString串值。
BOF* 只读Boolean类型,若为True,表明记录指针已位于Recordset第一条记录之前,并且没有了当前记录
Bookmark* 可读写Variant类型,返回对特定记录的引用或使用一个Bookmark值使记录指针指向特定记录
CacheSize* 可读写Long类型,指定本地Cache中所存的记录条数,最小(默认值)为1。若增加了CacheSize的值,则在流动Recordset以获取更多记录时,能减少与服务器的通信次数。
CursorLocation 可读写Long类型,指定可流动游标的位置,即CursorType是位于客户端还是位于服务器端,见CursorLocation用到的常数。默认值是使用OLE DB数据源提供的游标。
CusrsorType* 可读写Long类型,指定Recordset游标的类型,见CursorType用到的常数,默认值是forward-only游标
DataMember 指针类型,指向关联的DataEnvironment.Command对象
DataSource 指针类型,指向关联的DataEnvironment.Connection对象
EditMode* 只读Long类型,返回Recordset的编辑状态,见EditMode用到的常数
EOF* 只读Boolean类型,若为True,表明记录指针已超出Recordset的最后一条记录,并且没有了当前记录。
Filter* 可读写Variant类型,要么是一条件表达式(一条有效的SQL WHERE子句但又不出现保留字WHERE),要么是指向特定记录的Bookmark数组,要么是一个Filter常数,详见Filter用到的常数。
LockType* 可读写Long类型,指定打开Recordset所使用的记录锁定方法。默认值是只读,对应于forward-only游标的只读特性。见LockType属性用到的常数。
MarshalOptions 可读写Long类型,指定客户端改动后,应返回哪个记录集合,此属性仅适合于不常见的ADOR.Recordset对象,此对象是RDS.ADOR.Recordset对象成员之一。
MaxRecords* 可读写Long类型,指定SELECT查询或存储过程返回的最大记录条数,默认值为0,即全部返回
PageCount 只读Long类型,返回Recordset所有的页数,必须设定了PageSize的值,PageCount的返回值才是真正有意义的。如果Recordset不支持PageCount属性,则返回值为-1
PageSize 可读写Long类型,设置或返回一个逻辑页所包含的记录条数。使用逻辑页可把大的Recordset分解为多个易处理的小部分。通常的做法是把PageSize设为DataGrid、MsFlexGrid或层次型的FlexGrid控件所能显示的记录条数。PageSize和锁定Jet(2k)或锁定SQL Server(6.5版及更早版本,2k;7.0版,8k)数据库时用到的表页面大小无关
PersistFormat 可读写Long类型,设置或返回由调用Save方法所创建的Recordset文件的格式。当前仅有一个值adPersistADTG(默认格式:Advanced Data TableGram)
RecordCount* 只读Long类型,如果Recordset支持近似定位或支持书签,则返回带可流动游标的Recordset所含有的记录数;如果不支持,必须使用MoveLast方法以取得确实覆盖了所有记录的准确的RecordCount数值。如果forward-only类型Recordset有一条或多条记录,Recordset返回-1(True),任何类型的空的Recordset都将返回0(False)
Sort* 可读写String类型,包含一条不含保留字ORDER BY的SQL ORDERY BY子句,用以指定Recordset的排序方式
Source* 可读写String类型,可以是SQL语句、表名、存储过程名或相关Command对象名。如果提供了Command对象名,则Source将返回Command.CommandText的值。利用Open方法的参数lngOptions可以指定提供给Source值的类型
State 可读写Long类型,为对象状态常数之一。见State常数
Status 只读Long类型,表明对Recordset进行批处理或其他多记录(bulk)操作后的状态。见Status属性用到的常数
注意:上表所列属性是ADODB.Recordset对象的标准属性,即那些被关系数据库的大多数通用OLE DB数据提供者所支持的属性。带星号的属性表示它与DAO.Recordset或rdoResultset对象的相应属性完全一样或很接近。
方法
方法 用途
AddNew* 向可更新的Recordset添加一条新记录。调用语法为rstName.AddNew[{varField|avarFields},{varValue|avarValuese}],其中varField是单个字段名,avarFields是字段名数组。varValue是单个字段值,avarValue是由avarFields指定字段的值所组成的数组。调用Update方法则把新记录加到数据库的表中。如果向主关键字不是第一个字段的Recordset中添加记录,则必须在AddNew方法中指定主关键字的名称和值
Cancel 取消异步查询的执行,中止存储过程或复合SQL语句创建多个Recordset,调用语法为rstName.Cancel
CancelBatch* 取消LockEdit值为BatchOptimistic的Recordset的即将生效的批量更新操作,调用语法为:rstName.CancelBatch [lngAffectRecords],可选参数lngAffectRecords的取值见lngAffectRecords用到的常数
Clone 复制一个带有独立记录指针的Recordset对象,调用语法为:Set rstDupe=rstName.Clone()
Close 关闭Recordset对象,以后可以重新设Recordset的属性并使用Open方法来再度访问Recordset 。调用语法为:rstName.Close
Delete* 如果Recordset的LockEdit属性值未设为adLockBatchOptimistic,立刻从Recordset和相应表中删除当前记录
Find 寻找满足指定条件的记录。调用语法为:rstName.Find strCriteria [,lngSkipRecords, lngSearchDirection [,lngStart]],其中strCriteria是不含WHERE关键字的SQL WHERE子句,可选参数lngSkipRecords是应用Find前所跳过的记录数目,lngDirection指定查找方向(adSearchForward,和adSearchBackward,其中adSearchForward是默认值),可选参数lngStart指定了从哪儿开始查找,其值要么是一个Bookmark值,要么是Bookmark常数,见varStart参数用到的Bookmark常数。
GetRows 返回一个二维Variant数组(行、列),调用语法为avarname=rstName.GetRows(lngRows [,varStart[,{strFieldName|lngFieldIndex|avarFieldNames|avarFieldIndexes}]],其中lngRows是返回记录行数,varStart指定从哪儿开始查找,其值要么是一个Bookmark值,要么是Bookmark常数,见varStart参数用到的Bookmark常数。第三个参数可以是单个列(字段)的名称或索引,也可以是多个列名称或索引组成的Variant数组。如果不指定第三个参数,GetRows返回Recordset中所有列。
GetString 默认情况下,返回指定数目记录的String串值,记录间由返回代码分隔。记录内由tab分隔。调用语法为: strClip=rstname.GetString(lngRows,[, strCloumnDelimiter[,strRowDelimiter,[strNullExpr]]])。其中lngRows为返回记录行数,strColumnDelimiter为可选的列分隔符(vbTab是默认值),strRowDelimiter是可选的行分隔符(vbCr是默认值),strNullExpr是可选参数,用于碰到Null值时的替代值(默认值是空字符串)。GetString的主要用途是通过把控件的Clip属性设为strClip来处理MSFlexGrid或MSHFlexGrid控件
Move* 从当前记录移动记录指针。调用语法为:rstName.Move lngNumRecords [, varStart],其中lngNumRecords是要跳过的记录数,可选选参数varStart指定从哪开始移动。其值要么是一个Bookmark值,要么是Bookmark常数,见varStart参数用到的Bookmark常数。
MoveFirst* 移动记录指针到第一条记录,调用语法为:rstName.MoveFirst
MoveLast* 移动记录指针到最后一条记录,调用语法为:rstName.MoveLast
MoveNext 移动记录指针到下一条记录,调用语法为:rstName.MoveNext。它是能用于forward-only Recordset的唯一Move方法
MovePrevious* 移动记录指针到前一条记录,调用语法为:rstName.MovePrevious
NextRecordset 返回另外的Recordset,它通常由能产生多个Recordset的复合SQL语句(如SELECT * FROM orders;SELECT * FROM customers)或存储过程来创建。调用语法为Next=rstName.NextRecordset [(lngRecordsAffected)],其中可选参数lngRecordsAffected指定返回到rstNext中去的记录数目。如果已不存在Recordset,rstNext被设为Nothing
Open 在一个活动Command或Connection对象上打开一个Recordset,调用语法为:rstName.Open [varSource [, varActiveConnection [, lngCursorType [, lngLockType [, lngOptions]]]]]。这些参数都是可选的,
Requery 重新从表中获取Recordset的内容,等效于Close后再Open。它是一个资源集中型操作。语法为:rstName.Requery
Resync* 重新从表中获取部分Recordset内容。调用语法为rstName.Resync [lngAffectRecords],其中lngAffectRecords的取值见lngAffectRecords用到的常数。如果把该参数设为adAffectCurrent或adAffectGroup,则比adAffectAll(默认值)所耗的资源要少。
Save 创建包含Recordset永久性拷贝的文件。调用语法为rstName.Save strFileName。其中strFileName为路径和文件名。通常用.rst作为文件的扩展名。
Supports 如果数据提供者支持指定的游标相关的方法,则返回True,否则返回为False。调用语法为Supported=rstname.Supports (lngCursorOptions).关于lngCursorOptions,见Supports方法用到的常数。
Update* 使对Recordset的修改对底层数据源中的表生效。对于批量操作,Update方法只使修改对本地(Cached)Recordset生效。调用语法为rstName.Update
UpdateBatch* 合对指量类型的Recordset(LockType属性值为adBatchOptimistic,CursorType属性值为adOpenKeyset或adOpenStatic)所做的修改对底层数据源中的表生效。调用语法为rstName.UpdateBatch [lngAffectRecords],其中lngAffectRecords的取值见lngAffectrecords用到的常数。
注:ADODB.Recordset对象不支持Edit方法。为了改变ADODB.Recordset对象当前记录的一个或多个字段的值,可以先使用rstName.Fields(n).Value=varValue把相应字段的值改为所需要的值,而后执行rstName.Update即可。
事件
事件名称 触发时机
EndOfRecordset 记录指针试图移到最后一条记录之外时
FieldchangeComplete 字段值的改变完成之后
MoveComplete Move或Move...方法执行之后
RecordsChangeComplete 对单个记录编辑完成以后
RecordsetChangeComplete 缓存中的改变对底层表生效之后
WillChangField 对字段值改变之前
WillChangeRecord 对单个记录改变之前
WillChangeRecordset 缓存中的改变对底层表生效之前
WillMove Move或Move...方法执行之前
注:事件处理模块的函数头几乎都用到了adReason参数。该参数的取值见adReason参数用到的常数。
常数
AbsolutePage属性用到的常数
常数 含义
adPosUnknown 数据提供者不支持页面,Recordset为空,或数据提供者不能确定页码。
adPosBOF 记录指针定位于文件开头(BOF属性值为True)
adPosEOF 记录指针定位于文件结尾(EOF属性值为True)
CursorLocation属性用到的常数
常数 含义
adUseClient 使用客户端游标库提供的游标。ADODB.Recordset要求客户端游标
adUseServer 使用数据源提供的游标,通常(但非绝对)位于服务器上(默认值)
CursorType属性用到的常数
常数 含义
adOpenForwardonly 提供单向移动游标和只读Recordset(默认值)
adOpenDynamic 提供可滚动游标,可显示其他用户对Recordset所做的改动(包括添加新记录)
adOpenKeyset 提供可滚动游标,只隐藏其他用户所做的改动,类似于dynaset类型的DAO.Recordset
adOpenStatic 提供一个位于Recordset静态拷贝上的可滚动游标,类似于snapshot类型的DAO.Recordset,但多了可更新特性
EditMode属性用到的常数
常数 含义
adEditNone 无正在进行的编辑操作(默认值)
adEditAdd 临时添加一条记录,但尚未存入数据库的表中
adEditInProgress 当前记录中的数据已经改动,但尚未存入数据库的表中
Filter属性用到的常数
常数 含义
adFilterNone 除去已有的过滤器,显示Recordset中的所有记录(等效于把Filter属性置为空串,默认值)
adfilterAffectedRecords 只显示上次CancelBatch、Delete、Resync或UpdateBatch方法执行后所影响的记录
adFilterFetchedRecords 只当前Cache中的记录,记录条数由CacheSize来确定
adFilterPendingRecords 只显示已改动但尚未被数据源处理的记录(仅适用于批量更新模式)
LockType属性用到的常数
常数 含义
adLockRecordOnly 指定只读访问(默认值)
adLockBatchOptimistic 使用批量更新模式而不是默认的立即更新模式
adLockOptimistic 使用乐观锁(仅在更新过程中才锁定记录或页面)
adLockPessimistic 使用悲观锁(编辑或更新整个过程中均锁定记录或页面)
State常数
常数 含义
adStateClosed Connection(或其他对象)是关闭的(默认值)
adStateConnecting 正在连接数据源的状态
adStateExecuting Connection或Command对象的Execute方法已被调用
adStateFetching 返回行(row)到Recordset对象
adStateOpen Connection(或其他对象)是打开的(活动的)
Status属性用到的常数(仅适用于Batch或Bulk Recordset操作)
常数 含义
adRecOK 成功更新
adRecNew 成功添加
adRecModified 成功修改
adRecDeleted 成功删除
adRecUnmodified 无改动
adRecInvalid 未保存:Bookmark属性无效
adRecMultipleChanges 未保存:保存会影响其他记录
adRecPendingChanges 未保存:记录引用了一个等待插入操作
adRecCanceled 未保存:操作被取消
adRecCantRelease 未保存:现有记录值阻止了保存
adRecConcurrencyViolation 未保存:乐观并发锁发生了问题
adRecIntegrityViolation 未保存:操作会影响一致性
adRecMaxChangesExceeded 未保存:存在太多的等待改动
adRecObjectOpen 未保存:打开存贮对象发生冲突
adRecOutofMemory 未保存:内存不足
adRecPermissionDenied 未保存:用户权限不够
adRecSchemaViolation 未保存:记录的结构不符合数据库中的定义
adRecDBDeleted 未保存或删除:记录已被删除
lngAffectRecords参数用到的常数
Command类型常数 含义
adAffectAll 包括Recordset对象的所有记录,那些被Filter属性过滤隐藏的记录也计算在内(默认值)
adAffectCurrent 只包括当前记录
adAffectGroup 只包括那些符合当前Filter条件的记录
varStart参数用到的Bookmark常数
常数 含义
adBookmarkCurrent 从当前记录开始(默认值)
adBookmarkFirst 从第一条记录开始
adBookmarkLast 从最后一条记录开始
Supports方法用到的常数
常数 含义
adAddNew 调用AddNew方法
adApproxPosition 设置和得到Absoluteposition和AbsolutePage属性值
adBookmark 设置和得到Bookmark属性值
adDelete 调用Delete方法
adHoldRecords 获取另外的记录或改变获取记录指针的位置,但不提交未确定的改变
adMovePrevious 调用GetRows,Move,MoveFirst和MovePrevious方法(表明是一个双向可滚动游标)
adResync 调用Resync方法
adUpdate 调用Update方法
adUpdateBatch 调用UpdateBatch和CancelBatch方法
adReason参数用到的常数
常数 含义
AdRsnAddNew 调用了AddNew方法
AdRsnClose 调用了Close方法
AdRsnDelete 调用了Delete方法
AdRsnFirstChange 第一次对记录字段值做了修改
AdRsnMove 调用了Move方法
AdRsnMoveFirst 调用了MoveFirst方法
AdRsnMoveLast 调用了MoveLast方法
AdRsnMovePrevious 调用了MovePrevious方法
AdRsnRequery 调用了Requery方法
AdRsnResync 调用了Resync方法
AdRsnUndoAddNew AddNew操作被用户取消
AdRsnUndoDelete Delete操作被用户取消
AdRsnUndoUpdate Update操作被用户取消
AdRsnUpdate 调用了Update方法
11.txt
Data 控件使用有密码的 Access 数据库
使用 Data 控件打开 Accecc 数据库:
设置 Connect 属性为 ;pwd=密码
Data1.Connect = ";pwd=密码"
修改密码:
Data1.Database.NewPassword _老密码_, _新密码_
12.txt
DBF文件转为MDB文件的方法
1.用手动的话,Access 97 做比较轻松,工具也较完整。合成以后一样可以供 Vb 利
用。
2.如果你坚持要自动,那么原则是
a.用 Access 做个同结构的 Mdb 空档。
b.用一个 FileListBox 指向 *.dbf 的目录。
c.用 Dao 物件读入 mdb 空档。
d.用 for next 回圈一一读入各 Dbf,如:
for i=0 to FileListBox.listcount
开启 FileListBox.list(i) 的 dbf
for j=0 to FileListBox.list(i).recordcount
mdb空档.addnew FileListBox.list(i).record(j)
next
next
13.txt
Excel、Access、VB的结合应用
江苏省南通市学田新村
杨伟民
---- 微软公司的Office系列办公软件相信已是众所周知,其中Excel强大的统计制表功能、Access功能完备的数据处理能力深受众多用户所喜爱。Visual Bsaic更是微软公司又一有力的产品,它简单易学,在Windows编程中的应用十分广泛。本文通过介绍数据处理及复杂表格的打印,来讨论VB与Excel及Access的结合运用。
---- 由于笔者所在的公司员工众多,在进行职工养老保险缴费的计算工作时,若使用劳动局编制的软件(用Foxbase编写),无论是在管理或维护方面均显得力不从心。于是在公司领导的强烈要求下,决定由笔者构思重新编制。基本思路是:1.将所有员工资料输入Access进行处理,以便于维护。2.在Excel中预先制成有表头的空表(Access相对欠缺处理复杂表格的能力),对需要进行金额汇总或其他运算的单元格可直接输入公式。3.在VB中编写程序代码,从Access中提取数据填入Excel对应表格相应的单元格,并输出至打印机。
---- 部分窗体及源程序代码如下:
---- 1.程序主模块
---- 定义Excel、Access对象变量,显示系统启动画面,进入系统主程序界面。强调一下,在编写程序之前须加入对Excel及Access库函数的引用,具体操作是:选择菜单栏'工程'\'引用…',将'可使用的引用'列表框内'Microsoft Access 8.0 Object Library'和 'Microsoft Excel 8.0 Object Library'两项前的复选框标为选中,按"确定"返回。
mdsMain.bas
'定义数据库记录集及Excel对象变量
Public ex As New Excel.Application
Public exwbook As Excel.Workbook
Public exsheet As Excel.Worksheet
Public mydatabase As Database
Public myrecordset1 As Recordset
[定义记录集]
……
……
Public Opt As Integer '报表选项
[Opt为frmSelreport.frm返回值]
Public isYN As Boolean
Sub Main()
Load frmSplash
frmSplash.Show
frmSplash.Label2.Caption =
" 系统正在加载Access数据库..."
Set mydatabase = OpenDatabase("c:\sbda\sbda.mdb")
Set myrecordset1 = mydatabase.OpenRecordset
("报表打印(一)")
[此处对记录集赋值]
……
……
frmSplash.Label2.Caption =
" 系统正在加载Excel电子表格..."
Set ex = CreateObject("excel.application")
Set exwbook = ex.Workbooks.Open("c:\sbda\sbda.xls")
Load FrmInput '将数据输入窗体加载到内存中
Unload frmSplash
Load FrmMain '将主程序界面加载到内存中
End Sub
---- 2.报表打印模块
---- 其中ExcelDoForVB1()是一子程序,由prnProess()调用,作用是从Access中提取所需数据资料,填入Excel对应工作表(Worksheet)的相应单元格(Cells)中,然后打印已填入数据的表格;prnProess()则负责实现对VB通用对话框(Commom Dialog)中打印功能的控制。
mdlPrint.bas
Option Explicit
'定义循环计数变量
Public nRow As Integer, nCol As
Integer, nBtoE As Integer
'定义变量接收打印对话框返回值
Public BeginPage, EndPage, NumCopies
'程序运行时需进行判断的各种标志
Public nflag, Flag, ifNum
'数据记录集中指针移动数
Public PageN As Integer, n As Integer
'bar1为进度条
Public bar1 As Object
Sub prnProess()
'控制通用对话框打印功能
Set bar1 = FrmPrint.PgsBar1 '进度条
On Error GoTo errhandle:
If Flag = 0 Then '当打印对话框中选"全部"时
Select Case Opt '选择需要打印的表格
Case 1
nflag = 1
myrecordset1.MoveFirst
myrecordset1.MovePrevious
PageN = 1
Do While nflag = 1
Call ExcelDoForVB1
'数据填入Excel单元格打印
PageN = PageN + 1
Loop
Case 2
……
……
End Select
Else
If Flag = 2 Then '
当打印对话框中选"页"时
If EndPage - BeginPage = 0 Then
ifNum = 0
Else
If EndPage - BeginPage > 0 Then
ifNum = 1
Else
ifNum = 2
End If
End If
Select Case ifNum
Case 2
Exit Sub
Case 0
Select Case Opt '
选择需要打印的表格
Case 1
myrecordset1.MoveFirst
n = (BeginPage - 1) *
(49 - 4 + 1) - 1
myrecordset1.Move n
PageN = BeginPage
Call ExcelDoForVB1
'数据填入Excel单元格并打印
Case 2
……
……
End Select
Case 1
Select Case Opt
'选择需要打印的表格
Case 1
myrecordset1.MoveFirst
n = (BeginPage - 1) *
(49 - 4 + 1) - 1
myrecordset1.Move n
PageN = BeginPage
For nBtoE = BeginPage To EndPage
Call ExcelDoForVB1
'填入Excel单元格并打印
PageN = PageN + 1
Next nBtoE
Case 2
……
……
End Select
End Select
End If
End If
FrmMain.Visible = True
Exit Sub
errhandle:
FrmPrint.Visible = False
FrmMain.Visible = True
End Sub
---- 注意,下段仅通过ExcelDoForVB1()对"报表(一)"的处理,来说明数据填入Excel并打印的整个过程。
Sub ExcelDoForVB1() '打印报表(一)
FrmPrint.Visible = True
Set exsheet = exwbook.Worksheets("sheet1")
ex.Sheets("Sheet1").Select
ex.Range("A4:U49").Select
ex.Selection.ClearContents
ex.Range("A4").Select
bar1.Min = 0
bar1.Max = 45
For nRow = 4 To 49
bar1.Value = nRow - 4 '进度显示栏进程
myrecordset1.MoveNext
If myrecordset1.EOF Then
nflag = 0
Exit For
End If
For nCol = 1 To 21
exsheet.Cells(nRow, nCol) =
myrecordset1.Fields(nCol - 1)
Next nCol
Next nRow
exsheet.Cells(52, 21) = "第 " + CStr(PageN) + " 页"
FrmPrint.Visible = False
bar1.Value = 0
ActiveWindow.SelectedSheets.PrintOut Copies:=NumCopies
End Sub
---- 虽然本文针对的是大多数已熟练掌握数据库技术,且精通编程之道的朋友们。但笔者认为仍有必要提一提将数据输入Access的过程,因为编出来的软件更多是面向各类普通用户,对他们来说最要紧的是好用,而其间的一系列关联并不想深究。所以设计一个好的输入界面十分有必要,在设计时可以运用VB提供的Data控件,当然若是考虑性能的话还可以用代码直接操纵数据。关于如何使用Data控件访问数据库,在Visual Basic的联机手册(Online book)中有很详细的说明,此处不再赘述。
---- 文中的所有程序在Visual Bsaic5.0中文专业版及Office97中文版中调试通过。
14.txt
icrosoft SQL Server 7.0安装问题(二)
【「Microsoft SQLServer 7.0」以下简称「SQL Server 7.0」】
如果要在同一台计算机上安装SQL Server 7.0企业版和微软其它服务器产品如IIS 、Exchange 等时,有何建议安装程序?
基本上为了性能的考虑不建议您将数种服务器应用程序与SQL Server安装在同一台计算机上。如果真的有此需求,请依照下列顺序安装:
安装Windows NT Server企业版﹝此版本已包含Service Pack 3,请注意不要安装IIS﹞。
安装Microsoft Internet Explorer 4.01或更新版本。
安装Microsoft Cluster Server (注意不要安装MSMQ或IIS)。
手工安装建立MS DTC Resources。
安装Windows NT 4.0 Option Pack(请注意不要安装MSMQ),安装Windows NT 4.0 Option Pack时如果您的计算机已安装下列软件,请将下列服务停止,否则可能无法成功安装Windows NT 4.0 Option Pack:
- Microsoft Site Server
-所有的Microsoft Exchange Services
-所有的Oracle产品
- Microsoft SNA Server
- Remote Access AutoDial
- Microsoft DBWeb
-所有备份软件或服务,如ARCserve或Backup Executive
-所有防毒软件或服务 - UniCenter system monitoring - Compaq Management Utilities,如Insight Manger或Surveyor
- Microsoft NNTP Service
- Microsoft SMTP Service
- Disk Keeper
- SNMP Services
- MS DTC
- 任何客户/服务器或ODBC应用程序。
安装Windows NT 4.0 Service Pack 4.
安装Microsoft SQL Server 7.0企业版,如同步骤五,停止安装Windows NT 4.0 Option Pack时要停止的所有服务。
安装Microsoft SQL Cluster Service.
安装其它服务器产品和应用程序。
重新安装 Windows NT Service Pack 4。
由SQL Server 6.x升级到SQL Server 7.0,有哪些系统需求?
除了符合安装SQL Server 7.0的系统需求外,还需注意以下几点:
硬件:如果要将原来的数据库升级,大约还需要额外的硬盘空间,约为原来的数据库料1.5倍。
软件:
由SQL Server 6.5升级时,SQL Server 6.5必须已安装Service pack 3或以上的版本。
由SQL Server 6.0升级时,需先将Windows NT Server升级至4.0 Service Pack 4,再安装SQL Server 7.0。。
在一台已经安装好SQL Server 7.0的计算机上是否可以安装SQL Server 6.5?
不能,需要先将SQL Server 7.0删除后,才可以安装SQL Server 6.5。
是否可以从SQL Server 7.0 Beta 3直接升级到SQL Server7.0?
可以。
是否可以在一台机器上同时安装SQL Server 6.X和SQL Server 7.0?
可以,但是无法同时执行SQL Server 6.X和SQL Server 7.0。
SQL Server 7.0升级安装要注意哪些事项?
不要覆盖原有的SQL Server 6.x版的目录。
安装之前先关掉原有的SQL Server。
将Windows NT事件检查器和登录编辑程序关闭。
将使用到ODBC 驱动程序的应用程序关闭。
SQL Server 6.5需要Service Pack3以上版本(SQL Server 7.0 CD中有附Service pack4)。
在同时安装SQL Server 6.x/7.0的计算机上如何删除SQL Server 6.x?
切换至SQL Server 6.x。
删除SQL Server 6.x(执行SQL Server 6.x的安装程序选择删除SQL Server(Remove SQL Server)。
切换至SQL Server 7.0。
如何删除Microsoft SQL Server 7.0?
将Microsoft Management Console(SQL Enterprise Management)关闭。
停止SQL Server Agent服务。
停止Microsoft SQL Server服务。
将SQLServer Manager程序关闭。完成上列各项步骤后,再在控制台的添加/移除程序中选择Microsoft SQL Server 7.0。
Vswitch.exe如何在Microsoft SQL Server 6.x/7.0之间切换?
在同时安装Microsoft SQL Server 6.x/7.0的计算机上,SQL Server 7.0的注册键码位于
\\Heky_Local_Machine\Software\ Microsoft\MSSQLServ70,
SQL Server 6.5的注册键码位于
\\Heky_Local_Machine\Software\ Microsoft\MSSQLServ65。
此外目前SQLServer的设置值位于
\\Heky_Local_Machine\Software\ Microsoft\MSSQLServer,
当您转换版本时会将目前的设置值存入原来执行的版本,取出另一版本的设定值,此外
\\Heky_Local_Machine\System\CurrentControlSet\ Services\MSSQLServer
中的ImagePath设置改为要执行的SQLServer.exe
附注:Windows 95/98没有服务键码。
SQL Server 7.0可以远程安装吗?
可以。
SQL Server 7.0远程安装有何特别要求?
近端及远程计算机都必须为Windows NT。近端及远程计算机必须为相同的platform(Intel或Alpha)。在近端登录的帐号必须为远程计算机的本地管理员。
如何无人照管安装SQL Server 7.0?
:\X86\setup\setupsql.exe -f1 :\sql7.iss -s
附注:sql7.iss为您设置的安装初始化文件。
SQL Server 7.0光盘片中附有哪些iss(setup initialization file,安装初始化文件)?
ql70cli.iss:执行sql70cli.bat安装SQL Server 7.0管理工具。
sql70ins.iss:执行sql70ins.bat以典型安装方式安装SQL Server 7.0。
sql70cst.iss:执行sql70cst.bat以用户自定义方式安装SQL Server 7.0,安装所有的组件。
附注:sql70ins.iss及sql70cst.iss均设定SQL Service帐号为本地系统帐号。。
15.txt
主题: MDB文件的导出 ---- 使用 DAO
在很多 VB 的MDB文件书籍中,都会很完整的提到:如何由其他种类的文件中將资料导入MDB文件,但是却很少有书提到:如何將MDB文件中的资料,导出到各种不同的文件类型的文件中,连 VB 的 Help 中也是这样!
或许是大家都认为MDB文件主题的重点是在MDB文件本身吧!
但是,在实际的MDB文件程式運用中,却常常需要將MDB文件导出到各种不同的文件类型的文件中,这些文件可能是 DBase文件、文本文件 (.Txt)、Excel 文件、Html 文件、Access 文件或其他类型的MDB文件文件 (ODBC)...等。
在本主题中,考虑到並不是每一个人都有 Oracle 或 SQL Server 的环境,为了让大家都能夠实行,我们將以 Access MDB文件来作练习,而练习的文件也使用 VB 本身提供的 Biblio.mdb (位于各版本 VB 的目录下)。
预计要练习导出的文件类型有五种:DBase文件、文本文件 (.Txt)、Html 文件、Excel 文件、Access 文件。除了这五种之外,下面的命令可以將MDB文件导出到任一种 VB 支持的MDB文件或文件中。
在练习之前,要將导出文件的 SQL 命令先说明一下:
SELECT Table.Fields INTO [dbms type;DATABASE=path].[unqualified filename] FROM [Table or Tables]
SELECT Table.Fields INTO [MDB文件种类;DATABASE=MDB文件路径].[MDB文件文件名称] FROM [Table or Tables]
至于【MDB文件种类】及【MDB文件路径】,视MDB文件或文件类型之不同而异,详见【注一】。
如果上面说的都清楚了,那我们要开始这一个练习了!
在 Form 上放置一个 CommandButton,加入 Microsoft DAO 3.51 Object Library,我们將使用 Biblio.mdb 的 authors Table,在 Command1_Click 中加入以下程序代码:
Dim db As Database
Set db = Workspaces(0).OpenDatabase(App.Path & "\biblio.mdb")
'db.execute "SELECT Table.Fields INTO [dbms type;DATABASE=path].[unqualified filename] FROM [Table or Tables]"
在以上程式中,db.execute 指令行之指令依MDB文件或文件的种类说明如下:
一、DBase文件
SQL 命令:SELECT * INTO [dBase III;DATABASE=MDB文件路径].[dbase文件名称] FROM [authors]
db.Execute "SELECT * INTO [dBase III;DATABASE=C:\test].[authors.DBF] FROM [authors]"
注意事項:
1、authors.DBF 事先不可存在,否则会产生错误!
2、若您沒有 Dbase,您可以使用 Access 来连結这个 Table,以便观察結果!
二、文本文件 (.Txt)
SQL 命令:SELECT * INTO [Text;DATABASE=文本文件路径].[文本文件名称] FROM [authors]
db.Execute "SELECT * INTO [Text;DATABASE=C:\test].[authors.TXT] FROM [authors]"
注意事項:
1、authors.TXT 事先不可存在,否则会产生错误!
2、此命令会产生的文件有二个,第一个就是文本文件 authors.TXT,第二个是 Schema.ini。
3、文本文件之格式为 CSV 之文件格式,以逗点分开,实际呈现方式如下:
"Au_ID","Author","Year Born"
1,"Jacobs, Russell",1950
2,"Metzger, Philip W.",1942
4、Schema.ini 若事先不存在会新产生一个,若已存在,则会在原文件后面直接 Append。
5、至于 Schema.ini 的內容为此次导出的相关资讯,格式同一般的 Ini 档,详細內容如下:
[authors.TXT]
ColNameHeader=True
CharacterSet=OEM
Format=CSVDelimited
Col1=Au_ID Integer
Col2=Author Char Width 50
Col3="Year Born" Short
三、Html 文件
SQL 命令:SELECT * INTO [Excel 8.0;DATABASE=Html文件路径].[Html文件名称] FROM [authors]
db.Execute "SELECT * INTO [HTML Export;DATABASE=C:\test].[authors.HTM] FROM [authors]"
注意事項:
1、authors.HTM 事先不可存在,否则会产生错误!
2、此命令会产生的文件有二个,第一个就是文本文件 authors.HTM,第二个是 Schema.ini。
3、Schema.ini 若事先不存在会新产生一个,若已存在,则会在原文件后面直接 Append。
4、至于 Schema.ini 的內容为此次导出的相关资讯,格式同一般的 Ini 档,详細內容如下:
[authors.HTM]
ColNameHeader=True
CharacterSet=ANSI
Format=HTML
Col1=Au_ID Integer
Col2=Author Char Width 50
Col3="Year Born" Short
四、Excel 文件
SQL 命令:SELECT * INTO [Excel 8.0;DATABASE=文件路径+档名].[工作表名称] FROM [authors]
db.Execute "SELECT * INTO [Excel 8.0;DATABASE=C:\test\authors.XLS].[authors] FROM [authors]"
注意事項:
1、authors.XLS 可事先存在,也可以不存在,会自动产生一个。
2、工作表 authors 事先不可存在,否则会产生错误!
五、Access 文件
SQL 命令:SELECT * INTO [新MDB文件路径+档名][新表名称] FROM [authors]
'导出到同一MDB文件 ( 新 Table 为 authors1 )
'新 Table authors1 事先不可存在,否则会产生错误!
db.Execute "SELECT * INTO [authors1] FROM [authors]"
'导出到不同的MDB文件 ( 新MDB文件为 db1,新 Table 为 authors )
'新MDB文件 db1事先必須存在,否则会产生错误!
'但是其中新 Table authors 事先不可存在,否则会产生错误!
db.Execute "SELECT * INTO [C:\test\db1.mdb].[authors] FROM [authors]"
注一:各种可能的MDB文件种类 Connect 属性設定方式:
MDB文件种类 MDB文件宣告方式 MDB文件路径 (或加上档名)
Microsoft Jet Database [database]; drive:\path\filename.mdb
dBASE III dBASE III; drive:\path
dBASE IV dBASE IV; drive:\path
dBASE 5 dBASE 5.0; drive:\path
Paradox 3.x Paradox 3.x; drive:\path
Paradox 4.x Paradox 4.x; drive:\path
Paradox 5.x Paradox 5.x; drive:\path
Microsoft FoxPro 2.0 FoxPro 2.0; drive:\path
Microsoft FoxPro 2.5 FoxPro 2.5; drive:\path
Microsoft FoxPro 2.6
16.txt
Microsoft Access秘密、技巧和陷阱
布莱恩C.布莱克曼
系统支持工程师,Microsoft Access Basic
摘要
这篇文章概括了当使用Microsoft Access 时,通过使用Access Basic可以增加应用程序的执行速度,减少编码量,同时也减少在为Microsoft Windows应用程序接口编程时、在开发应用程序中遇到的问题的技术。谨慎地使用变量和它所占用的存储空间能有效地减少一个应用程序所消耗的资源,同时也全面提高了它的性能。
不正确地调用Windows应用程序接口可能会产生一些意想不到的副作用,以及潜在地对一个应用程序的代码及数据段的破坏。正确地使用一个空的32位指针在Microsoft Access 中是十分必要的。
当对表格和报表进行操作时,Microsoft Access有一个无正式文本的特性。这个特性允许你从设计视窗性质sheet window中进行过程调用,调用的方法时同时按下shift和F2键。
介绍
Microsoft Access Basic提供了一个丰富的开发环境。这个开发环境给你足够的灵活性和对Microsoft Windows应用程序接口的控制,同时保护你使你免遭用高级或低级语言开发环境开发时所碰到的各种麻烦。不过,许多优化、有效数据和模块化方面只能是应用程序设计者才能使用。开发者应致力于谨慎地使用算法。除了一般的程序设计概念,还有一些特别的存储空间的管理技术,正确使用这些技术可以提高应用程序的执行速度,减少应用程序所要好的存储资源。
提高速度和减少代码量
你可以用几种技巧来提高你的编码速度,但是却找不到有效的算法的替代者。接下来的几点建议可以提高你的编码速度同时又减少你的应用程序消耗的存储空间。
使用整形数据类型进行数学运算
即使Microsoft Access 会使用一个联合处理器来处理浮点型算术,整型数算术也总是要快一些。当你的计算不含有小数,尽量使用整型或长整型而不是变量或双整型。整型除法同样也要比浮点除法要快。在使用其他一些有效的数据类型时会警告:没有任何东西可以替换有效的运算法则。
避免使用过程调用
避免在循环体中使用子程序或函数调用。每一次调用都因额外的工作和时间而给编码增大了负担。每一次调用都要求把函数的局部变量和参数压栈,而栈的大小是固定的,不能随便加大,并且同时还要于Microsoft Access共享。
谨慎使用不定长数据类型
不定长数据类型提供了更大的灵活性,比如说允许正确处理空值和自动处理溢出。另外这种数据类型比传统的数据类型要大并消耗更多的存储空间。前面还曾经提到过,不定长数据类型的变量在数学计算中比较慢。
用变量存放经常使用的属性
对变量进行查找和设置都比对属性进行这些操作要快。如果你要得到或查阅一个属性值许多次,那么把这个属性分配给一个变量,并用这个变量来代替属性,那么你的代码将要运行快得多。例如,在一个循环中,你查阅某表格中得一个控制的属性,那么在循环外把属性分配给一个变量,然后在循环中用查询一个变量来代替查阅一个属性的方法要比较快。
预载表格
当你的应用程序启动并且把它们的可见属性设置位‘false’时,如果你安装了你所有的表格,那么你的应用程序的性能会让你感觉挺快。当你需要显示一个表格时,你只需要把该表格的可见属性设置为‘true’,这要比安装一个表格要快得多。需要记住的是,为你安装的每个表格,你都要从应用程序的全局堆中消耗存储空间。
Access Basic中的陷阱
在Access Basic中经常碰到的陷阱是对动态连接库(DLLS)中的外部过程的调用。当你提供程序给你的用户,调用外部动态链接库时将出现使用警告;否则,你将得到一条错误信息:试图用相同的函数定义安装模块。
使用唯一的别名
在Access Basic中,如果你知道入口点(动态链接库中函数的名字),你可以调用动态链接库中的外部函数。不过,使用这一方法的限制性在于你只能声明外部函数一次。如果你安装了调用了你的模块调用的相同的Windows应用程序接口,你不会得到一个不为人所知的错误:试图用相同的函数定义安装模块。
你尝试安装的模块要么是包含有相同的函数名,要么是包含在已存在的模块中有的过程名。删除这些过程,在EDIT菜单中使用FIND命令找到重复的过程名,要解决这一问题,你需要使用一种叫做“别名使用“的技术。这种技术允许你给你的过程一个独一无二的名字。但是,你选择的别名也有可能不是独一无二的,所以要使你取的名字唯一,你可以用初始值和下划线优先声明你所有从动态链接库中调用的过程,比如,声明getActiveWindow为:
Declare bcb_GetActiveWindow Lib "Kernel" Alias "GetActiveWindow" () As Integer.
如何传递一个空指针给动态链接库
一个空的32位指针是有效的或是为一些动态链接库要求具有参数。要指定一个空值,使用0&。当你的函数调用一个过程并传递一个表达式0&,“&”指定一个32位的空指针,在函数声明中,一个AS ANY参数指示Access Basic对那个参数不进行类型检查,同时把值传递到被调用的函数。
下面的编码示范了一个正确的方法,告诉你如何声明一个给动态链接库中的过程传递一个空指针参数的Access Basic函数。这段声明了WriteProfileString应用程序接口函数。这个函数来自于外部Windows动态链接库“kernel”。
Declare Function WriteProfileString Lib "Kernel" (ByVal lpApplicationName As Any, ByVal lpKeyName As Any, ByVal lpString As Any)
接下来的函数调用了一个外部过程,位每个参数指定一个空值。这将使WriteProfileString充满它的内部高速缓冲区,并且WIN.INI的任何变化写到磁盘上。
重要的
对这个函数不正确的使用会引起一般性的保护故障或修改你的WIN.INI文件。
Function nFlushIniCache()
nFlushIniCache = WriteProfileString (0&, 0&, 0&)
End Function
如何从动态链接库中传递和接收无符号整型数
常常有这样一种情况,要从外部动态链接库调用的过程中返回一个两个字节长的无符号整型数。然而Access Basic不支持这种数据类型。正确地计算这种数据类型需要把它从一个无符号整型数转换程Access Basic长数据类型。
Access Basic整型数的范围使从-32768到32767。一个无符号整型数的范围是从0到65535。Access Basic用最明显的一位来放置数值的符号位,所以当数值超过32767,第16位将被置成负数符号。要计算一个无符号整型数,你必须人工调整第16位。
从无符号整型数转换到Access Basic长整型数或从Access Basic的长整型转换成无符号整型数有两种方法。第一种方法用到了最基本的数学运算(65535被无符号整型值加或减)。第二种方法使用Bitwise操作。实际上,算术方法和Bitwise方法工作起来效果一样,只不过,算术方法可能可读性更强一些,而Bitwise方法在执行时可能更快一些。
算术方法
下面的lArithUintToInt (nUint)和lArithIntToUnint(lBytes)过程示范了如何使用转换无符号整型数的算术方法。第一个函数读进一个无符号整型数同时返回一个已经转变位长整型的值。第二个函数读入一个长整型值,然后返回一个转变成无符号整型的值。
Function lArithUintToInt (nUint As Integer)
If nUint < 0 Then
lArithUintToInt = nUint + 65536
Else
lArithUintToInt = nUint
End If
End Function
Function nArithIntToUnint (lBytes As Long)
If lBytes > 32767 Then
nArithIntToUnint = lBytes - 65536
Else
nArithIntToUnint = lBytes
End If
End Function
按位操作方法
下面的nBWUintToInt(lBytes) 和 lBWIntToUint(nUint)过程示范了如何使用Bitwise方法转换无符号整型数。第一个函数读进一个无符号整型数,然后返回一个已经转换成长整型的值。第二个函数读入一个长整型值,然后返回一个已经转换的无符号整型值。第二个函数中使用了提示框的语句是为了防止当传递到函数的值大于64KB时会出现溢出信息。
1010001111100000 (-23584)
AND 1111111111111111 (FFFF&)
----------------
1010001111100000 (41952)
The functions follow:
Function lBWIntToUint(nUint As Integer)
lBWIntToUint = nUint And &HFFFF&
End Function
Function nBWUintToInt(lBytes As Long)
Dim nTemp As Integer
If lBytes > 65535 Then
MsgBox "You passed a value larger than 65535"
Exit Function
End If
nTemp = lBytes And &H7FFF
nBWUintToInt = nTemp Or -(lBytes And &H8000)
End Function
注意:&HFFFF&要求“&”在16进制数的末尾。这样能保证32位的16进制数通过16位的值表示出来。
Access Basic中的技巧
在Microsoft Access 中有一些以前无正式文本的特性,它们允许你指定过程,这个过程是从一个from或report的属性工作表窗中调用的。要进入最小窗口,只需要同时按下SHIFT和F2键。
BUILDER FORM函数
如果在一个模块中一个函数的定义是以“Builderr Form”开始同时包含一个类似于Onclose属性或事件标识符,按下SHIFT和F2键就可以调用这个过程。例如,当你在一个form的设计窗口中,而当前的光标落在属性窗口中的Onclose事件的编辑控制上,按下SHIFT和F2键将能调用BuilderFormOnclose函数。这使用于form和reports的大部分属性和所有事件。下面的代码将说明函数的格式:
Function BuilderFormOnClose (szFormName As String, szControlName As String, szCurrentValue As String, szReserved As String)
If szCurrentValue = "" Then
DoCmd SelectObject A_MACRO, "", True
SendKeys "%n%fs" & "New Macro" & "{Enter}"
Forms(szFormName).OnClose = "New Macro"
Else
DoCmd SelectObject A_MACRO, szCurrentValue, True
SendKeys "%d"
End If End Function
参数szFormName, szControlName, szCurrentValue, 和 szReserved必须声明,即使你从不使用它们。当你的函数被调用时,这些参数总是要被传递的。如果它们没有被声明,那么Microsoft Access将不会调用你的函数。如果有一个参数被分配到Onclose事件上,那么前面的过程将打开一个宏,如果编辑控制是空,那么代码产生一个名为“New Macro”的新宏,同时把编辑控制值设置为“New Macro”。诚然,前面的例子并不是非常完美,但它的确说明了要产生一个完美而有效的程序所必须的条件。
17.txt
Microsoft SQL Server 7.0 - OLAP 相关问题
【「Microsoft SQL Server 7.0」以下简称「SQL Server 7.0」】
问:安装SQL Server 7.0是否自动安装OLAP服务?
否,SQL Server 7.0和OLAP服务必须分别安装。
问:如何确定我已安装了OLAP服务?
答:请在"控制台"中的"服务"中查看是否有"MSSQLServerOLAPService"这项服务并且能正常启动。
问:启动"MSSQLServerOLAPService"这项服务时,出现"Can not start service. Access denied(服务不能启动。访问被拒绝)"的错误消息,如何解决?
OLAP安装的预设路径为"\Program Files\OLAP Services",如果您的计算机中有另一个目录名称为"program"则有可能有此问题。
问:我要如何获得OLAP循序渐进的教学资料,以便快速入门了解SQL Server 7.0所附的OLAP服务功能?
答:安装完SQL Server 7.0 OLAP之后,启动OLAP管理器(OLAP Manager),在右方窗口有一个"OLAP Manager Tutorial"。您可以按照这份说明跟做一次,就可以了解SQL Server 7.0所附的OLAP服务功能 。
问:如何将OLAP的MMC咬接(snap-in)加入SQL Server 7.0的企业管理器(Enterprise Manager)中?
答:
启动SQL Server 7.0企业管理器,选择菜单中"Console(控制台)"的"Options(选项)..."。
选中"Always open console in author mode(总是以编辑模式打开控制台)"。
重新启动SQL Server 7.0企业管理器。
选择菜单中"Console(控制台)"中的"Add/Remove Snap-in(添加/删除咬接)...."将OLAP加入。
问:执行OLAP创建元(dimensions)或立方体(cubes)时出现 ODBC error:: [Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for user 注释:\注释:.;28000;Time: [Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for user注释:\注释:.;28000;Time: 的错误消息,如何解决?
答:请将"MSSQLServerOLAPService"这项服务的帐号由"local system account(本地系统帐号)"改为域或本地用户帐号。
问:ADOMD的程序出现"run time error: No transaction is active(运行错误:没有有效的事务)"的错误消息,并且CPU的使用率达到100%,如何解决?
答:在ADOMD的程序使用了CommitTrans但没有使用BeginTrans时会出现这种情况,如:Dim cn As New ADODB.Connectioncn.Open "Provider=MSOLAP; Data Source = "cn.CommitTrans
18.txt
Microsoft SQL Server 7.0 备份及恢复相关问题
【「Microsoft SQL Server 7.0」以下简称「SQL Server 7.0」】
SQL Server 6.5的SQL语句能否转储(Dump)和加载(Load)SQL server 7.0?
可以进行备份(Backup)和恢复(Restore)。
恢复数据库时出现下列信息如何解决?SQL-DMO Error: Could not obtain exclusive lock on database Model
这是因为恢复数据库时,另外一个程序正在使用模型数据库, 请在恢复数据之前先以sp_who这个存储过程查看是否有人在使用模型数据库。
在Windows 95/98下SQL Server 7.0是否可以备份到磁带中?
不行,请将数据库备份到磁盘驱动器再由备份到磁带。
在Windows 95/98下您也可以执行如" EXEC sp_addumpdevice 注释:tape注释:, 注释:tapedump1注释:, 注释:\\.\tape0注释:"的指令,但是当您执行"backup database to tapedump1"时会出现如下的信息:Server: Msg 3201, Level 16, State 5, Line 1 Cannot open backup device 注释:tapedump1注释:. Device error or device off-line. See the SQL Server error log for more details. Server: Msg 3013, Level 16, State 1, Line 1 Backup or restore operation terminating abnormally.
并且在SQL Server 7.0 errorlog也会出现如下信息: BackupTapeFile::OpenMedia: Backup device 注释:\\.\tape0注释: failed to open. Operating system error = 2(The system cannot find the file specified.).
将SQL Server 7.0数据库备份到网络上时出现如下信息
Server: Msg 3201, Level 16, State 1, Line 1 Cannot open backup device 注释:E:\pubs.dat注释:. Device error or device off-line. See the SQL Server error log for more details. Server: Msg 3013, Level 16, State 1, Line 1 Backup or restore operation terminating abnormally.
并且在Error log出现
1998-12-29 11:58:21.62 kernel BackupDiskFile::CreateMedia: Backup device注释:E:\pubs.dat注释: failed to create. Operating system error = 5(Access is denied.).
如何解决?
这是由于权限不够造成的。 请确定SQL Server Service的帐号为域用户(Domain User),并且在网络上写权限。
是否可以将SQL Server 7.0数据库备份到压缩卷(Compressed Volume)?
可以的,但是不建议如此做,如果要将数据库备份到压缩卷,请在备份之前和恢复之后执行DBCC。
将发布的数据库的备份恢复到一台没有做复制的SQL Server 7.0中导致事务日志标示为副本(replication),如何解决?
可以参照下列两种方法:
可能的话,备份发布的数据库之前先将其取消发布。
恢复之前,在目标数据库中设置发布。
什么是差异备份(differential backup)?
差异备份是SQL Server 7.0提供的新功能,差异备份只记录上次完全份之后所做的变化。
19.txt
Microsoft SQL Server 7.0安全问题
【「Microsoft SQL Server 7.0」以下简称「SQL Server 7.0」】
SQL Server 7.0 有哪几种安全模式?
两种:SQL Server和Windows NT(混合)及Windows NT only。SQL Server 和Windows NT相当于SQL Server 6.5版本的混合模式。Windows NT only相当于SQL Server 6.5 版本的信任模式。在SQL Server 7.0版没有提供相当于SQL Server 6.5版本的标准模式。
SQL Server 6.5的SQL安全管理器(Security Manger)为何在SQL Server 7.0不见了,替代工具是什么?
SQL Server 7.0提供了安全向导(Security Wizard)来取代SQL安全管理器(Security Manger)。
使用SQL Server和 Windows NT(混合)安全模式的优点是什么?
非Windows NT 客户端,Internet 客户端亦可登录 。
提供多层保护 。
使用Windows NT only安全模式的优点是什么?
用户可以更快速登录SQLServer,而无需另外再记一个密码。
使用NT提供的密码设置功能,如最小密码长度(minimum password length),..
只需为NT组设定帐号和组设置。
如何设置SQL Server 的安全模式?
启动SQL Server企业管理器(Enterprise Manager)。
在控制台(console)树中,展开Microsoft SQL Servers,然后展开SQL Server Group或您设定的组,单击选择要设定的SQL Server。
单击鼠标右键,选择"属性(Properties)",然后选择"安全(Security)"选项卡。
在Security部分选择"SQL Server and Windows NT"或是"Windows NT only" 。
如何在SQL Server企业管理器中,设置允许一个Windows NT组或用户能登录SQL Server?
在SQL Server企业管理器中,展开要加入Windows NT组或用户帐号的SQL Server,再展开Security 文件夹,选择 login,然后单击鼠标右键,选择快捷菜单中的new login。
选择"General"选项卡,在Name字段中填入"域\帐号"或"域\组"。
在Authentication(身份验证)部分选择Windows NT Authentication(Windows NT身份验证),然后选择domain (域)。
在Default(默认)部分选择预设数据库和语言。
单击"OK(确定)按钮。
如何使用SQL Server存储过程,使一个Windows NT组或用户能登录SQL Server?
sp_grantlogin {注释:login注释:}
其中注释:login" 包含域及组/用户帐号,不可超过128个字符。
设定Windows NT组或用户登录SQL Server时需要注意哪些事项?
如果SQL Server的登录id对应于一个Windows NT组,添加或删除Windows NT组中的用户不需重新建立SQL Server 的登录id。
如果SQL Server的登录id对应于一个Windows NT组或用户,将此Windows NT组或用户删除并不会将此SQL Server 的登录id删除。
20.txt
Microsoft SQL Server 7.0安装问题(一)
1 安装SQL Server 7.0之前,我如何得到一些相关的信息和阅读安装手册?
2 运行SQL Server 7.0的系统需求有哪些?
3 SQL Server 7.0桌面版、标准版和企业版可以在哪几种操作系统中安装?
4 将SQL Server 7.0桌面版安装在Windows 95/98的计算机上,哪些功能受限制?
5 是否可以将SQLServer7.0安装在计算机名含有"-"的计算机上?
6 安装SQL Server 7.0Typical/Compact/Custom(典型/简捷式/自定义安装)差异?
7 选择character set及sort order需注意那些事项?
8 在没有网卡的计算机上,无法成功安装安装SQL Server 6.5, 此时一定要安装网卡驱动程序或安装拨号网络或安装MS LoopBack适配卡,SQL Server 7.0是否有相同问题?
9 SQL 7.0 是否与Microsoft System Management Server 1.2兼容?
10 SQL Server 7.0 的安装步骤如何?
11 无法成功安装 SQL Server 7.0,可以从哪些文档获得安装失败的可能原因?
12 是否可以只安装SQL Server 7.0联机书籍?
13 是否可以只安装SQLServer 7.0 Client和Profiler?
14 如果我只想安装客户端连接工具,在客户端需要安装Internet Explorer 4.01 Service Pack 1吗
15 在Windows 95的计算机上安装客户端连接工具时出现如下消息,如何解决?
16 安装SQL Server 7.0时如果按"Back"按钮再按"Next"按钮之前输入的信息会小时,必须要重新输入吗?
17 SQL Server 7.0新增/改变了哪些安装工具?
18 安装SQL Server 7.0 时为何会出现错误消息要求关闭ODBC组件?
安装SQL Server 7.0之前,我如何得到一些相关的信息和阅读安装手册?
您可以在安装SQLServer 7.0之前,先启动SQLServer 7.0联机书籍 (sqlbol.chm), 建议您在安装之前先阅读联机书籍中"Getting Started(出发)"和"Installing SQL Server(安装SQL Server)"这两部分以获得更多信息。
运行SQL Server 7.0的系统需求有哪些?
硬件:
CPU:DEC Alpha AXP 或 Intel Pentium 166 MHz或以上兼容机型,不支持PPC 或MIPS。
内存:32 MB ,企业版为64M RAM。如果要做副本或很大的数据库,建议最好有更多的内存。
硬盘空间: 完全安装210MB,典型安装185MB,最小安装80MB,只安装管理工具90MB。
文件系统:FAT或NTFS。
软件:
操作系统:Windows NT Server/Workstation 4.0 Service Pack4或以上的版本。Windows 95、Windows 98。
其它软件:Microsoft Internet Explorer 4.0 Service Pack1。
SQL Server 7.0桌面版、标准版和企业版可以在哪几种操作系统中安装?
SQL7.0\操作系统 Win9X NTW NTS NTSE
桌面版 可以 可以 可以 可以
标准版 可以 可以
企业版 可以
将SQL Server 7.0桌面版安装在Windows 95/98的计算机上,哪些功能受限制?
传入命名的管道连接
Windows NT身份验证
异步I/O
基于事务的发布功能
群集全文搜索
Unicode文件的自动检测
是否可以将SQLServer7.0安装在计算机名含有"-"的计算机上?
可以。
安装SQL Server 7.0Typical/Compact/Custom(典型/简捷式/自定义安装)差异?
典型安装:此为最常使用的安装方式:
预设的网络库(Net library):Windows NT为命名管道(Named pipe),TCP/IP以及多重协议(Multi- Protocol), Windows 95/98为TCP/IP。
预设的字符集:ISO(1252)(英文 Windows如果是中文Windows为CP950 )。
预设的搜索顺序:字典次序,大小写不敏感。
预设的安装目录:<系统驱动器>:\MSSQL7
简捷式安装:该方式安装不安装下列组件:
SQL Server Enterprise Manager(SQL Server企业管理器)
SQL Server Profiler(SQL Server简档生成程序)
SQL Server Query Analyzer(SQL Server查询分析器)
Version Upgrade Wizard(版本更新向导)
Client Diagnostic Utilities(客户诊断使用工具)
Books Online(联机书籍)
Replication objects(复制对象)
MS DTC Client Support(MS DTC客户支持)
Development Files(开发文件)
Sample Files(示例文件)
Server Debug Symbols(服务器调试符号)
用户自定义安装:
可自定义要安装的网络库(Net library)。
可自定义搜索顺序。
可自定义要安装的管理工具。
可自定义是否要安装联机书籍。
选择character set及sort order需注意那些事项?
在一台SQL Server上只能设定一种字符集和一种排次序,即一台SQL Server上所有的数据库字符集和牌子需次序均相同,如果重新设置字符集或排序次序,则所有的数据库都必须重新创建。
如果此SQL Server7.0将来要将SQL Server 6.X数据库转换成SQL 7.0数据库,那么字符集和排序次序的设置要与 SQL Server 6.X数据库的SQL Server 6.x的设置系统。
在没有网卡的计算机上,无法成功安装安装SQL Server 6.5, 此时一定要安装网卡驱动程序或安装拨号网络或安装MS LoopBack适配卡,SQL Server 7.0是否有相同问题?
没有,SQL server 7.0在没有安装网卡的计算机上也不需另外安装安装拨号网络或安装MS LoopBack适配卡。
SQL 7.0 是否与Microsoft System Management Server 1.2兼容?
不兼容。
SQL Server 7.0 的安装步骤如何?
安装SQL Server 7.0 于Windows NT上大致步骤如下:
以拥有管理员权限的用户登录。
如果尚未安装Windows NT service pack4请先安装。
如果尚未安装Internet explorer 4.0 service pack 1请先安装。
如果安装企业版,请先安装Windows NT 4.0 Clustering Hotfix。
执行安装程序。
无法成功安装 SQL Server 7.0,可以从哪些文档获得安装失败的可能原因?
先检查:
\MSSQL7\log\errorlog
\MSSQL7\install\cnfgsvr.out
再检查:
\sqlstp.log
\sqlsetup.log
\sqlsetup.out files
安装目录下的任何文件(e.g. \MSSQL7\*.*)
是否可以只安装SQL Server 7.0联机书籍?
可以,您可以选择自定义安装方式,然后选择联机书籍(Books Online)。
是否可以只安装SQLServer 7.0 Client和Profiler?
可以的,您可以选择自定义安装方式,然后选择Client Connectivity和Profiler。
如果我只想安装客户端连接工具,在客户端需要安装Internet Explorer 4.01 Service Pack 1吗
不需要,但是如果要安装管理工具或联机书籍,则需要安装Internet Explorer 4.01 Service Pack 1。
在Windows 95的计算机上安装客户端连接工具时出现如下消息,如何解决?
Based on your selection setup has determined the following systems requirements are not met. Exit setup and install the missing requirements from the CD or change your selections. Distributed Component Object Model (DCOM) for Microsoft Windows 95
出现这个讯息是因为所需的DCOM 组件没有安装到您的Windows 95计算机中,您可以从SQL Server 7.0的CD安装 DCOM,安装完后请重新启动机器再安装SQL Server 7.0。
安装SQL Server 7.0时如果按"Back"按钮再按"Next"按钮之前输入的信息会小时,必须要重新输入吗?
这是InstallShield对话框的限制。
SQL Server 7.0新增/改变了哪些安装工具?
RegistryRebuild(regrebld.exe):重建注册表,并且可备份和恢复开关。
Rebuild Master(rebuildm.exe):重建主数据库。
Remote Installation:可以远程安装SQL Server 7.0。
SQL Server Client Configuration Utility: 在控制台中使用的SQL Server 7.0 Client Configuration Utility。
SQL Server Network Utility:列出所有安装的网络动态连接库。
VSwitch.exe:在SQL Server 7.0和SQL Server 6.x之间切换。
安装SQL Server 7.0 时为何会出现错误消息要求关闭ODBC组件?
安装SQL Server 7.0时,当安装Microsft Data Access Components(MDAC) 2.1版时,会安装新的ODBC组件,所以会要求关毕所有使用ODBC的程序。
21.txt
SQL的基本操作(1.数据类型)
1.数据类型
数据类弄是数据的一种属性,表示数据所表示信息的类型。任何一种计算机语言都定义了自己的数据类型。当然,不同的程序语言都具有不同的特点,所定义的数据类型的各类和名称都或多或少有些不同。SQL Server 提供了 25 种数据类型:
·Binary [(n)]
·Varbinary [(n)]
·Char [(n)]
·Varchar[(n)]
·Nchar[(n)]
·Nvarchar[(n)]
·Datetime
·Smalldatetime
·Decimal[(p[,s])]
·Numeric[(p[,s])]
·Float[(n)]
·Real
·Int
·Smallint
·Tinyint
·Money
·Smallmoney
·Bit
·Cursor
·Sysname
·Timestamp
·Uniqueidentifier
·Text
·Image
·Ntext
(1)二进制数据类型
二进制数据包括 Binary、Varbinary 和 Image.
Binary 数据类型既可以是固定长度的(Binary),也可以是变长度的。
Binary[(n)] 是 n 位固定的二进制数据。其中,n 的取值范围是从 1 到 8000。其存储窨的大小是 n + 4 个字节。
Varbinary[(n)] 是 n 位变长度的二进制数据。其中,n 的取值范围是从 1 到 8000。其存储窨的大小是 n + 4个字节,不是 n 个字节。
在 Image 数据类型中存储的数据是以位字符串存储的,不是由 SQL Server 解释的,必须由应用程序来解释。例如,应用程序可以使用 BMP、TIEF、GIF 和 JPEG 格式把数据存储在 Image 数据类型中。
(2)字符数据类型
字符数据的类型包括 Char,Varchar 和 Text。
字符数据是由任何字母、符号和数字任意组合而成的数据。
Varchar 是变长字符数据,其长度不超过 8KB。Char 是定长字符数据,其长度最多为 8KB。超过 8KB 的ASCII 数据可以使用Text 数据类型存储。例如,因为 Html 文档全部都是 ASCII 字符,并且在一般情况下长度超过 8KB,所以这些文档可以 Text 数据类型存储在 SQL Server 中。
(3)Unicode 数据类型
Unicode 数据类型包括 Nchar,Nvarchar 和Ntext。
在 Microsoft SQL Server 中,传统的非 Unicode 数据类型允许使用由特定字符集定义的字符。在 SQL Server 安装过程中,允许选择一种字符集。使用 Unicode 数据类型,列中可以存储任何由Unicode 标准定义的字符。在 Unicode 标准中,包括了以各种字符集定义的全部字符。使用Unicode 数据类型,所战胜的窨是使用非 Unicode 数据类型所占用的窨大小的两倍。
在 SQL Server 中,Unicode 数据以 Nchar、Nvarchar 和 Ntext 数据类型存储。使用这种字符类型存储的列可以存储多个字符集中的字符。当列的长度变化时,应该使用 Nvarchar 字符类型,这时最多可以存储 4000 个字符。当列的长度固定不变时,应该使用 Nchar 字符类型,同样,这时最多可以存储 4000 个字符。当使用 Ntext 数据类型时,该列可以存储多于 4000 个字符。
(4)日期和时间数据类型
日期和时间数据类型包括 Datetime 和 Smalldatetime 两种类型。
日期和时间数据类型由有效的日期和时间组成。例如,有效的日期和时间数据包括“4/01/98 12:15:00:00:00 PM”和“1:28:29:15:01 AM 8/17/98”。前一个数据类型是日期在前,时间在后一个数据类型是霎时间在前,日期在后。在 Microsoft SQL Server 中,日期和时间数据类型包括Datetime 和 Smalldatetime 两种类型时,所存储的日期范围是从 1753 年 1 月 1 日开始,到 9999 年12 月 31 日结束(每一个值要求 8 个存储字节)。使用 Smalldatetime 数据类型时,所存储的日期范围是 1900 年 1 月 1日 开始,到 2079 年 12 月 31 日结束(每一个值要求 4 个存储字节)。
日期的格式可以设定。设置日期格式的命令如下:
Set DateFormat {format | @format _var|
其中,format | @format_var 是日期的顺序。有效的参数包括 MDY、DMY、YMD、YDM、MYD 和 DYM。在默认情况下,日期格式为 MDY。
例如,当执行 Set DateFormat YMD 之后,日期的格式为年 月 日 形式;当执行 Set DateFormat DMY 之后,日期的格式为 日 月有年 形式
(5)数字数据类型
数字数据只包含数字。数字数据类型包括正数和负数、小数(浮点数)和整数 。
整数由正整数和负整数组成,例如 39、25、0-2 和 33967。在 Micrsoft SQL Server 中,整数存储的数据类型是 Int,Smallint 和 Tinyint。Int 数据类型存储数据的范围大于 Smallint 数据类型存储数据的范围,而 Smallint 据类型存储数据的范围大于 Tinyint 数据类型存储数据的范围。使用 Int 数据狗昔存储数据的范围是从 -2 147 483 648 到 2 147 483 647(每一个值要求 4个字节存储空间)。使用 Smallint 数据类型时,存储数据的范围从 -32 768 到 32 767(每一个值要求2个字节存储空间)。使用 Tinyint 数据类型时,存储数据的范围是从0 到255(每一个值要求1个字节存储空间)。
精确小娄数据在 SQL Server 中的数据类型是 Decimal 和 Numeric。这种数据所占的存储空间根据该数据的位数后的位数来确定。
在SQL Server 中,近似小数数据的数据类型是 Float 和 Real。例如,三分之一这个分数记作。3333333,当使用近似数据类型时能准确表示。因此,从系统中检索到的数据可能与存储在该列中数据不完全一样。
(6)货币数据表示正的或者负的货币数量 。在 Microsoft SQL Server 中,货币数据的数据类型是Money 和 Smallmoney。Money 数据类型要求 8 个存储字节,Smallmoney 数据类型要求 4 个存储字节。
(7)特殊数据类型
特殊数据类型包括前面没有提过的数据类型。特殊的数据类型有3种,即 Timestamp、Bit 和 Uniqueidentifier。
Timestamp 用于表示SQL Server 活动的先后顺序,以二进投影的格式表示。Timestamp 数据与插入数据或者日期和时间没有关系。
Bit 由 1 或者 0 组成。当表示真或者假、ON 或者 OFF 时,使用 Bit 数据类型。例如,询问是否是每一次访问的客户机请求可以存储在这种数据类型的列中。
Uniqueidentifier 由 16 字节的十六进制数字组成,表示一个全局唯一的。当表的记录行要求唯一时,GUID是非常有用。例如,在客户标识号列使用这种数据类型可以区别不同的客户。
2.用户定义的数据类型
用户定义的数据类型基于在 Microsoft SQL Server 中提供的数据类型。当几个表中必须存储同一种数据类型时,并且为保证这些列有相同的数据类型、长度和可空性时,可以使用用户定义的数据类型。例如,可定义一种称为 postal_code 的数据类型,它基于 Char 数据类型。
当创建用户定义的数据类型时,必须提供三个数:数据类型的名称、所基于的系统数据类型和数据类型的可空性。
(1)创建用户定义的数据类型
创建用户定义的数据类型可以使用 Transact-SQL 语句。系统存储过程 sp_addtype 可以来创建用户定义的数据类型。其语法形式如下:
sp_addtype {type},[,system_data_bype][,'null_type']
其中,type 是用户定义的数据类型的名称。system_data_type 是系统提供的数据类型,例如 Decimal、Int、Char 等等。 null_type 表示该数据类型是如何处理空值的,必须使用单引号引起来,例如'NULL'、'NOT NULL'或者'NONULL'。
例子:
Use cust
Exec sp_addtype ssn,'Varchar(11)',"Not Null'
创建一个用户定义的数据类型 ssn,其基于的系统数据类型是变长为11 的字符,不允许空。
例子:
Use cust
Exec sp_addtype birthday,datetime,'Null'
创建一个用户定义的数据类型 birthday,其基于的系统数据类型是 DateTime,允许空。
例子:
Use master
Exec sp_addtype telephone,'varchar(24),'Not Null'
Eexc sp_addtype fax,'varchar(24)','Null'
创建两个数据类型,即 telephone 和 fax
(2)删除用户定义的数据类型
当用户定义的数据类型不需要时,可删除。删除用户定义的数据类型的命令是 sp_droptype {'type'}。
例子:
Use master
Exec sp_droptype 'ssn'
注意:当表中的列还正在使用用户定义的数据类型时,或者在其上面还绑定有默认或者规则时,这种用户定义的数据类型不能删除。
22.txt
SQL的基本操作(2.数据库的相关操作)
1.如何创建数据库
(1).使用 Create Database 创建数据库
Create Database 语名的语法形式如下:
Create Database database_name
[On
{[Primary](Name=logical_file_name,
Filename='os_file_name'
[,Size=size]
[,Maxsize=max_size]
}[,...n]
]
[Log On
}(Name=Logical_name,
Filename='os_file_name'
[,Size=size])
}[,...n]
]
[For Restore]
注释:
Primary:该选项是一个关键字,用来指定主文件组中的文件。主文件组不公包含了数据库系统表中的全部内容,而且还包含了没有在用户文件组中包含的全部对象。一个数据库只能有一个主文件。在默认情况下,即在没有指定Primary关键字时,列在语句中的第一个文件就是主文件。
Name:该选项指定数据库的逻辑名字,这是在SQL Server 系统中使用的名称,是数据库在SQL Server 中标识符。
Filename:该选项用来指定数据库所在文件的操作系统文件名称和路径。在os_file_name中的路径必须是SQL Server 所在服务器上的一个文件夹。该操作系统文件名称与Name 的逻辑名称是一一对应的。
Size:该选项用来指定数据库操作系统文件的大小。在指定文件大小的时候,既可以使用MB单位,也可以使用KB单位。如果没有指定单位,那么系统默认的单位是MB。文件最小是1MB,也就是说,数据库所在的文件不能小于1MB。在默认情况下,数据库数据文件的大小是3MB,数据库日志文件的大小是1MB。
Maxsize:该选项用来指定操作系统文件可以增长的最大尺寸。在指定文件增长尺寸的时候,既可以使用MB单位,也可以使用KB单位。如果没有指定单位,那么系统的默认单位是MB。如果没有指定文件可以增长的最大尺寸,那么系统的增长是没有限制的,可以占满整个磁盘空间。
FielGrowth:该选取项用来指定文件的增量,当然该选项不能与Maxsize选项有冲突。该选项指定的数据值为零时,表示文件不能增长。该选项可以用MB、KB和百分比指定。
例子:
创建一个cust数据库,该数据库的主数据文件的逻辑名称是cust_data,操作系统文件是cust.mdf,大小是15MB,最大是30MB,以20%的速度增加;该数据库的日志文件的逻辑名称是cust_log,操作系统是cust.ldf,大小是3MB,最大是10MB,以1MB的速度增加。
Create Database cust
On
Primary (Name=cust_data,
Filename='d:\cust.mdf',
Size=15MB,
Maxsize=30MB,
Filegrowth=20%)
Log On
(Name=cust_log,
Filename='d:\cust.ldf',
Size=3MB,
Maxsize=10MB,
FileGrowth=1MB)
2.如何增加数据库的大小
(1).使用Alter Database命令来增加数据库文件的大小
如果在创建数据库文件时没有配置文件的大小自动增长,那么可以使用Alter Database命令来增加文件的大小。
例子:
将数据库cust的数据文件cust_data的大小调整为50MB。
Alter Database cust
Modify File (Name='cust_data',Size=50)
(2).使用Add File 增加一个次要文件
通过为数据库增加次要的数据文件和日志文件来增加数据库的大小。
例子:
Alter Database cust
Add File
(Name=cust_data2,Filename='d:\cust2.mdf',
Size=5MB,
Maxsize=10MB,
Filegrowth=10%)
3.压缩数据库和数据文件
(1)使用Dbcc Shrinkdatabase 命令压缩整个数据库
例子:
将cust数据库的大小压缩到10%
Dbcc Shrinkdatabase (cust,10)
(2)使用Dbcc ShrinkFile命令压缩数据库中的某一个数据文件
例子:
将cust数据文件的大小压缩到5MB
Dbcc ShrinkFile (cust,5)
4.删除数据库
(1)使用Drop命令删除数据库
例子:
将删除cust数据库
Drop Database cust
23.txt
SQL的基本操作(3.表的相关操作)
1.创建表
(1)用Create Table 命令创建表
语法:
Create Table tabl_name
({
}column_name As computed_column_expression
}
}[,...n]
)
[On {fiegroup | Default}]
[Textimage_On {fiegroup | Default}]
例子:
打开cust数据库,创建一个表,该表包含了学生的有关信息,即有学号、姓名、性别、出生日期、籍贯、联系电话、住址和备注信息。
Use cust
Create Table students
(
number int not null,
name varchar(10) not null,
sex char(2) null,
birthday datetime null,
hometown varchar(30) null,
telphone_no varchar(12) null,
address varchar(30) null,
others varchar(50) null
)
在这个表中number表示学生代号,数据类型为int,不允许为空;name表示学生姓名,数据类型为varchar,长度为10,不允许为空;sex表示学生的性别,数据类型为char,长度为2,允许为空;birthday表示学生的出生日期,数据类型为datetime,允许为空;hometown表示学生的籍贯,数据类型为varchar,长度为30,允许为空;telephone_no表示学生的联系电脑,数据类型为varchar,长度为12,允许为空;address表示学生的住址,数据类型为varchar,长度为30,允许为空;others表示学生的备注信息,长度为50,允许为空。
2.修改表的结构
(1)使用T-SQL语句增加和删除一个新列
语法:
Alter Table table
{
ADO
{[]
|colun_name As computed_column_expression
|[]
}[,...n]
|Drop
{Column column
}[,...n]
}
例子:打开cust数据库,修改其中的表students的结构,增加一个新字段,字段名为ying,数据类型是varchar,长度是10,没有默认值,充许为空。
Use cust
Alter Table students Add ying varchar(10) null
打开cust数据库,修改其中的表students的结构,删除一个字段,字段名为ying。
Use cust
Alter Table students Drop Column ying
3.向表中插入数据
(1)用 Insert 语句
语法如下:
Insert [Into]
{table_name|view_name}[(column_list)]
{Values|values_list|select_statement}
注意:在插入数据时,字符数据和日期数据要使用引号引起来。
例子:
Use cust
Insert Into students
Values (11,"影子","男","1999-12-12","湖北","83779805","武汉市桥口区","VB爱好者")
打开cust数据库,向students表中插入数据
(2)用Default 选项
在插入数据时,可以使用Default选项。Default选项有两种形式,一种形式是Default Values,另一种是Default。
Default Values 形式为表中的某一行的所有列插入默认值。使用这种形式的前提条件是表中的所有列必须是这四种类型之一:Identity属性,Timestamp数据类型,允许为Null,或者有一个指定的默认值。否则,会错误信息。
例子:
Use cust
Insert Into students Default Values
这个例子会出现错误,因为students表的number字段是设置为不允许为空的。
Default 形式是为表中的某一列插入默认值。要插入的该列必须具备一定的条件,即该列要么是Timestamp 数据类型,要么是允许为Null,要么是有一个指定的默认值,否则,会出现错误信息。
例子:
Use cust
Insert Into students Values(11,"影子",Default,Default,Default,Default,Default,Default)
由天前2个字段不能为空,所以要赋值,否则会出现错误,而后面的6个字段允许为空,因此可以调用Default默认。
(3)插入部分数据
在使用Insert语句插入数据是,还可以插入部分数据,也就是可以为每一行的指定的部分列插入数据。在插入部分数据时,应该注意以下三个问题:
☆在 Insert 子句中,指定要插入数据的列名。
☆在 Values 子句中,列出与列名对应的数据。列名的顺序和数据的顺序应该完全对应。
☆在 Insert 子句中,没有列出的列应该至少具有这四种类型之一:Identtty 属性,Timestamp 数据类型,允许为 Null,或者有一个指定的默认值。否则,会出现错误信息。
例子:
Use cust
Insert Into students (number,name)
Values (110,"影子")
打开cust数据库,向students表中插入一行数据
注意:如用下例语句将发生错误,因为name字段是不允许为空的(在创建数据库时设定的)
Insert Into students (number)
Values (110)
(4)用 Select 语句插入多条数据
Insert 语句插入数据的特点是每一次只能插入一行数据。相反,Select 也可以用在 Insert 语句中,并且可以一次插入多条数据。使用 Select 语句插入数据的语法形式如下:
Insert table_name
Select column_list
From table_list
Where search_conditions
在使用 Select 语句插入数据时,应该注意下面几点:
☆在 Insert 语句中使用 Select 时,他们参考的表既可以是相同的,也可以是不同的。
☆要插入数据的表必须已经存在。
☆要插入数据的表必须和 Select 的结果集兼容。兼容的含义是列的数量和顺序必须相同,列的数据类型或者相同,或者SQL Server 可以自动转换。
例子:
Use cust
Insert students
Select number,name,sex,birthday,hometown,telphone_no,address,others
From students
注意:
Select 后面的字段要输完整,这个例子是自己向自己插入多条数据(自己向自己插入是被允许的)
补充:
你还可以“From students”后面加上“Where name="影子"”,只插入name等于影子的记录,可以用And 和 Or 加上多个条件。
(5)使用 Select Into 插入数据到一个新表中
带有 Into 子句的 Select 语句允许用户定义一个新表并且把数据插入到新表中。这种方法不同于前面讲述的那些方法。在前面的那些方法中,一个共同的特点,是在数据输入之前表已经存在。而使用 Select Into 插入数据的方法,是在插入数据的过程中建立新表。
Select Into 语句的语法如下:
Select select_list
Into new_table_name
From table_list
Where search_conditions
在使用 Select Into 插入数据时,要注意下面几点:
☆在某个数据库中使用 Select Into 插入数据时,设置该数据库的 Select Into/Bulk Copy 为真。
☆新表不能存在,否则会产生错误信息。
☆新表中的列和行是基于查询结果集
☆要插入的数据不记录在日志中。
☆在select_list 中出现的列应该使用别名,否则,新表中的列没有列名。没列名的表只能通过 Select * From new_table_name 的形式查询。因此,应该为列起个别名。
☆这种方法多用在对列进行各种计算的情况。
例子:
Select number,name
Into newcust1
From students
创建新的表newcust1,插入students表中的number和name字段的所有数据。
补充:如果要插入所有字段的记录,则“Select *”,也可在“From students”后加条件,方法和上个例子一样。
(6)用 UPdate 语句修改表中的数据
Update 语句用来修改表中已存在的数据。Update 语句既可以一次修改一行数据,也可以一次修改许多行,甚至可以一次修改表中的全部数据。Update 语句使用 Where 子句指定要修改的行,使用 Set 子句给出新的数据。新数据可以是常量,也可以是指定的表达式,还可以是使用 From 子句来自其他表的数据。
Update 语句的语法如下:
Update {table_name|view_name}
Set {column_list}=expression [,. . .]
[Where clause]
在使用 Update 语句时,如果没有使用 Where 子句,那么就对表中所有的行进行修改。如果使用Update 语句修改数据时与数据完整性约束有冲突,那么修改就不会发生,整个修改事务全部滚回。例如,这种冲突可能是所输入的值是错误的数据类型,或者所输入的值违背了在该列定义的规则约束,等等。
例子:
Use cust
Update students
Set name=name+"007"
Where number>100
打开cust数据库,修改students表,使number>100的数据的name的值全部加"007"。
4.用 Delete 语句删除表中的数据
当数据库中的数据不需要的进修可以删除。一般情况下,删除数据使用 Delete 语句。Delete 语句可以一次从一个表中删除一条或者多条数据行。
Delete 语句的语法如下:
Delete [From] table_name
Where search_conditions
在 Delete 语句中如果使用了 Where 子句,那么就从指定的表中删除满足 Where 子句条件的数据行。
例子:
Use cust
Delete students
Where number>100
删除 students中,number>100的数据
补充:
如果在 Delete 语句中没有指定 Where 子句,那么就将表中所有的记录全部删除,即 Delete students 语句删除表中的全部记录。
在删除表中的全部数据时,还可以使用 Truncate Table 语句。Truncate Table 语句和 Delete 语句都可以将表中的全部数据删除,但是,两条语句又有不同的特点。当用户使用 Delete 语句删除数据时,被删除的数据要记录在日志中。并不将对数据的变化记录在日志中。因此,使用 Truncate Table students 语句删除记录的速度快于使用 Delete students 语句删除表中记录的速度。
5.用 Drop Table 命令删除表
当数据库中的表不需要时可以删除。删除表可以使用 Drop Table 语句。删除表就是删除表的定义以及表的全部数据、索引、触发器、约束和指定该表的许可。当删除表时,基于表的视图不能被删除,必须使用 Drop View 语句删除视图。
Drop Table 语句的语法如下:
Drop Table table_name
例子:
Use cust
Drop Table students
删除cust数据库中的students表。
补充:
不能使用 Drop Table 语句删除正在被约束参考的表,必须首先要么删除外键约束,要么删除参考表。表的所有者可以删除表。当删除表是时,绑定在该表上的规则或者默认则失掉了绑定,该表的约束或者触发器则自动被删除。如果重新创建表,必须重新绑定相应的规则和默认、重新创建触发器和增加必要的约束。另外,系统表不能删除。
删除表的许可属于表的所有者。然而,数据所有者(DBO)、系统管理员(SA)和DLL管理员可以删除数据库中的任何对象。
24.txt
SQL的基本操作(4.数据的检索)
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
25.txt
SQL在VB中的使用及访问远程数据库
VB 5.0数据库设计技术讲座(5)
(作者:倪秉书)
SQL在VB数据库中的使用
在VB中要想灵活地操作数据库,完成各种复杂操作,就需要掌握结构化查询语言SQL语言。比如在Data控件中,如果数据源是来自两个或两个以上的表时,就要使用SQL。SQL语言的操作根据其功能分为:数据查询语言(DQL)、数据操作语言(DML)、数据定义语言(DDL)以及数据控制语言(DCL)。
1.数据查询语言(DQL)
数据查询负责从表中提取数据并把它交给应用程序,格式如下:
SELECT (字段列表) FROM (表格清单) WHERE (表达式)
仍以前面的Myfile库为例,要得到“张清源”的电话,可以使用下面的查询:
SELECT 电话 FROM Phone WHERE 姓名=“张清源”
SELECT语句的第一部分指名要选取的列,可以包括用逗号分开的一系列字段列表。如果要选择表中的所有字段,可以用星号(*)代替要输入的字段名,比如:
SELECT * FROM Phone
SELECT语句的第二部分指明要从哪些表中查询数据。在此例中,要查询的表名只有一个Phone,SQL允许从一个或多个表中查询数据,表间用点号分隔。比如:
SELECT 姓名,作品 FROM Phone,Article WHERE Phone.序号=Address.序号
表达式根据需要也可以使用程序设计语言中使用的逻辑运算符NOT、AND和OR。
2.数据操作语言(DDL)
(1)插入记录(Insert或Insert into):允许在表中添加新记录,比如:
INSERT INTO Phone(姓名,电话,地址) VALUES (′张三′,′3433514′,′福建福州′)
在第一个括号中指定一个或多个要被插入数据的字段名称,在第二个括号中给出对应的实际值,用逗号隔开多个字段名。这个语句把三个字符串“张三”、“3433514”、“福建福州”分别插入表Phone的姓名、电话和地址字段中,形成一个新的记录。
如果在用INSERT添加一条新记录时,有一个或多个字段没有提供字段值时,系统一般会插入一个缺省值或一个空值:
SELECT * INTO Phone2 FROM Phone
可以有选择地从一个表向另一个表插入多条记录,上例表示把Phone表中的所有记录都插入Phone2中。
(2) 删除记录(Delete):从表中删除一个或多个记录,一般后跟WHERE 子句,用来选择要删除的记录。
例如,下面的这个DELETE语句只删除姓名字段的值为“张三”的记录:
DELETE Phone WHERE 姓名=′张三′
如果不给出WHERE 子句,表中的所有记录都将被删除。
(3)更新记录(Update):修改表中已经存在的一条或多条记录,UPDATE语句也可以使用WHERE子句来选择更新特定的记录:
UPDATE 〈表名〉 SET 〈字段1=值1,字段2=值2,...〉 [WHERE 表达式]
UPDATE Phone SET 姓名=′李四′WHERE 电话=′3433215′
如果不提供WHERE子句,表中的所有记录都将被更新,这在成批修改诸如价格等字段是很有用的。
3.数据定义语言(DDL)
DDL允许创建或修改表、列和索引,但不能创建数据库,要创建数据库要用CreateDatabase方法。数据定义语言语句包括:
(1)创建新表(Create Table)和删除表,比如:
CREATE TABLE Phone2(姓名 CHAR(15),工资 INT)
DROP TABLE Phone2
(2)修改表,即在表中增加或删除列的操作(Alter table):比如,
ALTER TABLE Phone2 ADD COLUMN 备注 TEXT
ALTER TABLE Phone DROP COLUMN 备注
(3)在表中建立索引(Create Index)和删除索引(Drop Index)
CREATE INDEX NameIndex ON Phone2(姓名)
DROP I
ODBC方式访问远程数据库
网络上的许多应用,比如IDC(Internet数据库连接器)、ASP(Active 服务器页)以及Microsoft DBWeb(一种Internet服务器应用编程接口)等需要访问远程数据库时,要通过ODBC (Open DataBase Connectivity)即开放式数据库连接来进行。
1. 配置ODBC
ODBC通过DSA(Data Source Administrator)程序来管理,它负责在ODBC注册表中创建一个指定的项。而在程序中调用ODBC时,ODBC驱动程序管理器激活正在使用的相应数据库的驱动程序。
要在ODBC注册表中创建一数据源项,打开Windows中的“控制面板”,选择“32位ODBC”,来安装和配置特定数据源所需要的驱动程序(图1)。
图1 ODBC数据源管理器
在打开的“ODBC数据源管理器”中,可以看到“用户DSN”、“系统DSN”、“文件DSN”、“ODBC驱动程序”等几个选项卡,其中前面三个选项卡描述了DSN的三种类型:
(1)用户DSN→用户DSN选项卡:用户DSN代表计算机的本地数据库,只能应用在当前机器上,由当前的一个用户使用,并且只对用户可见。
(2)系统DSN→系统DSN选项卡:储存了如何与数据提供者连接的信息,当前计算机上的所有用户都可以使用系统DSN,它并不仅限于单个用户。
(3)文件DSN→文件DSN选项卡:文件DSN可以由所有安装了相同驱动程序的用户共享。这些数据源不只限于某一用户或单一计算机专用。当要建立一个与Web服务器一起使用的数据源时,我们应该建立一个文件数据源,建立这样的文件数据源后,连接信息存储在一个实际的文件中,不止一个用户可以访问这个文件。并且通过复制扩展名为.DSN的文件,可以轻易地把应用从一个机器移植到另一个机器。由于以上原因,本讲中的示例使用文件DSN。
要登记注册一个数据源,可根据实际访问的需要点击相应的选项卡,比如“文件DSN”选项卡,点击“添加”按钮,选择第一个“Microsoft Access Driver(*.mdb)”表示要访问的是Access数据库;接下来键入一个要创建的数据源名称,比如“AccessODBC”,点击“下一步”和“完成”;最后在数据库对话框内点击“选取”,选择需要访问的数据库,此时如果点击“高级”按钮,还可对数据源增加用户号(UID)和密码(PWD),系统默认的用户号为admin,密码为空。最后按“确定”退出,在列表中就可以看到我们所创建的数据源了。
有了以上的注册,我们在应用程序中就可通过ODBC访问数据库了,通过ODBC访问远程服务器的数据库有三种方法:使用Jet数据库引擎、通过ODBC使用ODBC API绕过Jet引擎直接到达数据源或者使用远程数据对象(RDO)。
2.通过Jet引擎访问数据源
如果使用ODBC数据源时,不用给出物理数据库文件名,而是向ODBC驱动程序发出一个引用信息,当一个库改变时,只要在“控制面板”中重新配置ODBC即可,而不必改变应用程序的代码。例如:
ODBCConnect="ODBC;DSN=AccessODBC;UID=admin;PWD="
在例子中,创建一个ODBCConnect变量,它包含保存在注册表中的数据源名称,还有用户ID和口令。
然后,把连接串作为参数传递给OpenDatabase的方法就可完成连接了。
SET DBDatabase=Opendatabase("", ,false,ODBCConnect)
也可以把ODBC单独指定为连接串来连接ODBC数据源。例如:
Set DBDatabase=openDatabase("",true,ture,"ODBC;")
在上例中因未指明DSN、UID以及PWD,Windows会显示选择数据源对话框,要求提供这些信息。
3.使用ODBC API访问数据源
ODBC API是一组函数,它的连接是通过四个句柄来引用的,它允许直接访问ODBC数据库,而不需要Jet引擎的内部操作。通过ODBC API访问数据库的速度比使用Jet快许多倍,但ODBC API需要进行许多程序设计和测试的工作,所以通常不采用这种方法访问数据库。
4.使用远程数据对象(RDO)访问数据源
为了克服Jet引擎太慢而ODBC API又太复杂的弊端,VB5引入了远程数据对象(RDO),对访问远程数据库进行了优化,它可以象使用DAO一样轻松地访问数据库,还可使应用程序在较低档的工作站上运行。RDO有许多基本的对象和方法,在DAO中都有直接等价或在概念上等价的对象和方法见表1。
表1 RDO与DAO比较 对象名
DAO中等价的概念
作用说明
RDOEngine
DBEngine
代表一个远程数据源
RDOEnvironment
WorkSpace
定义一个与ODBC数据源相连接
RDOConnection
Database
代表与远程数据源的物理连接
RDOQuery
QueryDef
用来封装一个查询定义
RDOResultSet
RecordSet
封装执行查询后返回的数据
26.txt
Text 转换为 Access MDB
Text 文件类型在很多软件中都为一般应用程序与数据库之间架起一座桥梁。你可以使用 Text ISAM
驱动程序和 SQL 来把 Text 文件转换成 Access MDB 数据库文件,首先,为文本文件创建一个 SCHEMA.INI
文件。然后,你可以使用下面的代码来实现转换:
Dim db As Database, tbl as TableDef
Set db = DBEngine.CreateDatabase(App.Path & "/mymdb.mdb", dbLangGeneral, dbVersion_0)
Set tbl = db.CreateTableDef("Temp")
tbl.Connect = "Text;database=c:\vbpj\data"
tbl.SourceTableName = "Customer#txt"
db.TableDefs.Append tbl
db.Execute "Select Temp.* into NewTable from Temp"
db.TableDefs.Delete tbl.Name
db.Close
Set tbl = Nothing
Set db = Nothing
27.txt
28.txt
29.txt
31.txt
Text 转换为 Access MDB
Text 文件类型在很多软件中都为一般应用程序与数据库之间架起一座桥梁。你可以使用 Text ISAM
驱动程序和 SQL 来把 Text 文件转换成 Access MDB 数据库文件,首先,为文本文件创建一个 SCHEMA.INI
文件。然后,你可以使用下面的代码来实现转换:
Dim db As Database, tbl as TableDef
Set db = DBEngine.CreateDatabase(App.Path & "/mymdb.mdb", dbLangGeneral, dbVersion_0)
Set tbl = db.CreateTableDef("Temp")
tbl.Connect = "Text;database=c:\vbpj\data"
tbl.SourceTableName = "Customer#txt"
db.TableDefs.Append tbl
db.Execute "Select Temp.* into NewTable from Temp"
db.TableDefs.Delete tbl.Name
db.Close
Set tbl = Nothing
Set db = Nothing
34.txt
VB6.0中的几个新增数据库工具
在使用以前版本的Visual Basic(或简称VB)开发应用程序时,程序开发人员通常需要同时打开两个应用程序——Visual Basic和一个数据库管理程序(例如Access)。现在,这些本来应该由数据库设计人员完成的任务已经成为Visual Basic集成环境的一个部分,而且,在设计完成上述任务时,VB6.0提供的一些数据工具在某些方面比数据库本身提供的工具还要好用得多。例如,我们在使用Microsoft SQL Server6.5提供的数据库工具进行数据库结构设计时,就会发现,要更改某个已经建成的数据库表结构是一件非常麻烦的事情。但利用VB6.0提供的数据视图(Data View)却象使用Access数据库一样方便。下面,我就根据自己的应用体会,谈谈VB6.0的新增数据库工具的特点及使用方法。本文所举的例子用到的语言是VB6.0简体中文企业版,用到的数据库是Microsoft SQL Server。
Data View(数据视图)窗口
Data View窗口是VB6.0工作区的第一个组成元素,就象属性(Properities)窗口和工具栏一样,它可以依附在VB6.0的工作区的边界上。Data View的功能与VB中的可视化数据管理器(VisData)有点相似。可以从工具栏或“视图”菜单打开Data View。
Data View窗口显示当前为数据库建立的所有连接,以及加入到数据库中的数据环境(Data Enviroment)连接。有了Data View,我们就可以创建并修改表和视图、数据库视图以及存储过程和触发器等。这样,我们在开发应用程序时,就不需要在VB和数据库管理程序之间来回切换,而是可以随时利用这个窗口建立应用程序所需的各种数据连接和数据环境,并对数据库表和查询等进行创建和修改。同时,还可以使用VB6.0所提供的其他工具,很方便地把浏览窗口中的数据字段拖到查询设计器(Query Designer)和数据报表设计器(Data Report Designer)窗口中,从而很容易地建立一个查询或报表。
下面举一个新建“Microsoft SQL Server”数据视图的例子。在执行下列步骤之前,需要在控制面板中的“32位ODBC数据源”中建立一个与SQL Server数据库连接的“系统数据源”(System Data Sources)。假设我们已经建立了一个有关资金管理系统库的链接“DSN_Funds”。
* 单击“视图”菜单,并选择“数据视图窗口”命令;
* 在“数据链接属性”(Data Link Properties)窗口的“提供方”(Provider)标签中选择“Microsoft OLE DB Provider for ODBC Drivers”,单击“继续”(Next>>)进入“连接”(Connection);
* 在“连接”标签中,使用“指定数据源”(Specify the sources of data)项,再选择“使用数据源名”(Use data source name),单击下拉选择框,并选择我们已经建立的系统数据源“DSN_Funds”;如果要检测连接情况,可以单击“测试连接”(Test Connection),如果出现测试连接成功的提示,说明连接正确。
* 按“确定”就完成了一个“数据视图窗口”的建立。这时,在数据视图窗口的“数据链接”下会出现“DSN_Funds”。
Data Environment Designer(数据环境设计器)
Data Environment是VB6.0提出的一个新概念,也是本文将要介绍的重点。它可以将许多单独使用的对象和控件组合成一个单独的环境,建成后的这个数据环境可用来访问任何数据库、查询或加入其中的存储过程。这样,我们就不用再担心程序中有多处地方用到了某个数据库的引用,只需作一处改动,应用程序中的其他有关地方也会作出相应变动。这就给我们开发应用程序带来极大的方便。从某种角度看,Data Environment的作用相当于一个通用的Data控件,它可以在任何情况下使用,可以连接到所有的数据库、表以及只含一个查询或表的对象上,而不仅仅局限于连接到某个查询或表上。
数据环境设计器为我们提供了一种可以很容易访问VB工程中数据的方式。在以前的版本中,在设计时使用 ActiveX UserConnection 设计器创建远程数据对象(Remote Data Objects)(RDO)。现在,我们可以在设计时使用数据环境设计器创建ADO对象。数据环境设计器除了支持UserConnection设计器的所有功能外,还支持:1) Connection、Command 和Multiple Connection(多连接,即在一个数据环境中访问多个数据源)对象;2) OLE DB数据源和 ODBC 数据源。3) 拖放功能,即从数据环境设计器中拖动字段和表到一个窗体或数据报表 ActiveX(Data Report ActiveX)设计器中,在窗体中自动地创建数据绑定控件。4)执行包含在数据环境中、作为编程的运行时方法的command。5)对绑定到窗体中控件的数据环境进行编程访问。6)关联 Command 对象创建一个关系层次结构的能力,或对 Command 对象分组创建一个分组层次结构的能力,以及创建合计的能力和手工绑定数据识别控件到一个 Command 对象中的 Field 对象的能力。7)数据环境扩展性对象模型,该模型允许您创建外接程序。这些外接程序可以通过编程操作 Visual Basic 工程中的任何 DataEnvironment 对象。
下面将介绍如何在VB工程中创建一个数据环境对象,以及如何在应用程序中使用数据环境中的对象。
假如我们要创建一个DataEnvironment(数据环境)用来访问Microsoft SQL Server中的资金数据库——DSN_Funds 。这个数据环境对象将作为VB工程的一部分被保存到文件中,文件的扩展名为.DSR,该扩展名代表设计工具。
在可以访问数据环境设计器之前,必须在 Visual Basic 中引用它。要引用数据环境设计器,请按照以下步骤执行:
* 在“工程”菜单中,单击“引用..."。
* 从“引用..."对话框中,选择“Microsoft Data Environment 1.0",然后单击“确定”。
要添加一个数据环境设计器对象到一个VB 工程,请按照以下步骤执行:
* 从“新建工程”对话框的“新建”选项卡中,选择“标准 EXE"工程,然后单击“打开”。
* 从“工程”菜单中,选择“更多ActiveX 设计器...”中的“Data Environment"。
一旦在VB 工程中添加了一个数据环境(DataEnvironment1),数据环境设计器就自动地包括一个新的连接(Connection1)。在设计时,数据环境打开连接并从该连接中获得元数据,包括数据库对象名、表结构和过程参数。我们使用下面的步骤来指定数据环境中新建Connection1对象的属性。
* 在VB "属性”窗口中,可以将缺省的“名称”更改为一个更有意义的名字。例如,数据源是SQL Server DSN_Funds 数据库,就可以将Connection1更改为“Cnt_DSN_Funds"。
* 用鼠标右键单击Connection1对象并选择“属性”,以访问“数据链接属性”对话框。
* 进入“数据链接属性”对话框,在“提供方”选项卡中选择 “Microsoft OLE DB Provider for ODBC Drivers”,在“连接”选项卡中指定数据源“DSN_Funds”。
* 单击“确定”。
还有一个更简便的方法来建立一个新的连接。即从“数据视图”窗口中将一个连接拖动到数据环境设计器,自动地创建 Connection 对象。对于在“数据视图”中已存在的 Connection 对象,用这种方式创建 Connection 对象是非常容易和高效的。
设定完Connection1的属性后,就可以在这个连接对象中创建命令(Command)对象了。Command 对象定义了从一个数据库连接中获取何种数据的详细信息。Command 对象既可以基于一个数据库对象(例如:一个表、视图、存储过程),也可以基于一个结构化查询语言(SQL)查询。
要创建一个Command对象,可以采用以下步骤或方法:
* 在数据环境设计器工具栏中单击“添加命令”。 或右键单击一个 Connection 对象或数据环境设计器,并从快捷方式菜单中选择“添加命令”。
* 一旦一个 Command 对象被添加,数据环境视图就显示新的 Command 对象。这个对象的缺省名字是“Command"和加在后面的一个数字,例如:Command1。
* 指定 Command1 对象的属性。即右键单击Connection1 对象并选择“属性”访问“Command 属性”对话框。在对话框中,有“通用”、“关联”、“分组”和“合计”选项卡,分别定义该数据库来源、连接属性及关系等,并组织 Recordset 中包含的数据。而“高级”选项卡则可以改变在运行时获取或操作数据的方式。
还有一种更为快捷的方法创建Command对象,就是从一个“数据视图”中拖动一个表、视图或存储过程到数据环境设计器自动地创建 Command 对象。由“数据视图”中列出的表、视图或存储过程来创建 Command 对象是一种简单和高效的方法。如果与被放下的 Command 对象相关联的 Connection 在数据环境中不存在,则自动创建一个 Connection 对象。
在运行时,数据环境对在数据环境设计器中定义的每一个 Command 和 Connection 对象创建 ADO Command 和 Connection 对象。如果 Command 对象被标记为 Recordset Returning(在“Command Properties"对话框的“高级”选项卡中),那么也创建一个 ADO Recordset 对象。ADO Command 对象是作为数据环境运行时对象的一个方法被添加的,而 ADO Connection 和 Recordset 对象是作为属性被添加的。
在数据环境中,ADO Recordset 对象的名字是以“rs"开头的,以便将它们和它们对应的 Command 对象区别开来。例如,一个名为 “用户” 的 Command 对象创建一个名为 “rs用户”的 Recordset 对象。在缺省情况下,Recordset 对象是关闭的。当 Recordset 对象的对应的 Command 方法执行时,Recordset 对象打开。
在运行时,应用程序可以通过两种方式使用数据环境:
1. 作为绑定到窗体控件中数据的一个直接数据源。
假设我们要将数据环境对象中一个“用户”Command对象的字段“用户名”绑定到窗体中的一个TextBox空间中去,则需要执行下列步骤:
* 先将一个TextBox控件放到 Visual Basic 窗体中;
* 在“属性”窗口中,单击Datasource(“数据源”)属性,并选择您想绑定到控件的 DataEnvironment 对象,如“DadaEnvironment1”;
* 单击 DataMember 属性,并选择数据环境中的 Command 对象 “rs用户”;
* 单击 DataField 属性,从绑定到控件的“rs用户”Command 对象中选择字段“用户名”。这样,就完成了绑定工作。
还有一种更快捷、简便的方法,就是将需要绑定的Command对象拖到窗体中,则窗体就会自动生成这个对象所有字段的标签(Label)名和数据操作和显示区(TextBox)。
2. 编程访问数据环境设计器中的对象。
假设要从一个 Visual Basic 窗体中编程访问数据环境中的对象“用户”记录,则照以下步骤执行(这个示例假定没有参数与 Command 对象相关联。):
* 在窗体中建一个 Command 按钮。
* 假设附加到这个按钮的代码是用于将“用户”表中的记录向后移动。则在按钮的 Click 事件中添加下面的代码:
DataEnvironment1. rs用户.MoveNext
从这上面例子可以看出,与一个 ADO Recordset 关联的所有方法都可以应用于rs用户,例如添加、更新、删除和遍历记录的方法。
从上面的例子及说明可以看出,VB中的数据环境就象一个大的数据控件一样,它可以在不同的窗体中引用和操作。这对于我们开发应用程序来说,无疑是提供了一个很好的数据工具。
Query Designer(数据查询设计)
Query Designer用来设计查询,并把设计出来的查询保存到数据库中。与编写普通的SQL代码相比,使用Query Designer的好处是查询经过数据库的编译以后运行速度将加快。这里,查询也可以带参数,用来在运行时填充数据。这种设计思想可以用来创建通用查询以读取一个单独的记录,而不必为每个可能的ID记录号单独准备一个独立的查询。
查询设计器不但包含可视地显示查询的图形窗格,也包含显示查询的 SQL 文本的 SQL 窗格。可以在图形化的或 SQL 窗格中工作,查询设计器将保持两种视图的同步,以使它们总是当前的。另外,查询设计器能识别 Microsoft(R) SQL Server(TM) 和 Oracle 数据库之间的差别,因此它能生成并识别数据库特有的 SQL 命令。如果向查询中添加一个以上的表,查询设计器会自动确定这些表如何关联,并且在查询中构造合适的联结命令。我们可以使用查询设计器的SQL SELECT命令返回数据,也可以创建更新、添加或删除数据库中记录的查询。还可以执行查询及处理网格中的记录集。
打开Query Designer的方法很简单,只要在数据视图(Data View)中的“数据链接”或“数据环境连接”下有一个链接或数据环境,就可以找到视图(View),然后用鼠标右键单击 “视图”,出现一个弹出式菜单,选择“新建视图(N)”即可。然后到数据视图中将查询涉及到的表(Tables)拖到Query Designer中,定义查询条件和显示字段即可建立一个新的查询。这种查询建立的方法与Access非常相似。
Data Report Designer(数据报表设计器)
Data Report Designer是VB6.0众多新增功能中最有用的一个功能。有了它,我们就可以在VB中创建简单的报表,而不是寻求第三方的软件支持了。另外,我们可以在程序中使用代码来调用刚创建的报表对象。
用过Access报表设计工具的人再使用VB6.0中的Data Report Designer,就会感觉它功能更加强大,而且使用方便。它支持页面、报表头、记录行以及其他一些常用的功能,如支持不同的图形和字体等。虽然这种报表设计器不能完全取代第三方报表设计工具,但对于一些常用的报表来说,有了它就可以很方便地在VB中设计了。
报表设计器必须有数据环境(Data Environment)的支持才能使用。因为报表设计中的数据来源与数据环境。
报表设计器主要有以下功能特点:
1. 对字段的拖放功能——把字段从 Microsoft 数据环境设计器拖到数据报表设计器。当进行这一操作时,Visual Basic 自动地在数据报表上创建一个文本框控件,并设置被放下字段的DataMember和DataField属性。也可以把一个Command对象从数据环境设计器拖到数据报表设计器。在这种情况下,对于每一个Command对象包含的字段,将在数据报表上创建一个文本框控件;每一文本框的DataMember和DataField属性将被设置为合适的值。
2. Toolbox控件——数据报表设计器以它自己的一套控件为特色。当数据报表设计器被添加到工程时,控件被自动创建在一个名为DataReport的新“工具箱”选项卡上。多数的控件在功能上与 Visual Basic 内部控件相同,并且包括Label、Shape、Image、TextBox和Line控件。第六个控件,即Function 控件,自动地生成如下四种信息中的一种:Sum、Average、Minimum或Maximum。
3. 报表打印及预览——通过使用 Show 方法预览报表。然后生成数据报表并显示在它自己的窗口内;通过调用 PrintReport 方法,以编程方式打印一个报表。当数据报表处于预览方式,用户也可以通过单击工具栏上的打印机图标打印报表。
4. 文件导出——使用 ExportReport 方法导出数据报表信息。导出格式包括 HTML 和文本。可以创建一个文件模板集合,以同 ExportReport 方法一起使用。这对于以多种格式(每种都报表类型剪裁)导出报表是很有用的。
5. 异步操作——DataReport 对象的 PrintReport 和 ExportReport 方法是异步操作。使用 ProcessingTimeort 事件可以监视这些操作的状态,并取消任何花费时间过长的操作。
要创建一个报表,可以采取以下步骤:
* 在“工程”菜单上,单击“添加 Data Report"。如果设计器不在“工程”菜单上,单击“工程”菜单中的“部件”。再单击“设计器”选项卡,选择“Data Report"。
* 设置 DataReport 对象的属性。在“属性”窗口上,单击“数据源”,假如选择“DSN_Funds"。然后单击“DataMember"并选择“用户”。
* 右键单击数据报表设计器,并单击“检索结构”。 则我们已经向报表设计器添加了一个新的分组。每一个分组都同数据环境中的 Command 对象有“一对一”对应关系;在这种情况下,新的分组与客户的 Command 对象相对应。
* 从数据环境设计器,把“所在部门"字段(在“用户"命令下)拖到分组标头(用户_Header)部分。分组标头部分可以包含“用户”命令的任何字段,然而,出于演示目的,此时只显示“用户”名。
* 删除名为“Label1"的 Label 控件(rptLabel)。如果不希望 Label 控件包括在 TextBox 控件中,可以在数据环境设计器的“选项..."对话框的“字段映射”选项卡上撤消对“Drag and Drop Fields Caption"选项的选择。
* 从数据环境设计器中,把“用户名"、“注册日期”、“口令”、“权限”字段拖到细节(Orders_Detail)部分。并删除所有Label控件。细节部分表示最内层的“重复”部分,因而与数据环境层次结构(OrdersCommand对象)中最底层的 Command 对象相对应。
* 重新调整数据环境设计器部分的大小。重新调整细节部分的高度,使它尽可能的矮是很重要的,因为高度将会与为每一个“部门”返回的细节(即“用户名”、 “注册日期”、“口令”、“权限”)相乘。细节部分的文本框下面或上面的任何多余位置将在最后的报表中导致不必要的空间。
* 保存工程。
Visual Basic6.0与以前版本的最大不同之处就是在数据库功能上有一个更大的提高。这也是微软公司为加强其在企业开发工具地位上的重要内容。应该说,在开发大中型企业应用软件上,Visual Basic6.0的确是最强的软件之一。相信大家在不断使用过程中会有更深的体会。
35.txt
VB处理数据库时求数据表记录总数的最佳方法
作者:深圳宝安原来电子有限公司
倪坚明
---- ---- VB主要处理的是MDB格式的数据库,但就在这方面,它就偏偏出了差错,先看看下例:
Dim db As Database
Dim rs As Recordset
Set db = OpenDatabase(App.Path & "\zzr.mdb")
Set rs = db.OpenRecordset("test")
Debug.Print rs.RecordCount
---- ---- 此例假设在应用程序目录下有一个名为"zzr.mdb"的数据库,而且它里边有一个名为"test"的表,此程序的目的就是求出该表中的记录的总数。此处用到的是"表"对象的RecordCount属性,这样用在一般性况下是正确的,但并不能保证在所有的情况下都能得出正确的结果,比如说表中的数据量很大,或者是数据库受到过什么损害等等。如果碰到这种情况,我们可以换一个角度来处理。请看下面的程序:
Dim db As Database
Dim rs As Recordset
Dim Num As Long
Set db = OpenDatabase(App.Path & "\zzr.mdb")
Set rs = db.OpenRecordset("test")
Num = 0
rs.MoveFirst
Do While Not rs.EOF()
Num = Num + 1
rs.MoveNext
Loop
Debug.Print Num
---- ---- 这样,最后得到的Num即为正解结果,这种方法的思路是从表的开始处一直顺序走到结尾,就可以"数"出表中到底有多少条记录。这种方法看起来很笨,但是它却是一个相当准确的方法,大家不防可以试一下。
---- 再看笔者的说法:
---- 先看上面一行程序:Debug.Print rs.RecordCount,VB5在读取数据表时并非一次性将全部记录均读入内存(想想看如果有一个表,里面有一百万个记录甚至一亿个或更多,要想全部读入内存,你的机器能承受得了吗?),只是先读入一部分(在下认为这是VB的优异这处),recordset对象并非表的全部记录,只是已读入内存的部分,故用rs.recordcount得到的不是表的记录总数。
---- 再看上面程序的改良部份:
Do While Not rs.EOF()
Num = Num + 1
rs.MoveNext
Loop
Debug.Print Num
---- 在下用十万个记录的表对上面这段程序做了个测试,结果花了六分半钟(intel 166,32M内存),如此的等待,阁下有耐心无?请看在下的对策:
---- 假设数据表已打开,用
rs.Recordset.MoveLast '将指针移到表的最后一笔记录
debug.print rs.Recordset.RecordCount
即可得出正确结果。
或者用下一种方法亦可
rs.Recordset.MoveLast
debug.print rs.Recordset.AbsolutePosition+1
'调用绝对位置,因vb的第一笔记录是由零算起,故要+1。
36.txt
37.txt
VB数据库编程经验两则
(作者:陆明秀)
空字段的处理
在往SQL Server数据库中添加记录时,每个字段必须给予明确赋值(即在没有给数据表设定缺省规则或给每个字段设定缺省值的情况下),否则便发生错误。因此我用VB编写了一个处理函数,将其放入标准模块,以供相应程序调用。函数首先判断是否给字段赋值,若没有,则根据字段类型的不同赋予不同数值(数字赋零,字符赋空格)。程序如下:
′zd变量采用变体类型
Function nonull(zd As Variant) As Variant
If IsNull(zd) Then
′字段没有赋值,判断其类型
If zd.Type = 12 Then
′字符型字段,赋空格
nonull = " "
Else
′数字型字段,赋0
nonull = 0
End If
Else
nonull = zd
End If
End Function
多字段记录的录入
如果我们需要编写一个录入程序,向某个SQL Server数据表(SJB)中录入数据,而这个数据表中包含有多个字段,假设有30个字段,需通过Insert INTO语句完成。
Insert INTO SJB Value(A0,A1,A2,...,A29)
这里A0、A1...A29为字段的录入值,其中,若字段类型为字符型,需用引号括起。并且,如果操作者在录入数据时,对某些字段没有赋予明确值,则还需借助前面给出的处理函数给这些字段赋予相应的0或‘ ’。虽然,我们在编程时可依照Insert INTO语句句法依次罗列出30个字段值,然而,变通一下,利用循环语句,不仅可以达到异曲同工的效果,而且使得程序不再冗长、烦琐,可读性好。下面列出相关程序片段:
...
Dim sqlstr As String
Dim sqlstr1 As String
Dim i As Integer
For i = 0 To 29
′rs.rdoColumns(I)为数据表中的某一字段
If rs.rdoColumns(i).Type = 12 Then
′字段类型为字符,在两侧用引号括起
′函数nonull()用于防止空值出现
sqlstr = sqlstr && "注释:" && nonull(A(i)) && "注释:,"
Else
′字段类型为数字型
sqlstr = sqlstr && nonull(A(i)) && ","
End If
Next
′去掉最后一个逗号分隔符
sqlstr = Left(Trim(sqlstr), Len(Trim(sqlstr)) - 1)
′插入一条记录到数据表中
sqlstr1 = "insert into sjb values(" && sqlstr && ")"
...
′执行插入语句
cn.Execute sqlstr1
...
38.txt
VB数据库编空字段的处理
在往SQL Server数据库中添加记录时,每个字段必须给予明确赋值(即在没有给数据表设定缺省规则或给每个字段设定缺省值的情况下),否则便发生错误。因此我用VB编写了一个处理函数,将其放入标准模块,以供相应程序调用。函数首先判断是否给字段赋值,若没有,则根据字段类型的不同赋予不同数值(数字赋零,字符赋空格)。程序如下:
′zd变量采用变体类型
Function nonull(zd As Variant) As Variant
If IsNull(zd) Then
′字段没有赋值,判断其类型
If zd.Type = 12 Then
′字符型字段,赋空格
nonull = " "
Else
′数字型字段,赋0
nonull = 0
End If
Else
nonull = zd
End If
End Function
39.txt
VB数据库多字段记录的录入
如果我们需要编写一个录入程序,向某个SQL Server数据表(SJB)中录入数据,而这个数据表中包含有多个字段,假设有30个字段,需通过Insert INTO语句完成。
Insert INTO SJB Value(A0,A1,A2,...,A29)
这里A0、A1...A29为字段的录入值,其中,若字段类型为字符型,需用引号括起。并且,如果操作者在录入数据时,对某些字段没有赋予明确值,则还需借助前面给出的处理函数给这些字段赋予相应的0或‘ ’。虽然,我们在编程时可依照Insert INTO语句句法依次罗列出30个字段值,然而,变通一下,利用循环语句,不仅可以达到异曲同工的效果,而且使得程序不再冗长、烦琐,可读性好。下面列出相关程序片段:
...
Dim sqlstr As String
Dim sqlstr1 As String
Dim i As Integer
For i = 0 To 29
′rs.rdoColumns(I)为数据表中的某一字段
If rs.rdoColumns(i).Type = 12 Then
′字段类型为字符,在两侧用引号括起
′函数nonull()用于防止空值出现
sqlstr = sqlstr && "注释:" && nonull(A(i)) && "注释:,"
Else
′字段类型为数字型
sqlstr = sqlstr && nonull(A(i)) && ","
End If
Next
′去掉最后一个逗号分隔符
sqlstr = Left(Trim(sqlstr), Len(Trim(sqlstr)) - 1)
′插入一条记录到数据表中
sqlstr1 = "insert into sjb values(" && sqlstr && ")"
...
′执行插入语句
cn.Execute sqlstr1
...
40.txt