/// <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();
}}
DataAccess SqlHelper