VB备忘录(21)ADO实例

来源:互联网 发布:python nonzero 编辑:程序博客网 时间:2024/06/01 10:23

一、增加数据记录:

       rs.AddNew   '增加一个新行(记录)

       rs.fields(0)=...      '各个字段赋值

      ......

       rs.Update            '更新到数据库


     1、增加字符型或数值型。

           字符型前加Str,数据型加Val,这样转型是为了和数据库匹配。

            

  

      2、增加日期型字段记录

           


     3、增加图文混排记录。

           实际上就是用二进制办法。应用stream对象

           写进记录:   stream.loadfromfile  

                                  rs.fields(X)=stream.read

           取出记录:   stream.write  rs.fields(X)

                                   stream.savetofile

          

   

二、修改记录

       步骤:   定位,定位到要修改的记录上

                      修改,修改定位记录上的字段值

                      更新,将修改值更新到数据库中。

       基本上与新增一致,只是少了一个新增空行(AddNew)

     1、修改字符型或数据值,与前面类同


      2、修改日期型数据值

            

        con.Open        rs.Open "select * from 图书销售员 where 员工号='" & Text1(0) & "'", con, adOpenKeyset, adLockOptimistic                  '按员工号查询        For i = 0 To 1                                          '设置字段内容            rs.Fields(i) = Trim(Text1(i).Text)        Next i        rs.Fields(2) = DTPicker1.Value        rs.Update                                               '保存

       3、修改图片值

            

            con.Open            rs.Open "select * from 图书销售员  where 员工号='" & Text1(0) & "'", con, adOpenKeyset, adLockOptimistic            stm.Open                                            '打开Stream对象            stm.Type = adTypeBinary                             '类型为二进制流            stm.LoadFromFile .FileName                              '将文件加载至数据流对象            rs.Fields(0) = Trim(Text1(0).Text)                          '设置字段内容            rs.Fields(1) = Trim(Text1(1).Text)            rs.Fields(3) = stm.Read                                 '添加图片到相应的字段            rs.Update                                           '更新

 


三、删除记录

        用SQL语句就OK啦。

        不过还有一个用RS(CMD)的Delete方法 

         

    con.Open    rs.Open "select * from 图书销售员  where  员工号 ='" & Trim(Text1(0).Text) & "' ", con, adOpenKeyset, adLockOptimistic  '按员工编号查询    rs.Delete                                               '删除


四、事务处理

       事务就是一批SQL一起执行。

       cn.BeginTrains         ‘事务开始

              ...........一批SQL

        cn.CommitTrans      '事务提交(执行)

        .......

        cn.RollbackTrans     '如果异常,事务回滚(就是恢复最初状态)

    

    cn.Open    rs.Open "select * from 作者 ", cn, adOpenKeyset, adLockOptimistic  '查询生成记录集    cn.BeginTrans    rs.AddNew    For i = 0 To 4                                              '设置各个字段内容        rs.Fields(i) = Trim(Text1(i).Text)    Next i    rs.Update    x = MsgBox("是否添加数据", vbYesNo)                         '弹出确认对话框    If x = vbYes Then                                           '当按Yes按钮        cn.CommitTrans    Else                                                        '当按No按钮        cn.RollbackTrans    End If




五、查询记录

       用得最多的就是查询。有两个,一个是用move,另一个是find

     1、move

          movenext ,movelast,  movefirst ,moveprevious

          这个要注意游标的是否可移动。


   2、Find 方法

    在 Recordset 中搜索满足指定条件的行。可选择指定搜索方向、起始行和从起始行的偏移量。如果满足条件,当前行的位置将设置在找到的记录上;否则将把当前行位置设置为 Recordset 的结尾(或开始)处。

语法
Find (Criteria, SkipRows, SearchDirection, Start)
参数
Criteria String 值,包含指定用于搜索的列名、比较操作符和值的语句。 
SkipRows 可选。Long 值,其默认值为零,它指定当前行或 Start 书签的行偏移量以开始搜索。
          在默认情况下,搜索将从当前行开始。 
SearchDirection 可选。SearchDirectionEnum 值,指定搜索应从当前行开始,还是从搜索方向的
               下一个有效行开始。如果该值为 adSearchForward,不成功的搜索将在 Recordset 
               的结尾处停止。如果该值为 adSearchBackward,不成功的搜索将在 Recordset 的开始处停止。 
Start 可选。Variant 书签,用于标记搜索的开始位置。 

说明
1、在 criteria 中只能指定单列名称。此方法不支持多列搜索。
2、Criteria 中的比较操作符可以是“>”(大于)、“<”(小于)、“=”(等于)、“>=”(大于或等于)、“<=”(小于或等于)、“<>”(不等于)或“like”(模式匹配)。
3、Criteria 中的值可以是字符串、浮点数或者日期。字符串值用单引号或“#”标记(数字号)分隔(如“state = 'WA'”或“state = #WA#”)。日期值用“#”标记(数字号)分隔(如“start_date > #7/22/97#”)并可包括小时、分钟和秒以指示时间戳,但不能包括毫秒,否则将出现错误。
4、如果比较操作符为“like”,可以在字符串值中包含星号 (*) 以查找一次或多次出现的任意字符或子字符串。例如,“state like 'M*'”与 Maine 和 Massachusetts 匹配。您还可以使用前导和后续星号以查找包含在值内的子字符串。例如,“state like '*as*'”与 Alaska、Arkansas 和 Massachusetts 匹配。

星号可以只在条件字符串的结尾使用,也可以在条件字符串的开头和结尾一起使用,如上所示。不能将星号作为前导通配符 ('*str') 或嵌入通配符 ('s*r') 使用。这将引发错误。

