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();

        }



    }

 

你可能感兴趣的:(Access)