首页 > 代码库 > DataAccess SqlHelper

DataAccess SqlHelper

   /// <summary>
    /// 数据访问基类
    /// </summary>
    public abstract class DataAccess : MarshalByRefObject
    {
        /// <summary>
        /// LifetimeService
        /// </summary>
        /// <returns>object</returns>
        public override object InitializeLifetimeService()
        {
            return null;
        }

        protected string cnnstr = "";
        protected DataAccess()
        {

        }

        /// <summary>
        /// 获取压缩传输DataTable
        /// </summary>
        /// <param name="aSQL">SQL</param>
        /// <param name="aParameters">Parameters</param>
        /// <returns>byte[]</returns>
        public byte[] GetTableData(string aSQL, Dictionary<string, object> aParameters)
        {
            return DataCompression.CompressionDataTable(GetDataTable(aSQL,aParameters));
        }

        /// <summary>
        /// 保存压缩数据表
        /// </summary>
        /// <param name="aDataTable">DataTable</param>
        /// <param name="aSQL">Sql</param>
        /// <returns>int</returns>
        public int SaveDataTable(byte[] aDataTable, string aSQL)
        {
            return SaveTable(DataCompression.DecompressionXmlDataTable(aDataTable), aSQL);
        }

        /// <summary>
        /// 创建System.Data.Common.DbCommand
        /// </summary>
        /// <param name="sql">sql</param>
        /// <param name="parameters">Dictionary<string, object></param>
        /// <returns>System.Data.Common.DbCommand</returns>
        private System.Data.Common.DbCommand GetCommand(System.Data.Common.DbConnection connection, string aSQL, Dictionary<string, object> aParameters = null)
        {
            System.Data.Common.DbCommand cmd = connection.CreateCommand();
            cmd.CommandText = Application.SQLStatementOpr.PrepareQuery(aSQL);
            if (aParameters != null)
            {
                foreach (KeyValuePair<string, object> item in aParameters)
                {
                    System.Data.Common.DbParameter parameter = cmd.CreateParameter();
                    parameter.ParameterName = item.Key;
                    parameter.Value = item.Value;
                    cmd.Parameters.Add(parameter);
                }
            }
            return cmd;
        }

        #region DataAccess Command
        /// <summary>
        /// 新型查询
        /// </summary>
        /// <param name="aSQL">sql</param>
        /// <param name="aParameters"> Dictionary参数</param>
        /// <returns>影响行数</returns>
        public int ExcuteCommand(string aSQL, Dictionary<string, object> aParameters)
        {
            try
            {
                using (System.Data.Common.DbConnection connection = CreateConnection())
                {
                    Authorize(aSQL);
                    connection.Open();
                    return GetCommand(connection, aSQL, aParameters).ExecuteNonQuery();
                }
            }
            catch (Exception e)
            {
                throw new Exception("ExcuteCommand error of : " + e.Message + aSQL, e);
            }
        }

        /// <summary>
        /// 返回第一行第一列值or Null
        /// </summary>
        /// <param name="aSQL">sql</param>
        /// <returns>object</returns>
        public object ExecuteScalar(string aSQL)
        {
            return ExecuteScalar(aSQL, null);
        }

        /// <summary>
        /// 返回第一行第一列值or Null
        /// </summary>
        /// <param name="aSQL">sql</param>
        /// <param name="aParameters">Dictionary参数</param>
        /// <returns>object</returns>
        public object ExecuteScalar(string aSQL, Dictionary<string, object> aParameters)
        {
            try
            {
                using (System.Data.Common.DbConnection connection = CreateConnection())
                {
                    Authorize(aSQL);
                    connection.Open();
                    return GetCommand(connection, aSQL, aParameters).ExecuteScalar();
                }
            }
            catch (Exception e)
            {
                throw new Exception("ExecuteScalar error of : " + e.Message + aSQL, e);
            }
        }

        /// <summary>
        /// 查询返回DbDataReader
        /// </summary>
        /// <param name="aSQL">sql</param>
        /// <param name="aParameters">Dictionary参数</param>
        /// <returns>System.Data.Common.DbDataReader</returns>
        public System.Data.Common.DbDataReader ExecuteReader(string aSQL, Dictionary<string, object> aParameters)
        {
            System.Data.Common.DbConnection connection = CreateConnection();
            connection.Open();
            return GetCommand(connection, aSQL, aParameters).ExecuteReader(System.Data.CommandBehavior.CloseConnection);
        }


        /// <summary>
        /// DbDataAdapter Fill DataTable
        /// </summary>
        /// <param name="aDataTable">DataTable</param>
        /// <param name="aSQL">sql</param>
        /// <returns>影响行数</returns>
        public int Fill(System.Data.DataTable aDataTable, string aSQL)
        {
            return Fill(aDataTable, aSQL, null);
        }

        /// <summary>
        /// 使用TableName填充
        /// </summary>
        /// <param name="aDataTable">DataTable</param>
        /// <returns>影响行数</returns>
        public int Fill(System.Data.DataTable aDataTable)
        {
            return Fill(aDataTable, "select * from " + aDataTable.TableName);
        }

        /// <summary>
        /// DbDataAdapter Fill DataTable
        /// </summary>
        /// <param name="aDataTable">DataTable</param>
        /// <param name="aSQL">sql</param>
        /// <param name="aParameters">Dictionary</param>
        /// <returns>影响行数</returns>
        public int Fill(System.Data.DataTable aDataTable, string aSQL, Dictionary<string, object> aParameters)
        {
            try
            {
                using (System.Data.Common.DbConnection connection = CreateConnection())
                {
                    Authorize(aSQL);
                    connection.Open();
                    System.Data.Common.DbDataAdapter adapter = CreateAdapter();
                    adapter.SelectCommand = GetCommand(connection, aSQL, aParameters);
                    //adapter.MissingSchemaAction = System.Data.MissingSchemaAction.AddWithKey;  //David 2014-5-1
                    return adapter.Fill(aDataTable);
                }
            }
            catch (Exception e)
            {
                throw new Exception("FillDataTable error of : " + e.Message + aSQL, e);
            }
        }
        
        /// <summary>
        /// DbDataAdapter Fill DataTable
        /// </summary>
        /// <param name="aSQL">sql</param>
        /// <returns>DataSet</returns>
        public System.Data.DataSet GetDataSet(string aSQL)
        {
            return GetDataSet(aSQL, null);
        }

        /// <summary>
        /// DbDataAdapter Fill DataTable
        /// </summary>
        /// <param name="aSQL">sql</param>
        /// <param name="aParameters">Dictionary</param>
        /// <returns>DataSet</returns>
        public System.Data.DataSet GetDataSet(string aSQL, Dictionary<string, object> aParameters)
        {
            System.Data.DataSet ds = new System.Data.DataSet();
            FillDataSet(ds, aSQL, aParameters);
            return ds;
        }

        /// <summary>
        /// DbDataAdapter Fill DataTable
        /// </summary>
        /// <param name="aDataSet">DataSet</param>
        /// <returns>影响行数</returns>
        public int FillDataSet(System.Data.DataSet aDataSet)
        {
            int iReturn = 0;
            for (int i = 0; i < aDataSet.Tables.Count; i++)
            {
                System.Data.DataTable dt = aDataSet.Tables[i];
                iReturn += Fill(dt);
            }
            return iReturn;
        }

        /// <summary>
        /// DbDataAdapter Fill DataTable
        /// </summary>
        /// <param name="aDataSet">DataSet</param>
        /// <param name="aSQL">sql</param>
        /// <returns>影响行数</returns>
        public int FillDataSet(System.Data.DataSet aDataSet, string aSQL)
        {
            return FillDataSet(aDataSet, aSQL, null);
        }

        /// <summary>
        /// DbDataAdapter Fill DataTable
        /// </summary>
        /// <param name="aDataSet"></param>
        /// <param name="aSQL">sql</param>
        /// <param name="aParameters">Dictionary</param>
        /// <returns>影响行数</returns>
        public int FillDataSet(System.Data.DataSet aDataSet, string aSQL, Dictionary<string, object> aParameters)
        {
            using (System.Data.Common.DbConnection connection = CreateConnection())
            {
                connection.Open();
                System.Data.Common.DbDataAdapter adapter = CreateAdapter();
                adapter.SelectCommand = GetCommand(connection, aSQL, aParameters);
                return adapter.Fill(aDataSet);
            }
        }


        /// <summary>
        /// DbDataAdapter Fill DataTable
        /// </summary>
        /// <param name="aSQL">sql</param>
        /// <returns>DataTable</returns>
        public System.Data.DataTable GetDataTable(string aSQL)
        {
            return GetDataTable(aSQL, null);
        }

        /// <summary>
        /// DbDataAdapter Fill DataTable
        /// </summary>
        /// <param name="aSQL">sql</param>
        /// <returns>DataTable</returns>
        public System.Data.DataTable GetSchema(string aSQL)
        {

            using (System.Data.Common.DbConnection connection = CreateConnection())
            {
                connection.Open();
                return GetCommand(connection, aSQL).ExecuteReader(System.Data.CommandBehavior.SchemaOnly).GetSchemaTable();
            }
        }
        /// <summary>
        /// DbDataAdapter Fill DataTable
        /// </summary>
        /// <param name="aSQL">sql</param>
        /// <param name="aParameters">Dictionary</param>
        /// <returns>DataTable</returns>
        public System.Data.DataTable GetDataTable(string aSQL, Dictionary<string, object> aParameters)
        {
            System.Data.DataTable dt = new System.Data.DataTable();
            Fill(dt, aSQL, aParameters);
            return dt;
        }

        /// <summary>
        /// DbDataAdapter 保存 DataTable
        /// </summary>
        /// <param name="aDataTable">DataTable</param>
        /// <returns>影响行数</returns>
        public int SaveDataTable(System.Data.DataTable aDataTable)
        {
            return SaveDataTable(aDataTable, aDataTable.TableName);
        }


        /// <summary>
        /// DbDataAdapter 保存 DataTable
        /// </summary>
        /// <param name="aDataTable">DataTable</param>
        /// <param name="aTableName">TableName</param>
        /// <returns>影响行数</returns>
        public int SaveDataTable(System.Data.DataTable aDataTable, string aTableName)
        {
            return SaveTable(aDataTable, "select * from " + aTableName);
        }

        /// <summary>
        /// DbDataAdapter 保存 DataTable
        /// </summary>
        /// <param name="aDataTable">DataTable</param>
        /// <param name="aSQL">sql</param>
        /// <returns>影响行数</returns>
        public int SaveTable(System.Data.DataTable aDataTable, string aSQL)
        {
            using (System.Data.Common.DbConnection connection = CreateConnection())
            {
                connection.Open();
                System.Data.Common.DbDataAdapter adapter = CreateAdapter();
                adapter.SelectCommand = GetCommand(connection, aSQL, null);
                System.Data.Common.DbCommandBuilder cmdBuild = CreateCommandBuilder();
                cmdBuild.DataAdapter = adapter;
                cmdBuild.QuotePrefix = "[";
                cmdBuild.QuoteSuffix = "]";

                System.Data.Common.DbCommand insertCommand = cmdBuild.GetInsertCommand(true);
                System.Data.Common.DbCommand updateCommand = cmdBuild.GetUpdateCommand(true);
                System.Data.Common.DbCommand deleteCommand = cmdBuild.GetDeleteCommand(true);
                if (IsDefineCommandText)
                {
                    updateCommand.CommandText = GenerateUpdateCommand(aDataTable, updateCommand.CommandText);
                    deleteCommand.CommandText = GenerateDeleteCommand(aDataTable, deleteCommand.CommandText);                    
                }
                cmdBuild.DataAdapter = null;
                adapter.InsertCommand = insertCommand;
                adapter.UpdateCommand = updateCommand;
                adapter.DeleteCommand = deleteCommand;
                return adapter.Update(aDataTable);
            }
        }

        bool isDefineCommandText = false;
        bool isGetedDefine = false;
        /// <summary>
        /// 是否使用自定义UpdateCommand
        /// </summary>
        public bool IsDefineCommandText
        {
            get
            {
                if (!isGetedDefine)
                {
                    isDefineCommandText = System.Configuration.ConfigurationManager.AppSettings["DefineCommandText"] == "true";
                    isGetedDefine = true;
                }
                return isDefineCommandText;
            }
        }

        /// <summary>
        /// 仅根据主键及RecID进行更新
        /// </summary>
        /// <param name="aTable"></param>
        /// <param name="aCommandText"></param>
        /// <returns></returns>
        private string GenerateDeleteCommand(System.Data.DataTable aTable, string aCommandText)
        {
            try
            {
                StringBuilder whereClauseBuilder = new StringBuilder();
                foreach (System.Data.DataColumn key in aTable.PrimaryKey)
                {
                    if (whereClauseBuilder.Length > 0)
                        whereClauseBuilder.Append(" AND ");
                    whereClauseBuilder.Append(string.Format(" [{0}] = @Original_{0}", key.ColumnName));
                }

                if (whereClauseBuilder.Length == 0)
                    return aCommandText;

                int position = aCommandText.IndexOf("WHERE") + 5;
                return aCommandText.Substring(0, position) + whereClauseBuilder.ToString();
            }
            catch
            {
                return aCommandText;
            }
        }

        /// <summary>
        /// 仅根据主键及RecID进行更新
        /// </summary>
        /// <param name="aTable"></param>
        /// <param name="aCommandText"></param>
        /// <returns></returns>
        private string GenerateUpdateCommand(System.Data.DataTable aTable, string aCommandText)
        {
            try
            {
                StringBuilder whereClauseBuilder = new StringBuilder();
                foreach (System.Data.DataColumn key in aTable.PrimaryKey)
                {
                    if (whereClauseBuilder.Length > 0)
                        whereClauseBuilder.Append(" AND ");
                    whereClauseBuilder.Append(string.Format(" [{0}] = @Original_{0}", key.ColumnName));
                }

                if (whereClauseBuilder.Length == 0)
                    return aCommandText;

                int position = aCommandText.IndexOf("WHERE") + 5;
                return aCommandText.Substring(0, position) + whereClauseBuilder.ToString();
            }
            catch
            {
                return aCommandText;
            }
        }

        /// <summary>
        /// DbDataAdapter 保存 DataTable
        /// </summary>
        /// <param name="aDataSet">DataSet</param>
        /// <returns>影响行数</returns>
        public int SaveDataSet(System.Data.DataSet aDataSet)
        {
            System.Data.Common.DbTransaction trans = null;
            try
            {
                using (System.Data.Common.DbConnection connection = CreateConnection())
                {
                    connection.Open();

                    trans = connection.BeginTransaction();
                    int updates = 0;
                    foreach (System.Data.DataTable item in aDataSet.Tables)
                    {
                        updates += SaveTable(item);
                    }
                    trans.Commit();
                    return updates;
                }
            }
            catch
            {
                trans.Rollback();
                throw;
            }
        }

        /// <summary>
        /// DbDataAdapter 保存 DataTable
        /// </summary>
        /// <param name="aDataTable">DataTable</param>
        /// <param name="aTransaction">DbTransaction</param>
        /// <returns>影响行数</returns>
        int SaveTable(System.Data.DataTable aDataTable)
        {
            return SaveDataTable(aDataTable,aDataTable.TableName);
        }


        #endregion

        /// <summary>
        /// 虚函数,子类生成DbDataAdapter
        /// </summary>
        /// <returns>DbDataAdapter</returns>
        public virtual System.Data.Common.DbDataAdapter CreateAdapter()
        {
            return null;
        }

        /// <summary>
        /// 虚函数,子类生成DbCommandBuilder
        /// </summary>
        /// <returns>DbCommandBuilder</returns>
        public virtual System.Data.Common.DbCommandBuilder CreateCommandBuilder()
        {
            return null;
        }

        /// <summary>
        /// 虚函数,子类生成DbCommandBuilder
        /// </summary>
        /// <returns>DbCommandBuilder</returns>
        public virtual System.Data.Common.DbConnection CreateConnection()
        {
            return null;
        }
}