注意   如果在调用 Find 前未设置当前行的位置,将发生错误。设置行位置的任何方法(如 MoveFirst)都应在调用 Find 之前调用。
注意   如果调用记录集的 Find 方法,并且记录集的当前位置在最后一个记录上或文件结尾 (EOF),则不能找到任何结果。您需要调用 MoveFirst 方法以将当前位置/游标设置到记录集的开始处。


          (1) 字符查询,若是其它类型加上str。(数值查询一样得转换成数值val)

             



           (2)、日期查询(前后加#)

                



            (3) cn.execute查询得出的结果是只读向前的游标

                  


             (4)cmd.exectue带参数的执行

                        Set recordset = command.Execute(RecordsAffected,Parameters,Options )

                        


      

            (5)Filter过滤  (属性,用一个条件表达式赋值给它)

                      rs.filter=条件表达式(形式如:FieldName-Operator-Value )

                     FieldName 必须为 Recordset 中的有效字段名。如果字段名包含空格,必须用方括号将字段名括起来。
                     Operator 必须使用的操作符为:<、>、<=、>=、<>、= 或 LIKE。
                    Value 是用于与字段值(如 'Smith'、#8/24/95#、12.345 或 $50.00)进行比较的值。字符串使用单引号而日期使用井号 (#),对于数字,可以使用小数点、

                                 货币符号和科学记数法。如果 Operator 为 LIKE,Value 则可使用通配符。只允许使用星号 (*) 和百分号 (%) 通配符,而且必须为字符串的尾字符。

                                 Value 不可为 Null。
                     AND 和 OR 在级别上没有先后之分。可使用括号将子句分组。但不能象以下示例那样先将由 OR 联接的子句分组,然后将该组用 and 联接到其他子句。
                                             (LastName = 'Smith' OR LastName = 'Jones') AND FirstName = 'John'
                                           与之相反,可以构造如下形式的筛选:
                                          (LastName = 'Smith' AND FirstName = 'John') OR (LastName = 'Jones' AND FirstName = 'John')
                     在 LIKE 子句中,可在样式的开头和结尾使用通配符(如 LastName Like '*mit*'),或者只在结尾使用通配符(如,LastName Like 'Smit*') 。 

                  



============================下面很少用,但很重要=============================


六、获取数据库或表的结构信息。

       怎么取得服务器上有多少了数据库?

       数据库上有多少表名?

       数据库上字段名,主键、等信息?

      cn.openschema方法提供了一个方法,它返回的是一个recordset对象,里面包含了对应的信息。注意的是这个recordset是一个只读、静态的游标。

      

       Set  recordset = connection.OpenSchema(QueryType, Criteria, SchemaID)

                QueryType:指明结构查询类型(或内容)

                 Criteria      查询类型对应的参数值,可选。它是一个数组的形式,起到过滤行记录的作用。

      

       1、查看服务器上各数据库:

             


       2、查看服务器上各数据表

             


          3、查看指定数据库上的各数据表。

               有两种,一是从上面得出的rs中,逐条记录过滤,二是应用过滤参数进行过滤

              

             过滤中分别指出对应的过滤值,不过滤的用Empty代替。


          4、取得指定字段,判断类型和长度

Dim cn As New ADODB.ConnectionDim rs As New ADODB.RecordsetDim s  As StringPrivate Sub Command1_Click()    cn.Open "Provider=SQLOLEDB.1;Password=123;Persist Security Info=True;User ID=sa;Initial Catalog=book;Data Source=ZHENG"    Set rs = cn.OpenSchema(adSchemaTables)  '取得所有表    List1.AddItem "  " & "表的名称"    Do While Not rs.EOF()        List1.AddItem rs!TABLE_NAME        rs.MoveNext    Loop    rs.Close    cn.CloseEnd SubPrivate Sub List1_Click()    cn.ConnectionString = "PProvider=SQLOLEDB.1;Password=123;Persist Security Info=True;User ID=sa;Initial Catalog=book;Data Source=ZHENG"    cn.Open    Set rs = cn.OpenSchema(adSchemaColumns)  '取得所有列    List2.Clear    List2.AddItem "字段的名称" & "  " & "字段的类型" & "  " & "字段的长度"    Do While Not rs.EOF        If rs!TABLE_NAME = Trim(List1.Text) Then   '过滤,,可以在OpenSchema中加入过滤数组,从而省去这里的判断            If rs!data_type = "2" Then   '判断类型                s = "smallint"            ElseIf rs!data_type = "3" Then                s = "int "            ElseIf rs!data_type = "4" Then                s = "real"            ElseIf rs!data_type = "5" Then                s = "float"            ElseIf rs!data_type = "6" Then                s = "money"            ElseIf rs!data_type = "11" Then                s = "bit"            ElseIf rs!data_type = "12" Then                s = "sql_variant"            ElseIf rs!data_type = "17" Then                s = "tinyint"            ElseIf rs!data_type = "20" Then                s = "bigint"            ElseIf rs!data_type = "72" Then                s = "uniqueidentifier"            ElseIf rs!data_type = "128" Then                s = "varbinary"            ElseIf rs!data_type = "129" Then                s = "varchar"            ElseIf rs!data_type = "131" Then                s = "nvarchar"            ElseIf rs!data_type = "135" Then                s = "datetime"            End If            List2.AddItem rs!COLUMN_NAME & Space$(5) & s & Space$(5) & rs!character_maximum_length        End If        rs.MoveNext    Loop    rs.Close    cn.CloseEnd Sub






原创粉丝点击