VB中实现动态调用含DateTime类型存储过程

前言:
    VB对数据库的编程有多种方法,如:ODBC API编程、RDO(远程数据对象)、DAO(数据访问对象)、ADO(ActiveX 数据对象)方法编程实现方便、快捷,但灵活性稍差。由于存储过程具有实现数据封装、隐藏以及代码的预编译、减少网络负载、维护方便等优点,所以被许多RDMBS和编程工具做支持。VB中的各类数据对象均都提供对存储过程的支持。所以要灵活掌握调用存储过程这一技术是十分必要。现在将VB中实现动态调用含DateTime类型的存储过程介绍给读者,让您很快掌握和运用这个方法,解决你身边的问题。

一、 简述SQL Server 2000 日期时间类型(含dateTime类型字段)
     该类型是由有效的日期或时间组成;年-月-日 小时:分:秒.千分之秒。其格式:
    请见图示1
        
 

  在现阶段开发设计ERP系统项目中,尤其在创建数据库表结构时,均要考虑到DateTime字段的应用,它能记载信息发生时间段的信息,能充分反映该区间数据变化;除特殊情况下(如:网吧、游戏吧等需记录小时、分、秒)之外,一般要考虑到日期范围即:[年、月、日]。
二、 我们以ADO为例来说明其实现步骤
     现在动态调用含有DateTime字段的存储过程,以帮助理解和掌握调用存储过方法:
   1>、使用Northwind的MS 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" 
  ON Orders.OrderID = "Order Subtotals".OrderID)
 ON Employees.EmployeeID = Orders.EmployeeID
  WHERE Orders.ShippedDate Between @Beginning_Date And @Ending_Date
  GO
   2>、在VB中生成一个新工程,工程添加一个窗体,三个Command(1,2,3)按钮,一个ListView控件,
       两个日期DTpicker控件,两个标签Label控件,一个文本TextBox控件。
       请见图示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的程序代码实现动态调用的三种方法
①. 窗体变量的设置
    Option Explicit
  Dim CNN1 As ADODB.Connection                        '连接
  Dim RS As ADODB.Recordset                              '结果集
  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()
    '在Listview控件中显示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
   '在Listview控件中显示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 Recordset
    '对字段进行中文提示的处理
    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] ON Orders.OrderID = [Order Subtotals].OrderID)   ON Employees.EmployeeID = Orders.EmployeeID  WHERE Orders.ShippedDate Between '" & DT10 & "' AND '" & DT20 & "'"
  If Len(Sql1) > 0 Then
       RS.Open Sql1, CNN1, adOpenStatic, adLockOptimistic
    '在Listview控件中显示RstByQuery记录集有效行
   If RS.Fields.Count > 0 Then
      i = RS.Fields.Count
      Listrec RS, LV
      RS.Close
   End If
End If
End Sub
⑤. 将结果集装入到ListView控件中
Sub Listrec(ByRef RS As Recordset, 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。
       -------------------------------------------------------------------------------

 

文章全文在2006-09-05发表在【天极开发版】请按下列网址查阅浏览。

刊登的网址:http://dev.yesky.com/115/2578115.shtml

VB中动态调用含DateTime类型存储过程的方法· 王倬行 天极开发-2006-09-15


 
    

posted on 2008-11-29 14:53  津东方  阅读(820)  评论(0编辑  收藏  举报

导航