VB中利用SQL语句实现高效数据处理
准备工作:笔者的环境是Win98+VB6+ADO+MDB,由于调用SQL语句必须用ADO对象来调用,因此请先在“工程-->引用”菜单中选择“Microsoft ActiveX Data Objects 2.1 Library”。
一、打开数据库
通过以下代码,可以打开一个应用程序路径下的test.mdb库文件:
Dim oCn As New ADODB.Connection
oCn.ConnectionString=""Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=test.mdb;Persist Security Info=False ""
oCn.Open
代码很简单,声明一个数据库连接对象oCn,指定一个连接字符串,再Open即可。注意,在选择OLE DB提供者时用Jet引擎,它较ODBC的好处在于,不用手工添加数据源,只要数据库放在相对路径上就行了。如果你的数据库是其他类型的,不妨用ODBC的方式,连接字符串为:
“Provider=MSDASQL.1;Persist Security Info=False;Data
Source=mydsn”
其中,mydsn为手工添加的数据源。
关于连接字符串,一个省事的办法是先插入一个ADO控件,用它们的属性中的向导自动生成连接字符串后,复制过来即可。
如果你的数据库设了密码,用Jet引擎的话,连接字符串中还应加入以下内容:
jet oledb:Database Password=mypass
一旦数据库成功打开,以后就可以用oCn对象来执行各种SQL语句了,执行需要用到oCn的Execute方法,如下所示:
oCn.Execute ""select * from Table1""
所有SQL语句都是按照这种方式来执行的,所以下面的讨论中只写出相关的SQL语句。
二、数据查询
这个大家都知道,不就是SELECT * FROM „ WHERE „嘛,那„„那我
就不废话了。
三、
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
的连接
三种连接方式:内联(INNER JOIN)、左联接(LEFT JOIN)、右联接(RIGHT JOIN)常常让人迷惑,这里可以用一个示意图来表示三种连接方式的区别。假设两个表
A和B的结构如下,对它们分别进行三种连接,使用的SQL语句及得到的
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
集
如下所示:
内联:Select A.Key , B.key From A Inner Join B On A.Key=B.Key
左联:Select A.Key , B.key From A Left Join B On A.Key=B.Key
右联:Select A.Key , B.key From A Right Join B On A.Key=B.Key
简单地说,内联就是取同时满足条件的行,左联取前面表中的所有行,右联
取后面表中的所有行,当另一个表中没有数据时以NULL填充。
四、数据的移动
数据库编程中,常常需要一次性地将大量的数据移动,SQL语句中有两种语
句可以实现这种要求:Select Into和Insert Into 。
Select Into语句可以将一个查询的结果直接生成一个新的表,无须事先创
建表。这一点特别适用于临时表,在处理过程中用Select Into被创建,用过之
后再用Drop Table语句将表删除,轻松又简单~一个Select Into的例子如下:
Select * Into temp From (Select * From table)
From后面的括号不能省略,里面放一个查询语句。还记得刚刚讲的连接吧,
它的语句就可以放到括号里,然后你就可以在temp表中操作连接的结果了。
再说Insert Into,功能是将一些数据插入到一个现有表中,
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
如下:
Insert Into temp From Select * From table
注意它与Select Into语句的区别:不用指定字段,不用括号。后面跟的查
询语句同样也可以是一个连接查询语句。
跟这两个语句有关系的语句:
删除表语句:Drop Table temp
删除记录语句:Delete * From temp Where „
五、数据的更新
当我们用控件对数据库编程时,要更新数据,就不得不对每行记录都要先EDIT,再修改,再UPDATE,既繁琐又慢。SQL语句就省事了,一个语句就解决了,如:
Update Table1 Set Field1=Field1+1 Where Field1>100
但是,显而易见,这种方式过于简单,缺乏灵活性。在数据处理中,这种只是在原来的基础上改变的更新操作往往很少,更多的可能是根据一个表的数据来更新另一个表。在这一点上,ADO有一个非常强大的功能:可以对连接表进行更新。也就是说,你可以将两个表按某种条件连接起来,并更新连接起来的表中的某个字段,ADO会自动地将更新结果写到相应的表中。下面例子演示了这个特性:将数学表中的得分加到总分中,同时,将两个表中涉及到的记录作标记,用于意外情况的处理,判断两个表中被漏掉的记录。
Update (Select 成绩.姓名,总分,成绩.标记,数学.姓名,得分,数学.标记 From 成绩 Inner Join 数学On 成绩.姓名=数学.姓名) Set 总分=总分+数学.得分,成绩.标记=1,数学.标记=1
表结构:
可以用一个括号将连接查询括起来,并在其后面进行更新。注意,如果字段名不重复,就不用在前面指定表名了。有了这么强大的更新功能,数据库中的很多复杂的更新都可以轻松解决了。
六、统计
统计同样是数据库编程中常常用到的功能之一,常用的统计函数有合计函数Sum(),记录总数Count(),平均值Avg(),最大值Max()最小值Min()等。在SQL语句中,只要很简单的一句,就可以计算出需要的统计值:
Select Sum(Field1) From Table1 Where „
但问题是,这个统计结果我们怎样才能在程序中使用,也就是说,怎样才能把它保存到一个变量中。以下是笔者的一个解决办法:
Dim fSum '用来保存统计结果的变量
Dim otmpRs As ADODB.Recordset '临时记录集,记录统计值
Set otmpRs = oCn.Execute(""select sum(Field1) from Table1"")
fSum= otmpRs.Fields(0)
因为一个统计语句的结果是一个只读的记录集,第一条记录中的第一个字段中就是统计的结果。因此,可以用一个临时记录集对象保存结果,再用记录集的操作将结果取出保存到变量中。
以上讨论了数据库编程过程中最常遇到的几个环节中的SQL语句的应用,也是笔者在编程过后的个人感受。限于篇幅,很多细节性的内容无法给出,在此强力推荐两个帮助文件:ADO210.CHM、JETSQL40.CHM。可能大家都有此感受:MSDN虽好,但范围太广,对某个主题的搜索,往往受到很多干扰,无法找到真正需要的内容。而单独使用这两个文件帮助,打开后就可以找到关于ADO特性以及JET引擎的SQL语言的各种用法和示例,对于解决问题非常有用。
VB实现SQL EntManager功能erprise
完成在SQL Server数据库中建立设备,建立数据库,建立
表格
关于规范使用各类表格的通知入职表格免费下载关于主播时间做一个表格详细英语字母大小写表格下载简历表格模板下载
,分配权限的功能方便了数据库应用程序所需Sql Server环境的建立,根本不用启动SQL Enterprise Manager配置数据库。
这个小工具由VB开发,利用ADO 访问数据库,实现更改数据库结构,其他语言也可以此作为参考。启动VB6.0,新建一个工程,在菜单-工程-引用里选"Microsoft ActiveX Data Objects 2.0 Library",代码里需要有
dim conn As New ADODB.Connection 义ADO数据库对象
conn.ConnectionString = "driver={SQL Server};" & _ "server=" & ServerName & ";uid=" & UserName & "; pwd=" & Password & ";database=" & DatabaseName & "" 连接数据串
conn.open 连接数据库
注:ServerName为服务器名;UserName为用户名;Password为用户口令; DatabaseName要登录的数据库名,可以为空。
核心代码如下:
一、建立数据库
原理:建立数据库先要初始化一个数据库设备,然后在此设备上建立数据库。所有的设备名在系统表"sysdevices"里有记录,所有的数据库名在系统表"sysdatabases"里有记录。在建立之前,最好先查询这两个系统表,看名称是否已经存在。在建立设备之前,还需要的一个物理名和空闲的设备标识号。 初始化设备语法:
DISK INIT NAME="device_name",PHYNAME="physical_name",VDEVNO=device_number, SIZE=numberofblock
说明:这里,NAME是数据库设备名(一个有效的标识符),PHYNAME(数据库设备的物理名)是原始的磁盘分区UNIX或外设(vms)名,或者是操作系统的文件名。VDEVNO时数据库的设备标识号,合法值为1-255,SIZE的单位是2KB的块,例如1MB(1024KB)时SIZE值为512。
建立数据库语法:CREATE DATABASE database_name [ON database_device]
说明:database_name是要建的数据库名,database_device是设备名
要新建立一个数据库,就需要设备名,数据库名,物理名和设备号。具体
步骤
新产品开发流程的步骤课题研究的五个步骤成本核算步骤微型课题研究步骤数控铣床操作步骤
如下:
我们假设用户要新建立设备dbName,在设备dbName上建立数据库dbName。
1)得到设备名 bName是用户给出的设备名;先查询系统表sysdevices,看用户给出的设备名dbName
是否已经存在,如果此设备名存在,就需要更换一个设备名,因为设备名是唯一的。
sql = "select * from sysdevices where name=" & dbName & ""
Set rs = conn.Execute(sql)
If Not rs.EOF Then
MsgBox "设备名"" & dbName & ""已存在~", 16, "请重新输入名称"
Exit Sub
End If
2)得到数据库名。dbName是用户给出的数据库名;查询系统表sysdatabases,看用户给出的数据库名dbName是否已经存在,如果此数据库存在,就需要更换一个数据库名,像设备名一样,数据库名也是唯一的
sql = "select * from sysdatabases where name=" & dbName & ""
Set rs = conn.Execute(sql) 下面代码略
3)得到PHYNAME物理名。查询服务器上数据库文件的物理位置serverpath,典型的,我们可以从系统表sysdevices中查询master(这是SQL Server的主库名)数据库的位置,例如G:\MSSQL\DATA\MASTER.DAT,则我们的数据库可以建在"G:\MSSQL\DATA\"目录下。 sql = "select name,phyname from sysdevices " low/16777216为设备号
Set rs = conn.Execute(sql)
然后遍历记录对象rs,当name="master"时,取出phyname,
从而可以得到物理位置serverpath =G:\MSSQL\DATA\。
4)得到一个空闲的设备号vdevno。设备号合法值1~255,遍历这些号,查找出未被使用的空闲设备号,下面程序得到已有的设备号
sql = "select distinct low/16777216 from sysdevices order by low/16777216" low/16777216为设备号
5)建立数据库。所需的信息都准备完毕,可以建立数据库了(注:下面的"" & Chr(34) & ""就是一个"""双引号,这样处理后,才能满足语法要求;数据库为20M,则dbSize=512*20) sql = "DISK INIT NAME=" & Chr(34) & "" & dbName & "" & Chr(34) & ",PHYSNAME=" & Chr(34) & "" & serverpath & "" & dbName & ".dat" & Chr(34) & ",VDEVNO=" & vdevno & ",SIZE=" & dbSize & ""
Set rs = conn.Execute(sql) 初始化设备
sql = "CREATE DATABASE " & dbName & " on " & dbName & "=" & dbSize & ""
注:
第一个dbName是数据库名,
第二个dbName是设备名
Set rs = conn.Execute(sql)
在设备dbName上建立数据库dbName
MsgBox "数据库"" & dbName & ""建在服务器上
"" & serverpath & "" & dbName & ".dat",
建立成功~", 64, "成功"
二、建立表格
建立表格比较简单,这里用到了自动计数字段和缺省值字段类型,语法如下: CREATE TABLE table_name
(field_name data_type [NOT NULL|NULL],„)
说明:table_name为新建的表名,field_name为字段名,data_type为数据类型。 (注意下面的fileid int IDENTITY字段自动计数,
datetime NOT NULL DEFAULT(GETDATE())字段每当入
库时有个缺省值,由数据库生成当时的时间)。
sql = "CREATE TABLE " & TableName & " (fileid int IDENTITY, filetime datetime NOT NULL DEFAULT(GETDATE()),fileimage image NULL )" conn.Execute sql 建立表格
三、建立用户组用户
建立用户组和用户不能直接通过SQL语句完成,需要执行SQL Server的存储过程sp_addlogin,sp_addgroup, sp_adduser。我们假设新建登录账号是username1,用户名是username1,组名是group1,则步骤如下:
1)建立用户的登录账号
语法:sp_addlogin login_name,password[,defdb] 其中,login_name是用户的登录名,password是用
户的口令,defdb上登录的缺省数据库名称。建立数
据库DatabaseName的登录账号:
sql = "EXECUTE sp_addlogin " & username1 & "," & password1 & "," & DatabaseName & "" Set rs = conn.Execute(sql)
2)增加用户组
语法:sp_addgroup group_name
其中,group_name 是新建组名
sql = "EXECUTE sp_addgroup " & group1 & "" Set rs = conn.Execute(sql)
3)增加用户
语法:sp_adduser login_name
[,name_in_db][,grpname>
其中,login_name用户名,name_in_db是用户在当
前数据库中的名字(这里是第一步建立的登录账号
username1),grpname是要将用户加入的那个组的组名。
在数据库DatabaseName增加用户username1:
sql = "EXECUTE sp_adduser " & username1 & "," & username1 & "," & group1& ""
注:第一个username1是用户名,第二个username1是
数据库DatabaseName的登录账号
Set rs = conn.Execute(sql)
四、分配权限
语法:grant permission_list on object_name to who
其中,permission_list是所要分配的权限清单,object_name是在这个对象上的权限,who是接受授权的用户。
先从系统表sysobjects得到所有的用户建立表格名(type=U)
sql = "select name from sysobjects where type=U" Set rs = conn.Execute(sql)
然后从中选取所需要的表格来分配权限给其他用户。例如,这里选择将tablename3的读取权限分配给组group1。
sql = "grant select on " & tablename3 & " to " & group1 & ""
conn.Execute sql
由于这个小工具的使用,使SQL Server数据库配置变得简单、方便了。
VB环境中+SQL综合应用
一、添加记录(新建一个按钮Command1,双击Command1写入以下代码)
Private Sub Command1_Click() '行为属性,此处为鼠标点击行为。
Dim conn As New ADODB.Connection
conn.ConnectionString = "Provider=SQLOLEDB.1;Password=123;Persist Security Info=Tru
e;User ID=sa;Initial Catalog=choose;Data Source=(local)" '创建主通道,相当于ASP的set conn=server.creatobject("adodb.connection") conn.Open
Dim rs As New ADODB.Recordset '创建次通道,相当于ASP的server.CreateObject("adodb.recordset")
Set rs.ActiveConnection = conn
rs.Open "select * from student where sno='" + Me.Text1.Text + "'and sname='" + Me.Tex
t2.Text + "'", , 3, 2 'Me表示窗体,Text1.Text表示向文本框输入的文本并将其值赋给数据库字段为sno
If rs.EOF = True And rs.BOF = True Then
rs.AddNew
rs(0) = Me.Text1.Text
rs(1) = Me.Text2.Text '将新输入的信息添加到相应字段中
rs.Update
Me.Label1.Caption = "添加成功" 'Label1属性,用于显示提示内容.label需要在Form里添加 Else
Me.Label1.Caption = "已经有该记录"
End If
End Sub
二、删除记录(新建一个按钮Command2,双击Command2写入以下代码) Private Sub Command2_Click()
Dim conn As New ADODB.Connection
conn.ConnectionString = "Provider=SQLOLEDB.1;Password=fpq1983;Persist Security Info
=True;User ID=sa;Initial Catalog=choose;Data Source=(local)"
conn.Open
Dim cmd As New ADODB.Command '用Command类创建一个名为cmd对象 Set cmd.ActiveConnection = conn
cmd.CommandText = "delete student where sno='1'" '指定删除对象为sno为1的对象。 cmd.CommandType = adCmdText
cmd.Execute
Me.Label1.Caption = "删除成功"
End Sub
添加删除记录的另一种办法:调用存储结构
Private Sub Command3_Click()
Dim conn As New ADODB.Connection
conn.ConnectionString = "Provider=SQLOLEDB.1;Password=123;Persist Security Info=Tru
e;User ID=sa;Initial Catalog=choose;Data Source=192.168.1.100"
conn.Open
Dim cmd As New ADODB.Command
Set cmd.ActiveConnection = conn
cmd.CommandText = "qq" '调用存储结构qq
cmd.CommandType = adCmdStoredProc
cmd.Parameters.Append cmd.CreateParameter("@a", adVarWChar, adParamInput, 30, Me.
Text1.Text)
cmd.Parameters.Append cmd.CreateParameter("@b", adVarWChar, adParamInput, 30, Me.
Text2.Text)
cmd.Parameters.Append cmd.CreateParameter("@msg", adVarWChar, adParamOutput, 50)
cmd.Execute
Me.Label1.Caption = cmd("@msg")
End Sub
存储结构qq(此代码在SQL里面写)
CREATE PROCEDURE qq
@a nvarchar(50),@b nvarchar(50),@msg nvarchar(50) output
AS
if not exists(select * from sc where sno=ltrim(rtrim(@a))) begin
insert into sc (sno,cno) values(ltrim(rtrim(@a)),ltrim(rtrim(@b))) select @msg="添加成功"
end
else
begin
select @msg="已经存在这条记录了"
end
GO
利用VB打造Sql Server数据库连接器(2007-09-19 21:07:40)
现建一个普通窗口..放上3个textBox控件.
一个是用来输入ip的txtaddres..还有就是用户名txtuser和密码txtpass...为相应的
控件起个好听地名字
还有1个按钮用来确定连接...
定义一个连接对象..和记录集对象
public conn as new ADODB.Connect '连接的
public recv as new ADODB.Resordset '用来接收数据的
'''''''''''''''''''''''''''''''''''''''''''''''''''
连接按钮事件click()
dim sql as string
sql ="Provider=SQLOLEDB.1;
Password=" & txtpass & ";
Persist Security Info=True; User ID=" & txtuser & ";
Initial Catalog=" & msdb & "; Data Source=" & txtaddres
sql变量力存放的是连接字符串....
conn.ConnectionString = sql '连接字符串..
conn.open '连接
if conn.state = 0 then '表示连接不成功...
当conn.state = 1 表示连接成功了....
好了...我们的软件现在已经可以正确的连接上sql服务器了
现在我们要能执行dos命令...
在我们刚才的窗体里面在创建一个textbox(txtsend)用来打dos命令和一个发送命令按钮
发送命令以后服务器会返回数据...所以还要加一个RichTextBox控件(个人推荐)...用textbox也可以
在sql默认得数据库msdb里面可以执行xp_cmdshell 'dos命令' 对...我们现在也要把这条命令发送到服务器执行.....
执行按钮事件click()
dim sql as string
sql = "xp_cmdshell '" & txtsend.text & "'" '命令应该用单引号括起来.... set recv = conn.Execute(sql) ' 执行sql命令.并把返回数据记录在记录集recv里面 dim i as integer,col as string While Not recv.Eof '读数据到最后一行
for i = 0 to Recv.Fields.Count - 1 col =recv.fields(i).name
RichTextBox.setcolor = &hff00& '改颜色
RichTextBox.seltext = recv.fields(col).value
recv.movenext
next
wend
程序可能会出现问题..最好加上
on Error goto err1
err1:
msgbox err.number & err.Description '程序错误编号和类型
还告诉大家vb里面有个控件可以生成连接字符串.....
components或者直接按Ctrl+T..添加Microsoft ADO Data Control 6.0(OLEDB)控件
控件属性里面的选择第三个选项Use Connection String然后点Build配置字符串就可以了..配置完以后就可以把这个控件删掉.....
数据库连接问题:Dim conn As New ADODB.Connection
conn.ConnectionString = "driver={SQL Server};server=20081128-1149;uid=ng;pwd=;database=user012009" '创建主通道 Dim rs As New ADODB.Recordset '创建次通道
Set rs.ActiveConnection = conn rs.Open "select * from z_pz11" 'Me表示窗体,Text1.Text表示向文本框输入的文本并将其值赋给数据库字段为sno