之所以选择vb+SQLServer这种搭配因为,vb相较于vc在数据库方面其实更有优势,而access基本已成教学工具,你去网上搜索相关教程发现千篇一律的vb与access搭配,而且他们有同一个理由——为方便学习,对此我只想说你抄你妹我擦你大爷,vb与sqlserver的搭配虽理论完全可行且很占优势,但至今很少有相关入门教程,笔者在这上面也耗费了不少青春,笔者认为这种搭配对新手而言是比较容易上手的,也是比较实用的,这里精简一下,给个入门的例子
这篇不是什么研究,老鸟可以直接跳过去了。。。
一、预备知识:
sql server 数据类型
int | 允许从 -2,147,483,648 到 2,147,483,647 的所有数字。 |
text | 可变长度的字符串。最多 2GB 字符数据。 |
nchar(n) | 固定长度的 Unicode 数据。最多 4,000 个字符。 |
char(n) | 固定长度的字符串。最多 8,000 个字符。 |
text | 可变长度的字符串。最多 2GB 字符数据。 |
ntext | 可变长度的 Unicode 数据。最多 2GB 字符数据。 |
ado三要素:
ADO主要包括Connection,Recordset和Command三个对象, 它们的主要功能如下:
·Connection对象:负责打开或连接数据库文件;
·Recordset对象:存取数据库的内容;
·Command对象:对数据库下达行动查询指令,以及执行SQL Server的存储过程。
二、实现步骤:
1 在SQLServer中建立通讯录单表数据库,结构(我随手写的,可自行更改)如下:
2 建立vb标准工程,窗体更名为“通讯录”。
引入datagird控件和ado引用,具体操作进“工程”->"部件“,"工程"->"引用"
这里datagird控件id为ml
初次把玩数据库的时候可能最纠结的就是连接问题了,学过c++的都知道文件操作不外乎读写,其实数据库是一样的,只不过这里引入了ADO对象,起了一个解耦合的作用,用一个中间项与数据同步,但操作起来要方便的多,这类似于java中的java bean,这就是下面我们要碰到的
定义全局变量:
Dim gSet As New ADODB.Recordset
Dim gConn As New ADODB.Connection
下面在Form_Load()中插入代码
连接只要一句:
gConn.Open "Provider=SQLOLEDB.1;integrated Security=SSPI;Persist Security Info=False; Initial Catalog=fup;Data Source=(local)"
换成以前,笔者可能会仔细追究各个变量名、常量名、类型名的含义,现在认为这些实在是浪费时间,现在的IT界已经高度模块化,我们是工科生,主要负责使用这些技术,这些模块是更底层的技术人员提供的,而我们又给我们的上一层扮演解耦合的角色,这样产业链才更加高效,在这里我们要用函数的思想,即只要知道数据库驱动、数据库名,我们就可以唯一的连接一个数据库。
接下来是数据读入视图:
Dim strsql As String
strsql = "select * from maillist"
gSet.CursorLocation = adUseClient
gSet.LockType = adLockOptimistic
gSet.Open strsql, gConn
Set ml.DataSource = gSet
老实说这两句我也没搞懂,不过测试表明是必须的,我也不想深究了,原因同上,开发环境上的纠结浪费时间,我还没立志从事这一领域
这里主要是sql的语言基础,没啥好说的
gSet便是select语句查询结果的集合,最后一句将这个集合作为datagird控件的数据源,运行程序自动显示
为视觉方便,请添加以下字段长度控制语句,11个字段
ml.Columns(0).Width = 1000
ml.Columns(1).Width = 1200
ml.Columns(2).Width = 1000
ml.Columns(3).Width = 1700
ml.Columns(4).Width = 1200
ml.Columns(5).Width = 2000
ml.Columns(6).Width = 2400
ml.Columns(7).Width = 1000
ml.Columns(8).Width = 1200
ml.Columns(9).Width = 800
ml.Columns(10).Width = 600
Private Sub Form_Unload(Cancel As Integer)
Set ml.DataSource = Nothing
gSet.Update
gSet.Close
gConn.Close
End Sub
为减少不必要的时间消耗,文本框只选择性显示两个字段属性
Private Sub Command1_Click()
gSet.AddNew Array("姓名", "编号"), Array(friendname.Text, id.Text) '增加记录,显然通过函数转换为insert into即可
End Sub
Private Sub Command2_Click()
gSet.Delete '删除当前记录
End Sub
Private Sub Command3_Click()
gSet!姓名 = friendname.Text '修改gSet中的值,gSet是跟数据库同步的,此处改动直接导致数据库中数据改动,函数转换成update语句的
gSet!编号 = id.Text
End Sub
Private Sub Command4_Click()
Set ml.DataSource = Nothing
gSet.Close
Dim strsql As String
strsql = "select * from maillist where 姓名 like '%" & friendname.Text & "%'" '查询语句,sql基础不解释
gSet.Open strsql, gConn
Set ml.DataSource = gSet
End Sub
ADO访问数据库的时候,关于SQL的知识不是必要的,操作更加直观,但是特定数据库支持的SQL命令仍可以通过ADO中的命令对象来执行。而在ODBC中,你几乎可以不写一行代码就实现查看,
到这里读者应该发现,开发环境的适应其实很简单,各个系统大同小异,就跟国美电器苏宁电器一样,名字不一样,东西买过来,主干都差不多,到最后,我们要提高的,仍是面向复杂数据库的逻辑思维能力、程序语言基础和编码技巧、sql本身语言基础等等
最终效果图:
附上整体源码:
Dim gSet As New ADODB.Recordset
Dim gConn As New ADODB.Connection
Private Sub Command1_Click()
gSet.AddNew Array("姓名", "编号"), Array(friendname.Text, id.Text) '增加记录,显然通过函数转换为insert into即可
End Sub
Private Sub Command2_Click()
gSet.Delete '删除当前记录
End Sub
Private Sub Command3_Click()
gSet!姓名 = friendname.Text '修改gSet中的值,gSet是跟数据库同步的,此处改动直接导致数据库中数据改动,函数转换成update语句的
gSet!编号 = id.Text
End Sub
Private Sub Command4_Click()
Set ml.DataSource = Nothing
gSet.Close
Dim strsql As String
strsql = "select * from maillist where 姓名 like '%" & friendname.Text & "%'" '查询语句,sql基础不解释
gSet.Open strsql, gConn
Set ml.DataSource = gSet
End Sub
Private Sub Form_Load()
gConn.Open "Provider=SQLOLEDB.1;integrated Security=SSPI;Persist Security Info=False; Initial Catalog=fup;Data Source=(local)"
Dim strsql As String
strsql = "select * from maillist"
gSet.CursorLocation = adUseClient
gSet.LockType = adLockOptimistic
gSet.Open strsql, gConn
Set ml.DataSource = gSet
ml.Columns(0).Width = 1000
ml.Columns(1).Width = 1200
ml.Columns(2).Width = 1000
ml.Columns(3).Width = 1700
ml.Columns(4).Width = 1200
ml.Columns(5).Width = 2000
ml.Columns(6).Width = 2400
ml.Columns(7).Width = 1000
ml.Columns(8).Width = 1200
ml.Columns(9).Width = 800
ml.Columns(10).Width = 600
End Sub
Private Sub Form_Unload(Cancel As Integer)
Set ml.DataSource = Nothing
gSet.Update
gSet.Close
gConn.Close
End Sub
Private Sub ml_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
friendname.Text = gSet!姓名
id.Text = gSet!编号
End Sub