以上定义数据访问基类,实现ado.net的数据访问讲很简单

认真看的同学可能发现里面更新table的时候使用了按主键更新的功能,还有就是乱抛错误,把sql也包含在错误信息中,在实际应用中可能要做调整的

    /// <summary>
    /// Sql server 访问基类
    /// </summary>
    public class SQLAccess : DataAccess
    {
        /// <summary>
        /// New
        /// </summary>
        public SQLAccess()
        {

        }

        /// <summary>
        /// New
        /// </summary>
        /// <param name="aConnectionString">connectionString</param>
        public SQLAccess(string aConnectionString)
        {
            cnnstr = aConnectionString;
        }

        /// <summary>
        /// 实现基类方法
        /// </summary>
        /// <returns>DbDataAdapter</returns>
        public override System.Data.Common.DbDataAdapter CreateAdapter()
        {
            return new System.Data.SqlClient.SqlDataAdapter();
        }

        /// <summary>
        /// 实现基类方法
        /// </summary>
        /// <returns>DbDataAdapter</returns>
        public override System.Data.Common.DbConnection CreateConnection()
        {
            if (string.IsNullOrEmpty(cnnstr))
            {
                object RemotingConnectKey = System.Runtime.Remoting.Messaging.CallContext.GetData("RemotingConnectKey");
                if (RemotingConnectKey != null)
                    cnnstr = System.Configuration.ConfigurationManager.AppSettings[RemotingConnectKey.ToString()];

                if (string.IsNullOrEmpty(cnnstr))
                    cnnstr = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];
            }
            
            return new System.Data.SqlClient.SqlConnection(cnnstr);
        }

        /// <summary>
        /// 实现基类方法
        /// </summary>
        /// <returns>DbCommandBuilder</returns>
        public override System.Data.Common.DbCommandBuilder CreateCommandBuilder()
        {
            return new System.Data.SqlClient.SqlCommandBuilder();
        }

    }