对ADO.NET几个对象的第一次加工

来源:岁月联盟 编辑:exp 时间:2005-09-16
 

Namespace Tonton.DAL
  '//----------------------------------------
  '//《数据链接层》 之 《数据连接与命令行》
  '//----------------------------------------
  '//作者:张少棠 (Tonton)
  '//时间:2005年8月29日
  '//邮编:tonton@yeah.net
  '//主页:http://www.tonton.cn
  '//博客:http://blog.tonton.cn
  '//----------------------------------------

  '//----------------------------------------
  '//例子:
  '//----------------------------------------
  'Dim Conn As New Tonton.DAL.Connection
  'Dim Cmd As Tonton.DAL.Command
  '
  '  Try
  '    '//打开ACCESS数据库,也可以用连接字符串并采用Open方法,
  '    '//Conn.Open("Provider=Microsoft.Jet.OleDb.4.0;Data Source=" & Server.MapPath("db.mdb"))
  '    '//当然,如果知道是用ACCESS,你会用上面这个麻烦的方法吗?
  '    '//如果是SQL SERVER的话,可以用 Conn.OpenSqlServer 方法。
  '    '
  '    Conn.OpenAccess(Server.MapPath("db.mdb"))

  '    '//添加记录
  '    Cmd = Conn.Execute("Insert Into [Item]([Value]) VALUES (?)")
  '    Cmd.AddParam("添加的内容")
  '    Cmd.Update()

  '    '//删除记录
  '    Cmd = Conn.Execute("Delete From [Item] WHERE Id=?")
  '    Cmd.AddParam(6)      '//要删除的记录号
  '    Cmd.Update()

  '    '//更新记录
  '    Cmd = Conn.Execute("Update [Item] Set [Value]=? WHERE Id=?")
  '    Cmd.AddParam("新的内容")
  '    Cmd.AddParam(5)
  '    Cmd.Update()

  '    '//读取记录
  '    Cmd = Conn.Execute("Select * From [Item]")
  '    If Cmd.Read Then
  '      Response.Write(Cmd("Value"))
  '    Else
  '      Response.Write("OK")
  '    End If

  '  Catch ex As Exception
  '    '//出错处理
  '    Response.Write(ex)
  '  Finally
  '    '关闭连接
  '    Conn.Close()
  '    Cmd = Nothing
  '  End Try
  '//----------------------------------------
  '//例子结束
  '//----------------------------------------


  '//----------------------------------------
  '//类定义开始
  '//----------------------------------------

  '数据连接类型枚举
  Public Enum ConnectionType As Integer
    OleDb = 1
    SqlServer = 2
    'Oracle = 3
    'MySql = 4
  End Enum

  '连接字符串构造器类
  Public Class ConnectStringBuilder
    Public Shared Function JetOleDb(ByVal DataBasePath As String, Optional ByVal PassWord As String = "") As String
      If DataBasePath <> "" Then
        JetOleDb = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DataBasePath & ";"
        If PassWord <> "" Then
          JetOleDb &= "User ID='admin';Password=;Jet OLEDB:Database Password=" & PassWord
        End If
      End If
    End Function

    Public Shared Function SqlOleDb(Optional ByVal HostName As String = "localhost", Optional ByVal Catalog As String = "", Optional ByVal UserName As String = "sa", Optional ByVal PassWord As String = "") As String
      SqlOleDb = "Provider=SQLOLEDB.1;Persist Security Info=False;Data Source=" & HostName & ";Password=" & PassWord & ";User ID=" & UserName & ";"
      If Catalog <> "" Then SqlOleDb &= "Initial Catalog=" & Catalog & ";"
    End Function

    Public Shared Function SqlClient(Optional ByVal HostName As String = "localhost", Optional ByVal Catalog As String = "", Optional ByVal UserName As String = "sa", Optional ByVal PassWord As String = "") As String
      SqlClient = "Persist Security Info=False;Data Source=" & HostName & ";Password=" & PassWord & ";User ID=" & UserName & ";"
      If Catalog <> "" Then SqlClient &= "Initial Catalog=" & Catalog & ";"
    End Function

    Public Shared Function Dsn(ByVal DsnName As String) As String
      Return "DSN=" & DsnName
    End Function
  End Class

  '连接对象类
  Public Class Connection
    Private _dbConn As IDbConnection
    Private _ConnStr As String
    Private _dbType As ConnectionType = ConnectionType.OleDb

    Public Sub New(Optional ByVal ConnectType As ConnectionType = ConnectionType.OleDb)
      _dbType = ConnectType
    End Sub

    Public Sub New(ByRef Connect As IDbConnection)
      If TypeOf Connect Is SqlClient.SqlConnection Then
        _dbType = ConnectionType.SqlServer
      ElseIf TypeOf Connect Is OleDb.OleDbConnection Then
        _dbType = ConnectionType.OleDb
      End If
    End Sub

    Public Sub New(ByVal ConnString As String, Optional ByVal ConnectType As ConnectionType = ConnectionType.OleDb)
      _dbType = ConnectType
      Me.ConnectString = ConnString
    End Sub

    '设置/返回连接字符串,设置的同时生成新的连接对象实例
    Public Property ConnectString() As String
      Get
        Return _ConnStr
      End Get
      Set(ByVal Value As String)
        _ConnStr = Value
        Try
          _dbConn.Close()
        Catch ex As Exception
        Finally
          If Value <> "" Then
            Select Case _dbType
              Case ConnectionType.OleDb
                _dbConn = New OleDb.OleDbConnection(_ConnStr)
              Case ConnectionType.SqlServer
                _dbConn = New SqlClient.SqlConnection(_ConnStr)
              Case Else
                _dbConn = Nothing
            End Select
          Else
            _dbConn = Nothing
          End If
        End Try
      End Set
    End Property

    '设置/返回连接类型
    Public Property ConnectType() As ConnectionType
      Get
        Return _dbType
      End Get
      Set(ByVal Value As ConnectionType)
        _dbType = Value
        Me.ConnectString = _ConnStr
      End Set
    End Property

    Protected Overrides Sub Finalize()
      Try
        _dbConn.Close()
        _dbConn.Dispose()
      Catch ex As Exception
      Finally
        MyBase.Finalize()
      End Try
    End Sub

    '返回连接对象
    Public ReadOnly Property Connection() As IDbConnection
      Get
        Return _dbConn
      End Get
    End Property

    '打开一个数据库连接,要指定连接类型(默认为OLEDB)
    Public Function Open(Optional ByVal ConnString As String = "", Optional ByVal ConnType As ConnectionType = ConnectionType.OleDb) As Boolean
      Try
        If ConnString <> "" Then
          _ConnStr = ConnString
          _dbType = ConnType
        End If
        _dbConn.Open()
        Return True
      Catch ex As Exception
        Throw ex
        Return False
      End Try
    End Function

    '打开一个ACCESS连接
    Public Function OpenAccess(ByVal DbPath As String, Optional ByVal PassWord As String = "") As Boolean
      If DbPath <> "" Then
        Try
          _ConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DbPath & ";"
          If PassWord <> "" Then
            _ConnStr &= "User ID='admin';Password=;Jet OLEDB:Database Password=" & PassWord
          End If
          _dbType = ConnectionType.OleDb
          _dbConn = New OleDb.OleDbConnection(_ConnStr)
          Return True
        Catch ex As Exception
          Throw ex
          Return False
        End Try
      End If
    End Function

    '打开一个SQL SERVER连接
    Public Function OpenSqlServer(Optional ByVal HostName As String = "localhost", Optional ByVal Catalog As String = "", Optional ByVal UserName As String = "sa", Optional ByVal PassWord As String = "") As Boolean
      Try
        _ConnStr = "Persist Security Info=False;Data Source=" & HostName & ";Password=" & PassWord & ";User ID=" & UserName & ";"
        If Catalog <> "" Then _ConnStr &= "Initial Catalog=" & Catalog & ";"

        _dbType = ConnectionType.SqlServer
        _dbConn = New SqlClient.SqlConnection(_ConnStr)
        Return True
      Catch ex As Exception
        Throw ex
        Return False
      End Try
    End Function

    '关闭数据连接
    Public Sub Close()
      Try
        _dbConn.Close()
        _dbConn = Nothing
      Catch ex As Exception
      End Try
    End Sub

    '执行一个SQL语句,生成或不生成一个Command对象
    Public Function Execute(ByVal Sql As String, Optional ByVal NonQuery As Boolean = False) As Command
      Execute = New Command(_dbConn, Sql)
      If NonQuery Then Execute.Update()
    End Function

    '生成一个DataSet,不再需要手工生成DataAdapter对象了。
    Public ReadOnly Property DataSource(ByVal Sql As String, Optional ByVal Name As String = "", Optional ByVal Schema As Boolean = False) As DataSet
      Get
        Dim Ds As IDataAdapter
        Select Case _dbType
          Case ConnectionType.OleDb
            Ds = New OleDb.OleDbDataAdapter(Sql, _dbConn)
          Case ConnectionType.SqlServer
            Ds = New SqlClient.SqlDataAdapter(Sql, _dbConn)
        End Select

        If Name = "" Then
          DataSource = New DataSet
        Else
          DataSource = New DataSet(Name)
        End If

        If Schema Then Ds.FillSchema(DataSource, SchemaType.Source)
        Ds.Fill(DataSource)
      End Get
    End Property
  End Class

  '命令行类
  Public Class Command
    Private _Cmd As IDbCommand
    Private _Sql As String
    Private _Conn As IDbConnection
    Private _rdr As IDataReader
    Private _dbType As ConnectionType

    Public Sub New(ByRef Connect As IDbConnection)
      _Conn = Connect
      If TypeOf Connect Is OleDb.OleDbConnection Then
        _dbType = ConnectionType.OleDb
      ElseIf TypeOf Connect Is SqlClient.SqlConnection Then
        _dbType = ConnectionType.SqlServer
      End If
    End Sub

    Public Sub New(ByRef Connect As IDbConnection, ByVal Sql As String)
      _Conn = Connect
      If TypeOf Connect Is OleDb.OleDbConnection Then
        _dbType = ConnectionType.OleDb
      ElseIf TypeOf Connect Is SqlClient.SqlConnection Then
        _dbType = ConnectionType.SqlServer
      End If
      Me.Sql = Sql
    End Sub

    Protected Overrides Sub Finalize()
      Try
        _Cmd.Dispose()
        _rdr.Dispose()
        _Conn.Dispose()
      Catch ex As Exception
      Finally
        MyBase.Finalize()
      End Try
    End Sub

    '设置或返回连接对象
    Public Property Connect() As IDbConnection
      Get
        Return _Conn
      End Get
      Set(ByVal Value As IDbConnection)
        _Conn = Value
      End Set
    End Property

    '读取或设置SQL语句
    Public Property Sql() As String
      Get
        Return _Sql
      End Get
      Set(ByVal Value As String)
        _Sql = Value
        If _dbType = ConnectionType.SqlServer Then
          _Cmd = New SqlClient.SqlCommand(Sql, _Conn)
        Else
          _Cmd = New OleDb.OleDbCommand(_Sql, _Conn)
        End If
      End Set
    End Property

    '读取下一记录行,如果记录集没有打开,则自动打开。
    Public Function Read(Optional ByVal Behavior As System.Data.CommandBehavior = CommandBehavior.Default) As Boolean
      If _rdr Is Nothing Then
        Try
          _rdr = _Cmd.ExecuteReader(Behavior)
          Return _rdr.Read
        Catch ex As Exception
          Return False
        End Try
        Return False
      Else
        Return _rdr.Read
      End If
    End Function

    '//返回字段数
    Public Function FieldCount() As Integer
      Try
        Return _rdr.FieldCount
      Catch ex As Exception
        Return 0
      End Try
    End Function

    '//执行命令
    Public Function Update() As Boolean
      Try
        If _Conn.State <> ConnectionState.Open Then
          _Conn.Open()
        End If
        _Cmd.ExecuteNonQuery()
        Return True
      Catch ex As Exception
        Throw ex
        Return False
      End Try
    End Function

    '//读取字段或添加SQL的命名参数
    Default Public Property Item(ByVal Name As String)
      Get
        Return _rdr(Name)
      End Get
      Set(ByVal Value)
        AddParam(Value, Name)
      End Set
    End Property

    '//读取字段
    Default Public ReadOnly Property Item(ByVal Index As Integer)
      Get
        Return _rdr(Index)
      End Get
    End Property

    '//添加参数
    Public Function AddParam(ByRef Value As Object, Optional ByVal Name As String = "")
      If _dbType = ConnectionType.OleDb Then
        Return CType(_Cmd, OleDb.OleDbCommand).Parameters.Add(Name, Value)
      Else
        Return _Cmd.Parameters.Add(New SqlClient.SqlParameter("@" & Name, Value))
      End If
    End Function
  End Class
End Namespace