=14size> VB对数据库编程有多种思路方法如:ODBC API编程、RDO(远程数据对象)、DAO(数据访问对象)、ADO(ActiveX 数据对象)思路方法编程实现方便、快捷但灵活性稍差由于存储过程具有实现数据封装、隐藏以及代码预编译、减少网络负载、维护方便等优点所以被许多RDMBS和编程工具做支持VB中各类数据对象均都提供对存储过程支持所以要灵活掌握存储过程这技术是十分必要现在将VB中实现动态含DateTime类型存储过程介绍给读者,让您很快掌握和运用这个思路方法,解决你身边问题
=14size> 、 简述SQL Server 2000 日期时间类型(含dateTime类型字段)
=14size> 该类型是由有效日期或时间组成;年-月-日 小时:分:秒.千分的秒其格式:
=14size> 请见图示1=14size>
在现阶段开发设计ERP系统项目中尤其在创建数据库表结构时均要考虑到DateTime字段应用它能记载信息发生时间段信息能充分反映该区间数据变化;除特殊情况下(如:网吧、游戏吧等需记录小时、分、秒)的外般要考虑到日期范围即:[年、月、日]本篇文章发表于www.xker.com(小新技术网)
2、 我们以ADO为例来介绍说明其实现步骤
现在动态含有DateTime字段存储过程以帮助理解和掌握存储过思路方法:
1>、使用NorthwindMS SQL中例子库(此例子SQL Server2000自带)
Create procedure "Employee Sales by Country"
@Beginning_Date DateTime, @Ending_Date DateTime AS
SELECT Employees.Country, Employees.LastName, Employees.FirstName,
Orders.ShippedDate, Orders.OrderID, "Order Subtotals".Subtotal AS SaleAmount
FROM Employees INNER JOIN
(Orders INNER JOIN "Order Subtotals" _disibledevent=>ON Employees.EmployeeID = Orders.EmployeeID
WHERE Orders.ShippedDate Between @Beginning_Date And @Ending_Date
GO
2>、在VB中生成个新工程工程添加个窗体 3个Command(1,2,3)按钮个ListViewControl控件两个日期DTpickerControl控件两个标签LabelControl控件个文本TextBoxControl控件
请见图示2
3>、编程设计思路
基于SQL Server数据库表结构定义DateTime类型特点我们采取截取有效日期部分实现对这个含有DateTime字段存储过程动态具体步骤如下:
①.定义:Dim Dt10,DT20 as Variant
②.采集动态日期赋值于以上两个变量中
DT10 = Format(Trim(DT1.Value), "yyyy-mm-dd")
DT20 = Format(Trim(DT2.Value), "yyyy-mm-dd")
具备以上条件可快捷、方便地获取动态日期区间内数据表结果集
下面就严格执行存储过程语法格式就可以了请详见VB代码
4>、VB代码实现动态 3种思路方法
①. 窗体变量设置
Option Explicit
Dim CNN1 As ADODB.Connection '连接
Dim RS As ADODB.Record '结果集
Dim StrCnn As String '连接串
Dim DT10, DT20 As Variant '日期变量
Dim i As Integer '字段计数
②. [基本格式]存储过程
Private Sub Command1_Click '以[基本方式](1)存储过程
On Error Resume Next
Dim Cmd As ADODB.Command '命令
Dim Par As ADODB.Parameter '参数
'声明并化个ADO Connection对象
DT10 = Format(Trim(DT1.Value), "yyyy-mm-dd") '起始日期赋值
DT20 = Format(Trim(DT2.Value), "yyyy-mm-dd") '截止日期赋值
Set Cmd = New ADODB.Command '指定cmd当前连接CNN1
Cmd.ActiveConnection = CNN1
'指定该cmd 当前活动连接
'设置要执行是存储过程"[Employee Sales by Country] "
Cmd.CommandType = adCmdStoredProc '表明cmd 为存储过程
Cmd.CommandText = "[Employee Sales by Country] " '存储过程名称
Set Par = Cmd.CreateParameter("Beginning_Date", adDBDate, adParamInput, , DT10)
Cmd.Parameters.Append Par
Set Par= Cmd.CreateParameter("Ending_Date", adDBDate, adParamInput, , DT20)
Cmd.Parameters.Append Par
Set RS = Cmd.Execute
'在ListviewControl控件中显示RstByQuery记录集有效行
If DT10 < DT20 Then '网格条件
If RS.Fields.Count > 0 Then '确认字段列数
i = RS.Fields.Count
Listrec RS, LV
RS.Close
End If
End If
End Sub
③. [简捷格式]存储过程
Private Sub Command2_Click '以[简捷方式](2)存储过程
On Error Resume Next
DT10 = Format(Trim(DT1.Value), "yyyy-mm-dd")
DT20 = Format(Trim(DT2.Value), "yyyy-mm-dd")
Set RS = CNN1.Execute("[Employee Sales by Country] '" & DT10 & "' ,'" & DT20 & "'")
If DT10 < DT20 Then
'在ListviewControl控件中显示RS记录集有效行
If RS.Fields.Count > 0 Then
i = RS.Fields.Count
Listrec RS, LV
RS.Close
End If
End If
End Sub
④. [数据集格式]执行存储过程
Private Sub Command3_Click '以执行[结果集方式](3)存储过程
On Error Resume Next
Dim Sql1 As String
DT10 = Format(Trim(DT1.Value), "yyyy-mm-dd")
DT20 = Format(Trim(DT2.Value), "yyyy-mm-dd")
Set RS = New Record
'对字段进行中文提示处理
Sql1 = "SELECT Employees.Country as '国别', Employees.LastName as '姓名', Employees.FirstName as '曾用名',
Orders.ShippedDate as '日期' , Orders.OrderID as '序号', [Order Subtotals].Subtotal AS '销售合计' FROM
Employees INNER JOIN (Orders INNER JOIN [Order Subtotals] _disibledevent=>ON Employees.EmployeeID = Orders.EmployeeID WHERE Orders.ShippedDate Between '" & DT10 & "' AND '" & DT20 & "'"
If Len(Sql1) > 0 Then
RS.Open Sql1, CNN1, adOpenStatic, adLockOptimistic
'在ListviewControl控件中显示RstByQuery记录集有效行
If RS.Fields.Count > 0 Then
i = RS.Fields.Count
Listrec RS, LV
RS.Close
End If
End If
End Sub
⑤. 将结果集装入到ListViewControl控件中
Sub Listrec(ByRef RS As Record, ByRef LV As ListView)
Dim head As ColumnHeader
Dim Item As ListItem
Dim K, P, Q As Integer
K = 0
'化listview某些属性
LV.ToolTipText = ""
LV.View = lvwReport
LV.GridLines = True
LV.LabelEdit = lvwManual
LV.ListItems.Clear
LV.ColumnHeaders.Clear
For i = 0 To RS.Fields.Count - 1
'由于item.text不接受null ,故预先于空串作连接
Set head = LV.ColumnHeaders.Add
head.Text = RS.Fields(i).Name
Next
While Not RS.EOF
Set Item = LV.ListItems.Add
Item.Text = "" & RS.Fields(0).Value
For i = 1 To RS.Fields.Count - 1
Item.SubItems(i) = "" & RS.Fields(i).Value
Next
K = K + 1
RS.MoveNext
Wend
Text1.Text = ""
Text1.Text = CStr(K)
LV.ToolTipText = "有效记录条数:" + CStr(K)
End Sub
⑥.工程\引用和连接SQL Server数据库
* 本文使用ADO需要引用”Microsoft ActiveX data Objects 2.6 Library”对象
* 连接SQL Server 2000数据库
Private Sub Form_Load '在窗体LOAD事件中加入如下代码:
Set CNN1 = New ADODB.Connection
'使用Connection对象StrCnn属性,直接指定连接SQL Server数据库
StrCnn="Provider=SQLOLEDB;DataSource=NO1;UserID=sa;pwd=;Initial Catalog=Northwind"
CNN1.Open StrCnn '打开连接
结束语
现已将VB中实现动态含DateTime类型存储过程介绍完毕为您提供了解决存储过程又途径愿您在掌握SQL Server 2000数据库存储过程这技术中畅通无阻马到成功
本环境是Win2000中文网络版;SQL Server 2000专业版;中文VB6.0
最新评论