Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 24 kết quả

Đề tài: Class kết nối và thực thi truy vấn SqlServer 2005

  1. #1
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Mặc định Class kết nối và thực thi truy vấn SqlServer 2005

    Cứ làm 1 cái project mới thì lại phải viết mấy cái này rất là phiền, thôi thì viết 1 lần dùng nhiều lần vậy
    Share lên cho mọi người nhận xét và thêm thắt cho đầy đủ nhá ^_^
    Code:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    using System.Data.SqlClient;
    using System.Collections;
    namespace DataObjects.SqlServer
    {
        class DataAccess
        {
            #region ----- Variables -----
            private SqlConnection objSqlConn;
            private string strConn = null;
            private SqlTransaction objSqlTrans;
            private static Hashtable paramCache = Hashtable.Synchronized(new Hashtable());
            #endregion
            #region ----- Constructors -----
            public DataAccess(string strConnectionString)
            {
                strConn = strConnectionString;
                objSqlConn = new SqlConnection(strConn);
            }
            #endregion
            #region ----- Transactions -----
            /// <summary>
            /// Mở transaction
            /// </summary>
            /// <returns></returns>
            public bool BeginTransaction()
            {
                try
                {
                    if (this.Open())
                    {
                        objSqlTrans = objSqlConn.BeginTransaction();
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                catch
                {
                    return false;
                }
            }
            /// <summary>
            /// Commit transaction
            /// </summary>
            /// <returns></returns>
            public bool Commit()
            {
                try
                {
                    objSqlTrans.Commit();
                    return true;
                }
                catch
                {
                    return false;
                }
            }
            /// <summary>
            /// Rollback transaction
            /// </summary>
            /// <returns></returns>
            public bool Rollback()
            {
                try
                {
                    objSqlTrans.Rollback();
                    return true;
                }
                catch
                {
                    return false;
                }
            }
            #endregion
            #region ----- Connect -----
            /// <summary>
            /// Mở connection
            /// </summary>
            /// <returns></returns>
            private bool Open()
            {
                try
                {
                    if (objSqlConn.State == ConnectionState.Closed)
                    {
                        objSqlConn.Open();
                    }
                    return true;
                }
                catch
                {
                    return false;
                }
            }
            /// <summary>
            /// Đóng connection 
            /// </summary>
            /// <returns></returns>
            private bool Close()
            {
                try
                {
                    if (objSqlConn.State == ConnectionState.Open)
                    {
                        objSqlConn.Close();
                    }
                    return true;
                }
                catch
                {
                    return false;
                }
            }
            /// <summary>
            /// Hủy connection
            /// </summary>
            /// <returns></returns>
            private bool Dispose()
            {
                try
                {
                    if (objSqlConn != null)
                    {
                        objSqlConn.Dispose();
                    }
                    return true;
                }
                catch
                {
                    return false;
                }
            }
            #endregion
            #region ----- Command ------
            private SqlCommand CreateCommand(string strStoreName, params SqlParameter[] myParams)
            {
                SqlCommand command = new SqlCommand();
                command.Connection = objSqlConn;
                command.CommandType = CommandType.StoredProcedure;
                command.CommandText = strStoreName;
                if (objSqlTrans != null)
                {
                    command.Transaction = objSqlTrans;
                }
                if (myParams != null)
                {
                    this.AddParameters(command, myParams);
                }
                return command;
            }
            #endregion
            #region ------ Parameters -----
            /// <summary>
            /// Gán các parameter
            /// </summary>
            /// <param name="command"></param>
            /// <param name="myParams"></param>
            private void AddParameters(SqlCommand command, params SqlParameter[] myParams)
            {
                command.Parameters.Clear();
                foreach (SqlParameter p in myParams)
                {
                    if ((p.Direction == ParameterDirection.InputOutput) && (p.Value == null))
                    {
                        p.Value = DBNull.Value;
                    }
                    command.Parameters.Add(p);
                }
            }
            /// <summary>
            /// Lấy thông số parameter
            /// </summary>
            /// <param name="strStoreName"></param>
            /// <returns></returns>
            private SqlParameter[] GetParameters(string strStoreName)
            {
                string strHashKey = strConn + ":" + strStoreName;
                SqlParameter[] objCacheSqlParams = (SqlParameter[])paramCache[strHashKey];
                if (objCacheSqlParams == null)
                {
                    objCacheSqlParams = (SqlParameter[])(paramCache[strHashKey] = this.DiscoverSpParameterSet(strStoreName));
                }
                return this.CloneParameters(objCacheSqlParams);
            }
            /// <summary>
            /// Phục hồi parameter
            /// </summary>
            /// <param name="strStoreName"></param>
            /// <returns></returns>
            private SqlParameter[] DiscoverSpParameterSet(string strStoreName)
            {
                try
                {
                    SqlConnection cn = new SqlConnection(strConn);
                    SqlCommand cmd = new SqlCommand(strStoreName, cn);
                    cn.Open();
                    cmd.CommandType = CommandType.StoredProcedure;
                    SqlCommandBuilder.DeriveParameters(cmd);
                    cmd.Parameters.RemoveAt(0);
                    SqlParameter[] discoveredParameters = new SqlParameter[cmd.Parameters.Count];
                    cmd.Parameters.CopyTo(discoveredParameters, 0);
                    cn.Close();
                    return discoveredParameters;
                }
                catch 
                { 
                    return null; 
                }
            }
            /// <summary>
            /// Tạo clone cho parameter
            /// </summary>
            /// <param name="originalParameters"></param>
            /// <returns></returns>
            private SqlParameter[] CloneParameters(SqlParameter[] originalParameters)
            {
                SqlParameter[] clonedParameters = new SqlParameter[originalParameters.Length];
                for (int i = 0, j = originalParameters.Length; i < j; ++i)
                {
                    clonedParameters[i] = (SqlParameter)((ICloneable)originalParameters[i]).Clone();
                }
                return clonedParameters;
            }
            /// <summary>
            /// Convert từ object qua sqlparameter
            /// </summary>
            /// <param name="commandParameters"></param>
            /// <param name="parameterValues"></param>
            private void AssignParameterValues(SqlParameter[] commandParameters, object[] parameterValues)
            {
                if ((commandParameters != null) || (parameterValues != null))
                {
                    if (commandParameters.Length != parameterValues.Length)
                    {
                        throw new ArgumentException("Số lượng tham số truyền vào không phù hợp.");
                    }
                    for (int i = 0, j = commandParameters.Length; i < j; i++)
                    {
                        commandParameters[i].Value = parameterValues[i];
                    }
                }            
            }
            #endregion
            #region ----- ExecuteNonQuery ------
            /// <summary>
            /// Thực thi câu store Ins, Del, Upd
            /// </summary>
            /// <param name="strStoreName"></param>
            /// <param name="myParams"></param>
            /// <returns></returns>
            public int ExecuteNonQuery(string strStoreName, params object[] myParams)
            {
                if ((myParams != null) && (myParams.Length > 0))
                {
                    SqlParameter[] commandParameters = this.GetParameters(strStoreName);
                    this.AssignParameterValues(commandParameters, myParams);
                    return this.ExecuteNonQuery(strStoreName, commandParameters);
                }
                else
                {
                    return this.ExecuteNonQuery(strStoreName, (SqlParameter[])null);
                }
            }
            private int ExecuteNonQuery(string strStoreName, params SqlParameter[] myParams)
            {
                try
                {
                    if (objSqlConn.State != ConnectionState.Open)
                    {
                        objSqlConn.Open();
                    }
                    return this.CreateCommand(strStoreName, myParams).ExecuteNonQuery();
                }
                catch
                {
                    return -1;
                }
            }
            #endregion
            #region ----- ExecuteQuery -----
            private DataSet ExecuteQuery(string strStoreName, params SqlParameter[] myParams)
            {
                try
                {
                    if (objSqlConn.State != ConnectionState.Open)
                    {
                        objSqlConn.Open();
                    }
                    SqlDataAdapter da = new SqlDataAdapter(this.CreateCommand(strStoreName, myParams));
                    DataSet ds = new DataSet();
                    da.Fill(ds);
                    if (objSqlTrans == null)
                    {
                        objSqlConn.Close();
                    }
                    return ds;
                }
                catch
                {
                    return null;
                }
            }
            /// <summary>
            /// Thực thi câu store Sel
            /// </summary>
            /// <param name="strStoreName"></param>
            /// <param name="myParams"></param>
            /// <returns></returns>
            public DataSet ExecuteQuery(string strStoreName, params object[] myParams)
            {
                if ((myParams != null) && (myParams.Length > 0))
                {
                    SqlParameter[] commandParameters = this.GetParameters(strStoreName);
                    this.AssignParameterValues(commandParameters, myParams);
                    return this.ExecuteQuery(strStoreName, myParams);
                }
                else
                {
                    return this.ExecuteQuery(strStoreName, (SqlParameter[])null);
                }
            }
            #endregion
        }
    }
    Đã được chỉnh sửa lần cuối bởi huynguyen : 07-03-2009 lúc 12:10 PM.

  2. #2
    Ngày gia nhập
    06 2007
    Nơi ở
    HCM
    Bài viết
    365

    Huy Nguyên đã dùng thử data application block chưa!
    Những thư viện truy xuất dữ liệu thì MS đã làm sẵn hết rồi, tặng luôn cả source, mã đương nhiên không cần test . Try this ... thậm chí với DAL layer thì chúng ta ko cần code 1 dòng ..

  3. #3
    Ngày gia nhập
    06 2007
    Bài viết
    206

    Mình có chỗ ko hiểu ở phần Parameter, mong bạn hướng dẫn giúp!

    Visual C# Code:
    1. private static Hashtable paramCache = Hashtable.Synchronized(new Hashtable());
    2. // Biến này dùng để làm gì và tại sao dùng Hashtable?
    3.  
    4. #region ------ Parameters -----
    5.          // Gán các parameter
    6.          private void AddParameters(SqlCommand command, params SqlParameter[] myParams)
    7.         {
    8.             command.Parameters.Clear();
    9.             foreach (SqlParameter p in myParams)
    10.             {
    11.                 if ((p.Direction == ParameterDirection.InputOutput) && (p.Value == null))
    12.                 {
    13.                     p.Value = DBNull.Value; // tại sao chỗ này lại có If
    14.                 }
    15.                 command.Parameters.Add(p);
    16.             }
    17.         }
    18.        
    19.         // Lấy thông số parameter        
    20.         private SqlParameter[] GetParameters(string strStoreName)
    21.         {
    22.             string strHashKey = strConn + ":" + strStoreName;
    23.             SqlParameter[] objCacheSqlParams = (SqlParameter[])paramCache[strHashKey];
    24.             if (objCacheSqlParams == null)
    25.             {
    26.                 objCacheSqlParams = (SqlParameter[])(paramCache[strHashKey] = this.DiscoverSpParameterSet(strStoreName));
    27.             }
    28.             return this.CloneParameters(objCacheSqlParams);
    29.         }
    30.        
    31. // Phục hồi parameter      
    32.         private SqlParameter[] DiscoverSpParameterSet(string strStoreName)
    33.         {
    34.             try
    35.             {
    36.                 SqlConnection cn = new SqlConnection(strConn);
    37.                 SqlCommand cmd = new SqlCommand(strStoreName, cn);
    38.                 cn.Open();
    39.                 cmd.CommandType = CommandType.StoredProcedure;
    40.                 SqlCommandBuilder.DeriveParameters(cmd);
    41.                 cmd.Parameters.RemoveAt(0);
    42.                 SqlParameter[] discoveredParameters = new SqlParameter[cmd.Parameters.Count];
    43.                 cmd.Parameters.CopyTo(discoveredParameters, 0);
    44.                 cn.Close();
    45.                 return discoveredParameters;
    46.             }
    47.             catch
    48.             {
    49.                 return null;
    50.             }
    51.         }
    52.        
    53.         // Tạo clone cho parameter
    54.         private SqlParameter[] CloneParameters(SqlParameter[] originalParameters)
    55.         {
    56.             SqlParameter[] clonedParameters = new SqlParameter[originalParameters.Length];
    57.             for (int i = 0, j = originalParameters.Length; i < j; ++i)
    58.             {
    59.                 clonedParameters[i] = (SqlParameter)((ICloneable)originalParameters[i]).Clone();
    60.             }
    61.             return clonedParameters;
    62.         }
    63.        
    64.         // Convert từ object qua sqlparameter
    65.         private void AssignParameterValues(SqlParameter[] commandParameters, object[] parameterValues)
    66.         {
    67.             if ((commandParameters != null) || (parameterValues != null))
    68.             {
    69.                 if (commandParameters.Length != parameterValues.Length)
    70.                 {
    71.                     throw new ArgumentException("Số lượng tham số truyền vào không phù hợp.");
    72.                 }
    73.                 for (int i = 0, j = commandParameters.Length; i < j; i++)
    74.                 {
    75.                     commandParameters[i].Value = parameterValues[i];
    76.                 }
    77.             }            
    78.         }
    79.         #endregion
    Đã được chỉnh sửa lần cuối bởi nth4 : 04-02-2009 lúc 08:29 PM. Lý do: s
    Thà để chửi dốt 1 lần, còn hơn ngu cả đời.

  4. #4
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Huy Nguyên đã dùng thử data application block chưa!
    Huy Nguyễn chứ ko phải Huy Nguyên đâu Hải ơi ^_^
    mình cũng có nghe nói qua nhưng chưa thử, Haipt share cho mình với nhé.
    Mình có chỗ ko hiểu ở phần Parameter, mong bạn hướng dẫn giúp!
    Mấy cái đó mình cũng có tham khảo và sưu tầm từ msdn, mấy hàm đó hỗ trợ việc chuyển từ 1 object[] sang SqlParameter[], chi tiết hơn thì ko rõ lắm vì hàm đó mình copy từ trong msdn ra.

  5. #5
    Ngày gia nhập
    02 2008
    Bài viết
    18

    Thank huynguyen đã chia sẻ.
    Huy Nguyên đã dùng thử data application block chưa!
    Em chưa biết cái này là cái gì cả anh Hải share hướng dẫn đc hem

  6. #6
    Ngày gia nhập
    06 2007
    Nơi ở
    HCM
    Bài viết
    365

    Mặc định Class kết nối và thực thi truy vấn SqlServer 2005

    Tải về dùng thử xem ( full source + help ):Nó là bộ thư viện truy xuất DB mà MS đã thiết kế sẵn cho .net coder , không thiếu một thứ gì.
    link tải :
    http://www.microsoft.com/downloads/d...displaylang=en
    Hơn nữa nếu dựng tầng Data Access thì tốt nhất lên dùng chức năng seperate dataset để tách ra 2 layer : lớp thực thể và lớp dataacess , dựng toàn bộ tầng DAL và toàn bộ store proc chỉ mất tầm 10 giây, viết lại các sp CRUID cũng tốt thôi nhưng đa số là bạn khó lòng viết tốt hơn sp tự sinh của MS .
    Ngoài ra chịu khó tìm hiểu cách sử dụng bộ thư viện Enterprise Lib .

  7. #7
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Hix, xem ra có nhiều cái có sẵn quá nhỉ, vậy mà mình ko biết, để ngâm thêm mấy cái này mới được.

  8. #8
    Ngày gia nhập
    06 2007
    Bài viết
    206

    Trích dẫn Nguyên bản được gửi bởi Haipt Xem bài viết
    Hơn nữa nếu dựng tầng Data Access thì tốt nhất lên dùng chức năng seperate dataset để tách ra 2 layer : lớp thực thể và lớp dataacess , dựng toàn bộ tầng DAL và toàn bộ store proc chỉ mất tầm 10 giây, viết lại các sp CRUID cũng tốt thôi nhưng đa số là bạn khó lòng viết tốt hơn sp tự sinh của MS
    Mình đọc mà ko hiểu chỗ này lắm, bạn nào biết hướng dẫn giúp mình với.
    Đã được chỉnh sửa lần cuối bởi nth4 : 06-02-2009 lúc 03:42 PM. Lý do: s
    Thà để chửi dốt 1 lần, còn hơn ngu cả đời.

  9. #9
    Ngày gia nhập
    11 2007
    Bài viết
    294

    @ bác Pham : Theo em thì đang thử nghiệm thì cứ nên viết. Dzí dzụ sau này mà chiển sang Oracle/DB2 thì chẳng nhẽ lại kiu là M$ hok có hỗ trợ sẵn nên thôi ah.

    Tuy nhiên nếu tham khảo đồ của M$ zồi viết lại theo ý mình thì em nghĩ là good exercise.

    @huynguyen : định nói thì bác Pham nói mất zồi ^^! Cái Data Access Block này Dark đã nhắc đến trong 1 post nào đấy, cơ mà quên mất tiu zồi ^^! Cái DAL hùi xưa Dark gửi cho huynguyen cũng có tham khảo cái đấy ^^!
    Is the moon rising...

  10. #10
    Ngày gia nhập
    02 2009
    Bài viết
    3

    Cảm ơn bạn đã share cho mọi người đoạn code này, mình đã đọc và tìm hiểu nhưng có đôi chỗ mình không hiểu rõ lắm, bạn giải thích dùm mình nha :

    1) Phương thức SqlTransaction sử dụng để làm gì ?

    2) Dòng khai báo sau có ý nghĩa là gì ?
    Code:
    public static Hashtable batthongso = Hashtable.Synchronized(new Hashtable());
    3) Các cơ chế rollback và commit sử đụng để làm gì ?

    4) 4 dòng lệnh sau đây có nghĩa là gì ?
    Code:
    SqlCommandBuilder.DeriveParameters(cmd);
    cmd.Parameters.RemoveAt(0);
    SqlParameter[] discoveredParameters = new SqlParameter[cmd.Parameters.Count];
    cmd.Parameters.CopyTo(discoveredParameters, 0);
    Mình cũng chỉ mới bắt đầu học C# thôi nên chưa hiểu biết gì nhiều, mong được bạn giúp đỡ, cảm ơn !
    Đã được chỉnh sửa lần cuối bởi babypuma : 06-02-2009 lúc 11:21 PM.

Các đề tài tương tự

  1. code kết nối csdl sqlserver 2005 với C#
    Gửi bởi thientran trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 14
    Bài viết cuối: 25-03-2012, 09:06 AM
  2. Ghép 2 database làm một trong SQLSERVER 2005( đồng bộ hóa)
    Gửi bởi b0yt4l3nt9z trong diễn đàn Thắc mắc Microsoft SQL Server & Microsoft Access
    Trả lời: 1
    Bài viết cuối: 30-11-2011, 07:56 AM
  3. Database Lỗi không restore được database vào sqlserver 2005 (incorrectly formated)
    Gửi bởi nguoirung1.6 trong diễn đàn Thắc mắc đại cương Database & Reporting
    Trả lời: 2
    Bài viết cuối: 09-09-2011, 08:54 PM
  4. clien/server truy cập csdl sqlserver?
    Gửi bởi huhuhuhu trong diễn đàn Tutorials và Thủ thuật lập trình C#, ASP.NET
    Trả lời: 5
    Bài viết cuối: 14-09-2010, 02:04 PM
  5. Không login vào SqlSerVer 2005 được với tên .\sqlexpress
    Gửi bởi jackson_to trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 14-12-2009, 10:36 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn