.Net ADO连接类

时间:2011-04-25 14:20:05

标签: asp.net sql-server vb.net ado.net

我创建了一个连接类,它应该将数据表/ datareaders等返回到我的网页。我担心使用这个类不会正确关闭连接。这是班级:

Imports Microsoft.VisualBasic

Namespace myConnection
  Public Class DB

      Public Shared Function GetConnStr()
                    Return "server=foobar"
      End Function


      Public Shared Function OpenConn()
                    Return New System.Data.SqlClient.SqlConnection( GetConnStr )
      End Function

      Public Shared Function OpenReader(SQL As String)

                    Dim conn 
                    conn = OpenConn
                    conn.Open

                    Return New System.Data.SqlClient.SqlCommand(SQL, conn).ExecuteReader(System.Data.CommandBehavior.CloseConnection)

      End Function

      Public Shared Function OpenTable(SQL As String)

                    Dim conn 
                    conn = OpenConn
                    conn.Open

                    Dim dr As System.Data.SqlClient.SqlDataReader = New System.Data.SqlClient.SqlCommand(SQL, conn).ExecuteReader(System.Data.CommandBehavior.CloseConnection)
                    Dim dt As System.Data.DataTable = New System.Data.DataTable()
          dt.Load(dr)

                    Return dt 

      End Function

      Public Shared Function ExecuteSQL(SQL As String)

                    Dim conn 
                    conn = OpenConn
                    conn.Open

                    Return New System.Data.SqlClient.SqlCommand(SQL, conn).ExecuteNonQuery()

      End Function


  End Class
End Namespace

以下是我使用它的方式:

rst = conn.OpenReader(SQL)
While rst.Read  
end while
rst.close

我担心一旦我投入生产,连接将无法正常关闭,我的网站将失败。我是.net的新手,这个班级背后的校长有什么不对吗?

3 个答案:

答案 0 :(得分:2)

你是对的:你的连接不会以这种方式关闭。更糟糕的是,通过只为您的sqlcommand接受字符串,您可以打开自己的sql注入安全漏洞。作为更好模式的一个例子,我用来填充数据表的代码看起来更像是这样:

Public Function GetDataTable(ByVal sql As String, ByVal AddParameters As Action(Of SqlParameterCollection)) As DataTable
    Dim result As New DataTable()
    Using cn As SqlConnection = OpenConn(), _
          cmd As New SqlCommand(sql, cn)

        AddParameters(cmd.Parameters)

        Using rdr As SqlDataReader = cmd.ExecuteReader
            result.Load(rdr)
        End Using
    End Using
    Return result
End Function

然后我会调用这样的代码:

Dim data As DataTable = GetDataTable("SELECT * FROM SomeTable WHERE ID= @ID", _ 
       Sub(p)
           p.Add("@ID", SqlDbType.Int).Value = 12345
       End Sub )

我在C#中有类似的代码用于SqlDataReader,但是它需要使用迭代器块,并且该功能不可用于VB 只有just added to VB.Net带有visual studio 2010的服务包和Async CTP在几周前发布。这里要带走的重要一点是我使用Using块正确封装了sql连接,代码鼓励正确使用查询参数。

答案 1 :(得分:0)

不幸的是,我同意其他一条评论。你为什么要编写自己的连接类?

使用ADO.NET EF或LINQ To SQL来管理上下文中的连接。

如果您继续执行您正在执行的操作,请将您的连接包装在“使用”块中。

答案 2 :(得分:0)

我使用一个模块来调用数据库,如果你使用多种形式,可以节省很多行......

这是我的模块形式:

Public cn As OleDbConnection

Public Sub InitDatabase()
    Dim sDBase As String = "DB.mdb"
    cn= New OleDbConnection
    cn.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0; Data Source=" & sDBase
End Sub

然后对于callin数据库使用这个:

Private ds As New DataSet
Private da As New OleDbDataAdapter

modWijnen.InitDatabase()

    Dim cm As New OleDbCommand("Select * from Table1", cn)
    da = New OleDbDataAdapter(cm)

    If (ds.Tables.Contains("Table1") = False) Then
        da.Fill(ds, "Table1")
    End If

我希望这对你有所帮助......