Select dữ liệu từ database ra SiteMapNode

Trong bài viết Xây dựng Menu đa cấp với Multi Sitemap mình có hướng dẫn cách tạo menu đa cấp với MultiSitemap với dữ liệu từ file.sitemap có sẵn. Bài này mình sẽ viết hàm trong SQL để lấy dữ liệu từ database dưới dạng SiteMapNode để sử dụng tạo menu đa cấp

Thường việc này bạn có thể dùng code asp.net (C# hay VB) để thực hiện bằng vòng lặp hoặc sử dụng System.Xml - XmlTextWriter để thực hiện. Nhưng bạn cũng có thể sử dụng vòng lặp trong SQL để thực hiện việc này. Ở đây mình viết hàm trong SQL kết quả trả về là nội dung của file MenuTop.sitemap. Hàm này lấy đến menu cấp 3. nếu dự án của bạn có nhiều hơn 3 cấp bạn hãy sửa lại hàm cho phù hợp

Bạn chạy hàm sau trong SQL

-- =============================================
-- Author:        webmaster@hmweb.com.vn
-- Description:   <Get Sitemap content>
-- =============================================
ALTER   FUNCTION [dbo].[fuGetTreeNodeMap]
(
)
RETURNS NVarChar(4000)
AS 
BEGIN
DECLARE @SQL nvarchar(4000)
SET @SQL=''
-- Khai báo mở sitemap
SET @SQL=@SQL+N'<?xml version="1.0" encoding="utf-8" ?>
<siteMap>'
-- Duyệt cây cấp 1 (Có Decen=0)
DECLARE @CateID int, @CateName nvarchar(200), @Link nvarchar(200)
Declare CursorCategory Cursor For SELECT CateID, CateName, Link FROM TBCategory WHERE Decen=0
Open CursorCategory
Fetch next from CursorCategory INTO @CateID, @CateName , @Link
while @@FetchStatus =0
BEGIN
-- Nếu cây cấp 1 không có con thì đóng luôn TreeNode
IF dbo.fuCountSubMenu(@CateID)=0
BEGIN
      SET @SQL=@SQL+ '
      <siteMapNode url="'+dbo.ufDomainName() + @Link + '" title="' + @CateName + '" />'
END
-- Nếu cây cấp 1 có con thì mở TreeNote và tiếp tục duyệt cây cấp 2
      ELSE
      BEGIN
            SET @SQL=@SQL+ '
            <siteMapNode url="'+dbo.ufDomainName() + @Link + '" title="' + @CateName + '" >'
            -- Duyệt cây cấp 2
                  DECLARE @CateID2 int, @CateName2 nvarchar(200), @Link2 nvarchar(200)
                  Declare CursorCategory2 Cursor For SELECT CateID, CateName, Link FROM TBCategory WHERE Decen=1 AND  ParentID=@CateID
                  Open CursorCategory2
                  Fetch next from CursorCategory2 INTO @CateID2, @CateName2 , @Link2
                  WHILE @@FETCHSTATUS=0
                  BEGIN
                        -- Nếu cây cấp 2 không có con thì đóng luôn TreeNode
                        IF dbo.fuCountSubMenu(@CateID2)=0
                              BEGIN
                                    SET @SQL=@SQL+ '<siteMapNode url="'+dbo.ufDomainName() + @Link2 + '" title="' + @CateName2 + '" />'
                              END
                        -- Nếu cây cấp 2 có con thì mở TreeNode và tiếp tục duyệt cây cấp 3
                        ELSE
                              BEGIN
                              SET @SQL=@SQL+ '
                                    <siteMapNode url="'+dbo.ufDomainName() + @Link2 + '" title="' + @CateName2 + '" >'
                                    -- Duyệt cây cấp 3
                                    DECLARE @CateID3 int, @CateName3 nvarchar(200), @Link3 nvarchar(200)
                                    Declare CursorCategory3 Cursor For SELECT CateID, CateName, Link FROM TBCategory WHERE Decen=2 AND ParentID=@CateID2
                                    Open CursorCategory3
                                    Fetch next from CursorCategory3 INTO @CateID3, @CateName3 , @Link3
                                    WHILE @@FETCHSTATUS=0
                                          BEGIN
                                                SET @SQL=@SQL+ '
                                                <siteMapNode url="'+dbo.ufDomainName() + @Link3 + '" title="' + @CateName3 + '" />'
                                          FETCH NEXT FROM CursorCategory3 INTO @CateID3, @CateName3 , @Link3
                                          END
                                    Close CursorCategory3
                                    DEALLOCATE CursorCategory3
                                    SET @SQL=@SQL+ '</siteMapNode>'
                              END
                        FETCH NEXT FROM CursorCategory2 INTO @CateID2, @CateName2 , @Link2
                  END
                  Close CursorCategory2
                  DEALLOCATE CursorCategory2
                  SET @SQL=@SQL+ '</siteMapNode>'
            END
FETCH NEXT FROM CursorCategory INTO @CateID, @CateName , @Link
END
Close CursorCategory
DEALLOCATE CursorCategory
--Đóng sitemap
SET @SQL=@SQL+'
</siteMap>'
-- Print @SQL
RETURN  @SQL
END

Nếu bảng TBCategory của bạn có nhiều bản ghi thì độ dài chuỗi @SQL có thể quá 4000. Khi đó bạn cần phân tách và ghép chuỗi lại

Kết quả hàm trên (hoặc bạn thử bằng lệnh Print @SQL) như sau (Bạn có thể copy vào visual studio để xem đúng cấu trúc)

<?xml version="1.0" encoding="utf-8" ?>
<siteMap>
  <siteMapNode url="http://www.hmweb.com.vn" title="Thể thao" >
    <siteMapNode url="http://www.hmweb.com.vn" title="Pháp luật" />
    <siteMapNode url="http://www.hmweb.com.vn" title="Môi trường" />
  </siteMapNode>
  <siteMapNode url="http://www.hmweb.com.vn" title="Thể thao" >
    <siteMapNode url="http://www.hmweb.com.vn" title="Bóng đá" >
      <siteMapNode url="http://www.hmweb.com.vn" title="Bóng đá trong nước" />
      <siteMapNode url="http://www.hmweb.com.vn" title="Bóng đá Anh" />
      <siteMapNode url="http://www.hmweb.com.vn" title="Bóng đá TBN" />
      <siteMapNode url="http://www.hmweb.com.vn" title="Bóng đá Ý" />
    </siteMapNode>
    <siteMapNode url="http://www.hmweb.com.vn" title="Quần vợt" />
  </siteMapNode>
  <siteMapNode url="http://www.hmweb.com.vn" title="Sức khỏe" />
  <siteMapNode url="http://www.hmweb.com.vn" title="Kinh doanh" >
    <siteMapNode url="http://www.hmweb.com.vn" title="Chứng khoán" />
    <siteMapNode url="http://www.hmweb.com.vn" title="Thị trường" />
    <siteMapNode url="http://www.hmweb.com.vn" title="Doanh nghiệp" />
  </siteMapNode>
  <siteMapNode url="http://www.hmweb.com.vn" title="Giải trí" />
</siteMap>

Khi đã có dữ liệu hàm trên rồi bạn có thể chạy thử bằng câu lệnh SELECT dbo.fuGetTreeNode_Map() để xem kết quả.
Từ kết quả trên để đưa ra file.sitemap bạn chỉ cần viết 1 hàm (C#) write ra file với phát biểu Select là xong.

Có thời gian mình sẽ hướng dẫn dùng asp.net để bind dữ liệu thàng sitemap

Chúc các bạn thành công

Khắc phục lỗi Visual Studio 2008 Debug bằng firefox chạy chậm trên Win7

Lúc trước tui chạy win 7 thấy Debug Visual Studio 2008 tại firefox rất nhanh sau khi quyết định lên đời win7 thì thì debug trên firefox rất chậm làm điên đách chiệu nổi sau hồi tìm hiểu thì đã biết các phục

ta làm các bước như sau:

    * vào address gõ  "about:config"
    * Tại Filter gõ  "v6"
    * tắt chế độ ipv6.

Như hình hình minh họa

 

 

thể là xong không sợ chậm nữa

SQL Data Provider VB.NET Class

Imports System
Imports System.IO
Imports System.Text
Imports System.Data
Imports System.Data.SqlClient

Namespace SqlDataProvider

    ''' <summary>
    ''' This class provides a fast and universal method for accessing SQL Server database.This class cannot be inherited.
    ''' </summary>
    Public NotInheritable Class SqlDatabase

#Region " Local Property Declarations "

        Dim _connectionString As String

#End Region

#Region " Constructor "

        ''' <summary>
        ''' Initializes a new instance of the ADO.SqlDatabase class.
        ''' </summary>
        ''' <param name="connectionString">The connection used to open the SQL Server database.</param>
        Public Sub New(ByVal connectionString As String)
            _connectionString = connectionString
        End Sub

#End Region

#Region " Public Properties "

        ''' <summary>
        ''' Gets or sets the string used to open a SQL Server database.
        ''' </summary>
        ''' <returns>The connection string that includes the source database name, and other parameters needed to establish the initial connection.</returns>
        Public Property ConnectionString() As String
            Get
                Return _connectionString
            End Get
            Set(ByVal value As String)
                _connectionString = value
            End Set
        End Property

#End Region

#Region " Private Methods "

        Private Sub AssignParameters(ByVal cmd As SqlCommand, ByVal cmdParameters() As SqlParameter)
            If (cmdParameters Is Nothing) Then Exit Sub
            For Each p As SqlParameter In cmdParameters
                cmd.Parameters.Add(p)
            Next
        End Sub

        Private Sub AssignParameters(ByVal cmd As SqlCommand, ByVal parameterValues() As Object)
            If Not (cmd.Parameters.Count - 1 = parameterValues.Length) Then Throw New ApplicationException("Stored procedure's parameters and parameter values does not match.")
            Dim i As Integer
            For Each param As SqlParameter In cmd.Parameters
                If Not (param.Direction = ParameterDirection.Output) AndAlso Not (param.Direction = ParameterDirection.ReturnValue) Then
                    param.Value = parameterValues(i)
                    i += 1
                End If
            Next
        End Sub

#End Region

#Region " ExecuteNonQuery "

        ''' <summary>
        ''' Executes a Transact-SQL statement against the connection and returns the number of rows affected.
        ''' </summary>
        ''' <param name="cmd">The Transact-SQL statement or stored procedure to execute at the data source.</param>
        ''' <param name="cmdType">A value indicating how the System.Data.SqlClient.SqlCommand.CommandText property is to be interpreted.</param>
        ''' <param name="parameters">The parameters of the Transact-SQL statement or stored procedure.</param>
        ''' <returns>The number of rows affected.</returns>
        Public Function ExecuteNonQuery(ByVal cmd As String, ByVal cmdType As CommandType, Optional ByVal parameters() As SqlParameter = Nothing) As Integer
            Dim connection As SqlConnection = Nothing
            Dim transaction As SqlTransaction = Nothing
            Dim command As SqlCommand = Nothing
            Dim res As Integer = -1
            Try
                connection = New SqlConnection(_connectionString)
                command = New SqlCommand(cmd, connection)
                command.CommandType = cmdType
                Me.AssignParameters(command, parameters)
                connection.Open()
                transaction = connection.BeginTransaction()
                command.Transaction = transaction
                res = command.ExecuteNonQuery()
                transaction.Commit()
            Catch ex As Exception
                If Not (transaction Is Nothing) Then
                    transaction.Rollback()
                End If
                Throw New SqlDatabaseException(ex.Message, ex.InnerException)
            Finally
                If Not (connection Is Nothing) AndAlso (connection.State = ConnectionState.Open) Then connection.Close()
                If Not (command Is Nothing) Then command.Dispose()
                If Not (transaction Is Nothing) Then transaction.Dispose()
            End Try
            Return res
        End Function

        ''' <summary>
        ''' Executes a Transact-SQL statement against the connection and returns the number of rows affected.
        ''' </summary>
        ''' <param name="spname">The stored procedure to execute at the data source.</param>
        ''' <param name="returnValue">The returned value from stored procedure.</param>
        ''' <param name="parameterValues">The parameter values of the stored procedure.</param>
        ''' <returns>The number of rows affected.</returns>
        Public Function ExecuteNonQuery(ByVal spname As String, ByRef returnValue As Integer, ByVal ParamArray parameterValues() As Object) As Integer
            Dim connection As SqlConnection = Nothing
            Dim transaction As SqlTransaction = Nothing
            Dim command As SqlCommand = Nothing
            Dim res As Integer = -1
            Try
                connection = New SqlConnection(_connectionString)
                command = New SqlCommand(spname, connection)
                command.CommandType = CommandType.StoredProcedure
                connection.Open()
                SqlCommandBuilder.DeriveParameters(command)
                Me.AssignParameters(command, parameterValues)
                transaction = connection.BeginTransaction()
                command.Transaction = transaction
                res = command.ExecuteNonQuery()
                returnValue = command.Parameters(0).Value
                transaction.Commit()
            Catch ex As Exception
                If Not (transaction Is Nothing) Then
                    transaction.Rollback()
                End If
                Throw New SqlDatabaseException(ex.Message, ex.InnerException)
            Finally
                If Not (connection Is Nothing) AndAlso (connection.State = ConnectionState.Open) Then connection.Close()
                If Not (command Is Nothing) Then command.Dispose()
                If Not (transaction Is Nothing) Then transaction.Dispose()
            End Try
            Return res
        End Function

#End Region

#Region " ExecuteScalar "

        ''' <summary>
        ''' Executes the query, and returns the first column of the first row in the result set returned by the query. Additional columns or rows are ignored.
        ''' </summary>
        ''' <param name="cmd">The Transact-SQL statement or stored procedure to execute at the data source.</param>
        ''' <param name="cmdType">A value indicating how the System.Data.SqlClient.SqlCommand.CommandText property is to be interpreted.</param>
        ''' <param name="parameters">The parameters of the Transact-SQL statement or stored procedure.</param>
        ''' <returns>The first column of the first row in the result set, or a null reference if the result set is empty.</returns>
        Public Function ExecuteScalar(ByVal cmd As String, ByVal cmdType As CommandType, Optional ByVal parameters() As SqlParameter = Nothing) As Object
            Dim connection As SqlConnection = Nothing
            Dim transaction As SqlTransaction = Nothing
            Dim command As SqlCommand = Nothing
            Dim res As Object = Nothing
            Try
                connection = New SqlConnection(_connectionString)
                command = New SqlCommand(cmd, connection)
                command.CommandType = cmdType
                Me.AssignParameters(command, parameters)
                connection.Open()
                transaction = connection.BeginTransaction()
                command.Transaction = transaction
                res = command.ExecuteScalar()
                transaction.Commit()
            Catch ex As Exception
                If Not (transaction Is Nothing) Then
                    transaction.Rollback()
                End If
                Throw New SqlDatabaseException(ex.Message, ex.InnerException)
            Finally
                If Not (connection Is Nothing) AndAlso (connection.State = ConnectionState.Open) Then connection.Close()
                If Not (command Is Nothing) Then command.Dispose()
                If Not (transaction Is Nothing) Then transaction.Dispose()
            End Try
            Return res
        End Function

        ''' <summary>
        ''' Executes the query, and returns the first column of the first row in the result set returned by the query. Additional columns or rows are ignored.
        ''' </summary>
        ''' <param name="spname">The stored procedure to execute at the data source.</param>
        ''' <param name="returnValue">The returned value from stored procedure.</param>
        ''' <param name="parameterValues">The parameter values of the stored procedure.</param>
        ''' <returns>The first column of the first row in the result set, or a null reference if the result set is empty.</returns>
        Public Function ExecuteScalar(ByVal spname As String, ByRef returnValue As Integer, ByVal ParamArray parameterValues() As Object) As Object
            Dim connection As SqlConnection = Nothing
            Dim transaction As SqlTransaction = Nothing
            Dim command As SqlCommand = Nothing
            Dim res As Object = Nothing
            Try
                connection = New SqlConnection(_connectionString)
                command = New SqlCommand(spname, connection)
                command.CommandType = CommandType.StoredProcedure
                connection.Open()
                SqlCommandBuilder.DeriveParameters(command)
                Me.AssignParameters(command, parameterValues)
                transaction = connection.BeginTransaction()
                command.Transaction = transaction
                res = command.ExecuteScalar()
                returnValue = command.Parameters(0).Value
                transaction.Commit()
            Catch ex As Exception
                If Not (transaction Is Nothing) Then
                    transaction.Rollback()
                End If
                Throw New SqlDatabaseException(ex.Message, ex.InnerException)
            Finally
                If Not (connection Is Nothing) AndAlso (connection.State = ConnectionState.Open) Then connection.Close()
                If Not (command Is Nothing) Then command.Dispose()
                If Not (transaction Is Nothing) Then transaction.Dispose()
            End Try
            Return res
        End Function

#End Region

#Region " ExecuteReader "

        ''' <summary>
        ''' Sends the System.Data.SqlClient.SqlCommand.CommandText to the System.Data.SqlClient.SqlCommand.Connection, and builds a System.Data.SqlClient.SqlDataReader using one of the System.Data.CommandBehavior values.
        ''' </summary>
        ''' <param name="cmd">The Transact-SQL statement or stored procedure to execute at the data source.</param>
        ''' <param name="cmdType">A value indicating how the System.Data.SqlClient.SqlCommand.CommandText property is to be interpreted.</param>
        ''' <param name="parameters">The parameters of the Transact-SQL statement or stored procedure.</param>
        ''' <returns>A System.Data.SqlClient.SqlDataReader object.</returns>
        Public Function ExecuteReader(ByVal cmd As String, ByVal cmdType As CommandType, Optional ByVal parameters() As SqlParameter = Nothing) As IDataReader
            Dim connection As SqlConnection = Nothing
            Dim command As SqlCommand = Nothing
            Dim res As SqlDataReader = Nothing
            Try
                connection = New SqlConnection(_connectionString)
                command = New SqlCommand(cmd, connection)
                command.CommandType = cmdType
                Me.AssignParameters(command, parameters)
                connection.Open()
                res = command.ExecuteReader(CommandBehavior.CloseConnection)
            Catch ex As Exception
                Throw New SqlDatabaseException(ex.Message, ex.InnerException)
            End Try
            Return CType(res, IDataReader)
        End Function

        ''' <summary>
        ''' Sends the System.Data.SqlClient.SqlCommand.CommandText to the System.Data.SqlClient.SqlCommand.Connection, and builds a System.Data.SqlClient.SqlDataReader using one of the System.Data.CommandBehavior values.
        ''' </summary>
        ''' <param name="spname">The stored procedure to execute at the data source.</param>
        ''' <param name="returnValue">The returned value from stored procedure.</param>
        ''' <param name="parameterValues">The parameter values of the stored procedure.</param>
        ''' <returns>A System.Data.SqlClient.SqlDataReader object.</returns>
        Public Function ExecuteReader(ByVal spname As String, ByRef returnValue As Integer, ByVal ParamArray parameterValues() As Object) As IDataReader
            Dim connection As SqlConnection = Nothing
            Dim command As SqlCommand = Nothing
            Dim res As SqlDataReader = Nothing
            Try
                connection = New SqlConnection(ConnectionString)
                command = New SqlCommand(spname, connection)
                command.CommandType = CommandType.StoredProcedure
                connection.Open()
                SqlCommandBuilder.DeriveParameters(command)
                Me.AssignParameters(command, parameterValues)
                res = command.ExecuteReader(CommandBehavior.CloseConnection)
                returnValue = command.Parameters(0).Value
            Catch ex As Exception
                Throw New SqlDatabaseException(ex.Message, ex.InnerException)
            End Try
            Return CType(res, IDataReader)
        End Function

#End Region

#Region " FillDataset "

        ''' <summary>
        ''' Adds or refreshes rows in the System.Data.DataSet to match those in the data source using the System.Data.DataSet name, and creates a System.Data.DataTable named "Table."
        ''' </summary>
        ''' <param name="cmd">The Transact-SQL statement or stored procedure to execute at the data source.</param>
        ''' <param name="cmdType">A value indicating how the System.Data.SqlClient.SqlCommand.CommandText property is to be interpreted.</param>
        ''' <param name="parameters">The parameters of the Transact-SQL statement or stored procedure.</param>
        ''' <returns>A System.Data.Dataset object.</returns>
        Public Function FillDataset(ByVal cmd As String, ByVal cmdType As CommandType, Optional ByVal parameters() As SqlParameter = Nothing) As DataSet
            Dim connection As SqlConnection = Nothing
            Dim command As SqlCommand = Nothing
            Dim sqlda As SqlDataAdapter = Nothing
            Dim res As New DataSet
            Try
                connection = New SqlConnection(_connectionString)
                command = New SqlCommand(cmd, connection)
                command.CommandType = cmdType
                AssignParameters(command, parameters)
                sqlda = New SqlDataAdapter(command)
                sqlda.Fill(res)
            Catch ex As Exception
                Throw New SqlDatabaseException(ex.Message, ex.InnerException)
            Finally
                If Not (connection Is Nothing) Then connection.Dispose()
                If Not (command Is Nothing) Then command.Dispose()
                If Not (sqlda Is Nothing) Then sqlda.Dispose()
            End Try
            Return res
        End Function

#End Region

#Region " ExecuteDataset "

        ''' <summary>
        ''' Calls the respective INSERT, UPDATE, or DELETE statements for each inserted, updated, or deleted row in the System.Data.DataSet with the specified System.Data.DataTable name.
        ''' </summary>
        ''' <param name="insertCmd">A command used to insert new records into the data source.</param>
        ''' <param name="updateCmd">A command used to update records in the data source.</param>
        ''' <param name="deleteCmd">A command for deleting records from the data set.</param>
        ''' <param name="ds">The System.Data.DataSet to use to update the data source. </param>
        ''' <param name="srcTable">The name of the source table to use for table mapping.</param>
        ''' <returns>The number of rows successfully updated from the System.Data.DataSet.</returns>
        Public Function ExecuteDataset(ByVal insertCmd As SqlCommand, ByVal updateCmd As SqlCommand, ByVal deleteCmd As SqlCommand, ByVal ds As DataSet, ByVal srcTable As String) As Integer
            Dim connection As SqlConnection = Nothing
            Dim sqlda As SqlDataAdapter = Nothing
            Dim res As Integer = 0
            Try
                connection = New SqlConnection(_connectionString)
                sqlda = New SqlDataAdapter
                If Not (insertCmd Is Nothing) Then insertCmd.Connection = connection : sqlda.InsertCommand = insertCmd
                If Not (updateCmd Is Nothing) Then updateCmd.Connection = connection : sqlda.UpdateCommand = updateCmd
                If Not (deleteCmd Is Nothing) Then deleteCmd.Connection = connection : sqlda.DeleteCommand = deleteCmd
                res = sqlda.Update(ds, srcTable)
            Catch ex As Exception
                Throw New SqlDatabaseException(ex.Message, ex.InnerException)
            Finally
                If Not (connection Is Nothing) Then connection.Dispose()
                If Not (insertCmd Is Nothing) Then insertCmd.Dispose()
                If Not (updateCmd Is Nothing) Then updateCmd.Dispose()
                If Not (deleteCmd Is Nothing) Then deleteCmd.Dispose()
                If Not (sqlda Is Nothing) Then sqlda.Dispose()
            End Try
            Return res
        End Function

#End Region

#Region " ExecuteScript "

        ''' <summary>
        ''' Executes a SQL query file against the connection.
        ''' </summary>
        ''' <param name="filename">SQL query file name.</param>
        ''' <param name="parameters">The parameters of the SQL query file.</param>
        Public Sub ExecuteScript(ByVal filename As String, Optional ByVal parameters() As SqlParameter = Nothing)
            Dim fStream As FileStream = Nothing
            Dim sReader As StreamReader = Nothing
            Dim connection As SqlConnection = Nothing
            Dim command As SqlCommand = Nothing
            Try
                fStream = New FileStream(filename, FileMode.Open, FileAccess.Read)
                sReader = New StreamReader(fStream)
                connection = New SqlConnection(ConnectionString)
                command = connection.CreateCommand()
                connection.Open()
                While (Not sReader.EndOfStream)
                    Dim sb As New StringBuilder
                    While (Not sReader.EndOfStream)
                        Dim s As String = sReader.ReadLine
                        If (Not String.IsNullOrEmpty(s)) AndAlso (s.ToUpper.Trim = "GO") Then
                            Exit While
                        End If
                        sb.AppendLine(s)
                    End While
                    command.CommandText = sb.ToString
                    command.CommandType = CommandType.Text
                    AssignParameters(command, parameters)
                    command.ExecuteNonQuery()
                End While
            Catch ex As Exception
                Throw New SqlDatabaseException(ex.Message, ex.InnerException)
            Finally
                If (Not IsNothing(connection)) AndAlso (connection.State = ConnectionState.Open) Then connection.Close()
                If (Not IsNothing(command)) Then command.Dispose()
                If (Not IsNothing(sReader)) Then sReader.Close()
                If (Not IsNothing(fStream)) Then fStream.Close()
            End Try
        End Sub

#End Region

    End Class

End Namespace

SqlDatabaseException

Namespace SqlDataProvider

    ''' <summary>
    ''' Represents errors that occur during application execution.
    ''' </summary>
    Public Class SqlDatabaseException
        Inherits Exception

#Region " Constructor "

        ''' <summary>
        ''' Initializes a new instance of the ADO.SqlDatabaseException class.
        ''' </summary>
        Public Sub New()
        End Sub

        ''' <summary>
        ''' Initializes a new instance of the ADO.SqlDatabaseException class with a specified error message.
        ''' </summary>
        ''' <param name="message">The message that describes the error.</param>
        Public Sub New(ByVal message As String)
            MyBase.New(message)
        End Sub

        ''' <summary>
        ''' Initializes a new instance of the ADO.SqlDatabaseException class with a specified error message and a reference to the inner exception that is the cause of this exception.
        ''' </summary>
        ''' <param name="message">The error message that explains the reason for the exception.</param>
        ''' <param name="innerException">The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified.</param>
        Public Sub New(ByVal message As String, ByVal innerException As Exception)
            MyBase.New(message, innerException)
        End Sub

#End Region

    End Class

End Namespace

Cách sử dụng

SQLDataProvider Class Documentation
This class provides a fast and universal method for accessing SQL Server database.
Create Instance
At first you create an instance of SqlDatabase class.

 

Dim sqldb As New SqlDatabase("Data Source=(local); Initial Catalog= ; UId = ; Pwd = ;")

For more information about connection strings, visit ConnectionStrings.com.

ExecuteNonQuery Method


Executes a Transact-SQL statement against the connection and returns the number of rows affected.

 

 

Dim params(0 To 1) As SqlParameter
params(0) = New SqlParameter("@Firstname", SqlDbType.NVarChar, 120)
params(0).Value = "Stefan"
params(1) = New SqlParameter("@Lastname", SqlDbType.NVarChar, 120)
params(1).Value = "Cameron"
sqldb.ExecuteNonQuery("Insert Into dbo.Users(Firstname, LastName) Values(@FirstName, @LastName)", CommandType.Text, params)

If you are using stored procedure,you can execute that without declaring parameters such as following code:

sqldb.ExecuteNonQuery("dbo.CreateUser", Nothing, "Stefan", "Cameron")

ExecuteScalar Method

Executes the query, and returns the first column of the first row in the result set returned by the query. Additional columns or rows are ignored.

Dim count As Integer = sqldb.ExecuteScalar("Select Count(*) From dbo.Users", CommandType.Text)
MsgBox("Number of row(s): " & count)


ExecuteReader Method
Sends the CommandText to the Connection and builds a SqlDataReader.

Dim FirstName As String = String.Empty
Dim LastName As String = String.Empty

Dim params(0) As SqlParameter
params(0) = New SqlParameter("@Id", SqlDbType.Int)
params(0).Value = 1

Dim dr As IDataReader = sqldb.ExecuteReader("Select * From dbo.Users Where (Id = @Id)", CommandType.Text, params)
While dr.Read()
    FirstName = dr("Firstname")
    LastName = dr("Lastname")
End While
dr.Close()

MsgBox(FirstName & " " & LastName, MsgBoxStyle.Information)

There is a sample for using stored procedure:

Create Procedure [dbo].[GetUserInfo]
    (
        @Id int
    )
As
Begin
    Select * From dbo.Users Where (Id = @Id)
End
Dim FirstName As String = String.Empty
Dim LastName As String = String.Empty

Dim dr As IDataReader = sqldb.ExecuteReader("dbo.GetUserInfo", Nothing, 1)
While dr.Read()
    FirstName = dr("Firstname")
    LastName = dr("Lastname")
End While
dr.Close()

MsgBox(FirstName & " " & LastName, MsgBoxStyle.Information)

Using Return Value Parameter
If you are using stored procedure,you can get the value of 'return value parameter'.

Create Procedure dbo.UserExists
    (
        @Firstname nvarchar(120),
        @Lastname nvarchar(120)
    )
As
Begin
    If Exists(Select * From dbo.Users Where (Firstname = @Firstname) And (Lastname = @Lastname))
        Return 1
End
Dim retval As Integer
sqldb.ExecuteNonQuery("dbo.UserExists", retval, "Stefan", "Cameron")
MsgBox("User Exists: " & IIf(retval = 1, "Yes", "No"))

FillDataset Method
Adds or refreshes rows in the System.Data.DataSet to match those in the data source using the System.Data.DataSet name, and creates a System.Data.DataTable named "Table."
Binding a DataGridView with FillDataset method.

DataGridView1.DataSource = sqldb.FillDataset("Select * From dbo.Users", CommandType.Text).Tables(0)

ExecuteDataset Method

Calls the respective INSERT, UPDATE, or DELETE statements for each inserted, updated, or deleted row in the System.Data.DataSet with the specified System.Data.DataTable name.

' Getting the System.Data.DataSet.
Dim ds As DataSet = CType(DataGridView1.DataSource, DataTable).DataSet

' Declaring insert command object
Dim inscmd As New SqlCommand("Insert Into dbo.Users(Firstname, Lastname) Values(@Firstname, @Lastname)")
With inscmd
    .CommandType = CommandType.Text
    .Parameters.Add(New SqlParameter("@Firstname", SqlDbType.NVarChar, 120)).SourceColumn = "Firstname"
    .Parameters.Add(New SqlParameter("@Lastname", SqlDbType.NVarChar, 120)).SourceColumn = "Lastname"
End With

' Declaring update command object
Dim updcmd As New SqlCommand("Update dbo.Users Set Firstname = @Firstname, Lastname = @Lastname Where (Id = @Id)")
With updcmd
    .CommandType = CommandType.Text
    .Parameters.Add(New SqlParameter("@Id", SqlDbType.Int)).SourceColumn = "Id"
    .Parameters.Add(New SqlParameter("@Firstname", SqlDbType.NVarChar, 120)).SourceColumn = "Firstname"
    .Parameters.Add(New SqlParameter("@Lastname", SqlDbType.NVarChar, 120)).SourceColumn = "Lastname"
End With

' Declaring delete command object
Dim delcmd As New SqlCommand("Delete From dbo.Users Where (Id = @Id)")
With delcmd
    .CommandType = CommandType.Text
    .Parameters.Add(New SqlParameter("@Id", SqlDbType.Int)).SourceColumn = "Id"
End With

' Updating data source
sqldb.ExecuteDataset(inscmd, updcmd, delcmd, ds, ds.Tables(0).TableName)