using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Windows.Forms;namespace ABC
{
/// <summary>
/// DataBaseOperation 的摘要说明。
/// </summary>
public class DataBaseOperation
{
private SqlConnection sqlconnection; public DataBaseOperation()
{
//根据App.config建立SqlConnection
this.sqlconnection = new SqlConnection(ConfigurationSettings.AppSettings["StringSmoowConnection"]);
}
//根据查询字符串返回DataTable
public DataTable GetDataTable(string strSQL)
{
DataTable datatable = new DataTable();
SqlDataAdapter sqldataadapter = new SqlDataAdapter(strSQL,this.sqlconnection);
try
{
sqldataadapter.Fill(datatable);
return datatable;
}
catch(Exception express)
{
MessageBox.Show(express.ToString(),"提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
return null;
}
} //根据查询字符串返回DataView
public DataView GetDataView(string strSQL)
{
DataTable datatable = this.GetDataTable(strSQL);
return new DataView(datatable);
} //根据查询字符串返回SqlDataReader
public SqlDataReader GetDataReader(string strSQL)
{
SqlCommand cmdCommand=new SqlCommand(strSQL, this.sqlconnection);
try
{
SqlDataReader sqldatareader=cmdCommand.ExecuteReader();
return sqldatareader;
}
catch(Exception express)
{
MessageBox.Show(express.ToString(),"提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
return null;
}
} //根据DataTable和对应的查询字符串,更新数据库
public void UpdateDataBase(DataTable datatable, string strSQL)
{
SqlDataAdapter sqldataadapter = new SqlDataAdapter(strSQL,this.sqlconnection);
new SqlCommandBuilder(sqldataadapter);
try
{
sqldataadapter.Update(datatable);
}
catch(Exception express)
{
MessageBox.Show(express.ToString(),"提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
} //根据更新字符串,由SqlCommand更新数据库
public int UpdateDataBase(string strSQL)
{
int intNumber = 0;
try
{
this.sqlconnection.Open();
SqlCommand sqlcommand = new SqlCommand(strSQL,this.sqlconnection);
intNumber = sqlcommand.ExecuteNonQuery();
sqlconnection.Close();
}
catch(Exception express)
{
MessageBox.Show(express.ToString(),"提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
return intNumber;
}
}
}
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Windows.Forms;namespace ABC
{
/// <summary>
/// DataBaseOperation 的摘要说明。
/// </summary>
public class DataBaseOperation
{
private SqlConnection sqlconnection; public DataBaseOperation()
{
//根据App.config建立SqlConnection
this.sqlconnection = new SqlConnection(ConfigurationSettings.AppSettings["StringSmoowConnection"]);
}
//根据查询字符串返回DataTable
public DataTable GetDataTable(string strSQL)
{
DataTable datatable = new DataTable();
SqlDataAdapter sqldataadapter = new SqlDataAdapter(strSQL,this.sqlconnection);
try
{
sqldataadapter.Fill(datatable);
return datatable;
}
catch(Exception express)
{
MessageBox.Show(express.ToString(),"提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
return null;
}
} //根据查询字符串返回DataView
public DataView GetDataView(string strSQL)
{
DataTable datatable = this.GetDataTable(strSQL);
return new DataView(datatable);
} //根据查询字符串返回SqlDataReader
public SqlDataReader GetDataReader(string strSQL)
{
SqlCommand cmdCommand=new SqlCommand(strSQL, this.sqlconnection);
try
{
SqlDataReader sqldatareader=cmdCommand.ExecuteReader();
return sqldatareader;
}
catch(Exception express)
{
MessageBox.Show(express.ToString(),"提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
return null;
}
} //根据DataTable和对应的查询字符串,更新数据库
public void UpdateDataBase(DataTable datatable, string strSQL)
{
SqlDataAdapter sqldataadapter = new SqlDataAdapter(strSQL,this.sqlconnection);
new SqlCommandBuilder(sqldataadapter);
try
{
sqldataadapter.Update(datatable);
}
catch(Exception express)
{
MessageBox.Show(express.ToString(),"提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
} //根据更新字符串,由SqlCommand更新数据库
public int UpdateDataBase(string strSQL)
{
int intNumber = 0;
try
{
this.sqlconnection.Open();
SqlCommand sqlcommand = new SqlCommand(strSQL,this.sqlconnection);
intNumber = sqlcommand.ExecuteNonQuery();
sqlconnection.Close();
}
catch(Exception express)
{
MessageBox.Show(express.ToString(),"提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
return intNumber;
}
}
}
既然用SQL Server的话存储过程肯定少不了了吧?怎么没有??
还有事务等操作也没有嘛??
不错connetion使用之前要不要open,使用之后要不要close???
----------------SqlDataAdapter对象调用Fill、Update前不用open,使用之后不用close
你这也写得太简单了吧????
既然用SQL Server的话存储过程肯定少不了了吧?怎么没有??
还有事务等操作也没有嘛??----------------是简单了点,存储过程、事务暂时还用不着,呵呵
你应该有个统一的打开关闭数据库连接的方式在你的类中。
而且你这样的方式,如果前面SQL执行出错,有可能导致连接被强行关闭.下次再操作时就出错了。
1.作为一个数据层的访问的类,命名空间中不应有using System.Windows.Forms;
2.以public DataView GetDataView(string strSQL)方法为例,返回DataTable代替DataView会更合理一些。
3.你的这个类不是多线程安全的。在构造函数中this.sqlconnection = new SqlConnection(ConfigurationSettings.AppSettings["StringSmoowConnection"]);就注定了。
4.把public SqlDataReader GetDataReader(string strSQL)方法修改成public IDataReader GetDataReader(string strSQL)以IDataReader接口的方式返回对上层调用,设计更为合理,这样上层不需要再引用using System.Data.SqlClient;命名空间,从设计模式思想来看也应如此。
5.MessageBox.Show()方法用在这里是很不明智的做法,不应该切入UI的东西,你的这个类应该都可以与windowsform和asp.net等。
6.以catch(Exception express)为例,修改成catch(SqlException ex)进行更加详细的扑捉更为合理,这个是否把异常throw到上一层是否更合理值得思考。这方面具体在《.net framework 框架程序设计》一书中有讲道。
7.以public int UpdateDataBase(string strSQL)方法为例。进行下面修改应该会更合适吧
public int UpdateDataBase(string strSQL)
{
try
{
SqlConnection conn = SqlConnection(ConfigurationSettings.AppSettings["StringSmoowConnection"]);
SqlCommand sqlcommand = new SqlCommand(strSQL,conn );
conn.Open();
return sqlcommand.ExecuteNonQuery();
}
finally
{
if(conn.State != ConnectionState.Closed)
conn.Close();
}
}
//如果发生异常,由上层代码处理,支持线程安全。8.在public void UpdateDataBase(DataTable datatable, string strSQL)方法里面使用SqlCommandBuilder类来生成其他sql语句,是很有问题的做法。建议楼主修改。
/// <summary>
/// 数据库操作基类
/// </summary>
public abstract class DbOperatorFactory : System.IDisposable
{
#region 公共常量 /// <summary>
/// 数据库类型
/// </summary>
private const string DATA_BASE_TYPE = "DataBaseType"; /// <summary>
/// 数据库连接字符串
/// </summary>
private const string CONNECTION_STRING = "ConnectionString"; /// <summary>
/// 数据库配置节名称
/// </summary>
private const string DATA_CONFIG_PATH = "AppConfig/DataConfig"; #endregion #region 字段 /// <summary>
/// 数据库连接字符串
/// </summary>
private static string m_ConnectionString = string.Empty; /// <summary>
/// 数据类型
/// </summary>
private static DataBaseType dbType; /// <summary>
/// 命令参数前缀
/// </summary>
protected static string strParameterPrefix = string.Empty; /// <summary>
/// 数据库连接对象
/// </summary>
protected System.Data.IDbConnection dbConn = null; /// <summary>
/// 数据库命令对象
/// </summary>
protected System.Data.IDbCommand dbComm = null; /// <summary>
/// 数据库适配器
/// </summary>
protected System.Data.IDbDataAdapter dbAdapter = null; /// <summary>
/// 数据库事务对象
/// </summary>
protected System.Data.IDbTransaction dbTrans = null; /// <summary>
/// 数据库命令类型
/// </summary>
protected System.Data.CommandType dbCommandType; #endregion /// <summary>
/// 构造函数
/// </summary>
/// <param name="strConfigFile">配置文件名称</param>
public DbOperatorFactory()
{
this.dbCommandType = CommandType.Text;
}
#region 属性 /// <summary>
/// 当前连接对象
/// </summary>
public IDbConnection Connection
{
get{ return this.dbConn; }
set{ this.dbConn = value; }
} /// <summary>
/// 当前事物对象
/// </summary>
public IDbTransaction Transaction
{
get{ return this.dbTrans; }
set{ this.dbTrans = value; }
} /// <summary>
/// 设置数据库命令
/// </summary>
public string CommandText
{
set{ this.dbComm.CommandText = value; }
}
/// <summary>
/// 设置数据库命令类型
/// </summary>
public System.Data.CommandType SetCommandType
{
set{ this.dbComm.CommandType = value; }
}
/// <summary>
/// 获取参数集合
/// </summary>
public System.Data.IDataParameterCollection ParameterCollection
{
get{ return this.dbComm.Parameters; }
}
/// <summary>
/// 数据库连接字符串
/// </summary>
internal string ConnectionString
{
get{ return m_ConnectionString; }
}
/// <summary>
/// 数据库类型
/// </summary>
internal DataBaseType DataConfigType
{
get{ return dbType; }
}
#endregion #region 方法 /// <summary>
/// 执行 SQL 语句,并返回受影响的行数
/// </summary>
/// <returns></returns>
public virtual int ExecuteNonQuery()
{
return this.dbComm.ExecuteNonQuery();
}
/// <summary>
/// 执行SQL语句,返回IDataReader接口
/// </summary>
/// <returns></returns>
public virtual System.Data.IDataReader ExecuteReader()
{
return this.dbComm.ExecuteReader();
}
/// <summary>
/// 执行查询,并返回查询所返回的结果集中第一行的第一列
/// </summary>
/// <returns></returns>
public virtual object ExecuteScalar()
{
return this.dbComm.ExecuteScalar();
}
/// <summary>
/// 执行SQL语句,返回DataTable对象
/// </summary>
/// <returns></returns>
public virtual System.Data.DataTable ExecuteDataTable()
{
return this.ExecuteDataSet().Tables[0];
}
/// <summary>
/// 执行SQL语句,返回DataSet对象
/// </summary>
/// <returns></returns>
public virtual System.Data.DataSet ExecuteDataSet()
{
if( this.dbAdapter == null )
{
throw new Exception( "数据库操作对象未初始化!" );
}
DataSet ds = new DataSet();
this.dbAdapter.SelectCommand = this.dbComm;
this.dbAdapter.Fill( ds );
return ds;
}
/// <summary>
/// 开始执行事务
/// </summary>
public virtual void BeginTransaction()
{
this.dbTrans = this.dbConn.BeginTransaction();
this.dbComm.Transaction = this.dbTrans;
}
/// <summary>
/// 开始执行指定级别的事务
/// </summary>
/// <param name="level"></param>
public virtual void BeginTransaction( System.Data.IsolationLevel level )
{
this.dbTrans = this.dbConn.BeginTransaction( level );
this.dbComm.Transaction = this.dbTrans;
}
/// 提交事务
/// </summary>
public void Commit()
{
this.dbTrans.Commit();
}
/// <summary>
/// 回滚事务
/// </summary>
public void Rollback()
{
this.dbTrans.Rollback();
}
/// <summary>
/// 打开数据库连接
/// </summary>
public void Open()
{
if( this.dbConn.State != ConnectionState.Open )
this.dbConn.Open();
}
/// <summary>
/// 关闭数据库连接
/// </summary>
public void Close()
{
this.dbConn.Close();
}
/// <summary>
/// 更改变数据库名称
/// </summary>
/// <param name="databaseName"></param>
public void ChangeDataBase( string databaseName )
{
this.dbConn.ChangeDatabase( databaseName );
} /// <summary>
/// 添加参数
/// </summary>
/// <param name="paraName">参数名</param>
/// <param name="objValue">参数值</param>
/// <param name="dbType">参数类型</param>
/// <param name="size">类型大小</param>
/// <param name="sourceColumn">源列名称</param>
public abstract void AddParameter( string paraName,object objValue,SqlDbType dbType,int size,string sourceColumn ); /// <summary>
/// 添加参数
/// </summary>
/// <param name="paraName">参数名称</param>
/// <param name="objValue">参数值</param>
/// <param name="dbtype">参数类型</param>
public abstract void AddParameter( string paraName,object objValue,SqlDbType dbType ); /// <summary>
/// 添加参数
/// </summary>
/// <param name="paraName">参数名称</param>
/// <param name="objValue">参数值</param>
/// <param name="dbtype">参数类型</param>
/// <param name="sourceColumn">源列名称</param>
public abstract void AddParameter( string paraName, object objValue,SqlDbType dbtype,string sourceColumn ); /// <summary>
/// 添加参数
/// </summary>
/// <param name="paraName">参数名称</param>
/// <param name="objValue">参数值</param>
/// <param name="dbtype">参数类型</param>
/// <param name="sourceColumn">源列名称</param>
/// <param name="size">参数大小</param>
public abstract void AddParameter( string paraName, object objValue,SqlDbType dbtype,string sourceColumn,int size ); /// <summary>
/// 添加参数
/// </summary>
/// <param name="paraName">参数名称</param>
/// <param name="objValue">参数值</param>
/// <param name="dbtype">参数类型</param>
/// <param name="sourceColumn">源列名称</param>
/// <param name="size">参数大小</param>
/// <param name="paraDirection">参数的方向类型</param>
public abstract void AddParameter( string paraName, object objValue,SqlDbType dbtype,string sourceColumn,int size,System.Data.ParameterDirection paraDirection ); /// <summary>
/// 清除参数列表
/// </summary>
public virtual void ClearParameters()
{
this.dbComm.Parameters.Clear();
}
/// <summary>
/// 创建数据库操作对象
/// </summary>
/// <param name="configFile">配置文件路径</param>
/// <returns></returns>
public static DbOperatorFactory CreateDbOperatorFactory( string p_strUID, string p_strPassword, string p_strServer, string p_strDataBase, DataBaseType p_dbType )
{
if( DbOperatorFactory.m_ConnectionString.Length <= 0 )
{
switch( p_dbType )
{
case DataBaseType.MSSQL:
m_ConnectionString = string.Format( @"packet size=4096;user id={0};data source={1};initial catalog={2};password={3}", p_strUID, p_strServer, p_strDataBase, p_strPassword );
break;
case DataBaseType.ODBC:
break;
case DataBaseType.OLEDB:
m_ConnectionString = string.Format( @"Auto Translate=True;User ID={0}; Tag with column collation when possible=False;
Data Source={1};Password={2};Initial Catalog='{3}'; Connect Timeout = 15; Use Procedure for Prepare=1;
Provider='SQLOLEDB.1';Persist Security Info=True;Use Encryption for Data=False;Packet Size=4096;",
p_strUID, p_strServer, p_strPassword, p_strDataBase ); break;
} dbType = p_dbType;
} DbOperatorFactory dbObject = null;
switch( p_dbType )
{
case DataBaseType.MSSQL:
dbObject = new DbOperatorSQLFactory();
break;
case DataBaseType.ODBC:
dbObject = new DbOperatorODBCFactory();
break;
case DataBaseType.OLEDB:
dbObject = new DbOperatorOleDbFactory();
break;
}
return dbObject;
}
#endregion #region IDisposable 成员 public void Dispose()
{
this.Dispose( true );
GC.SuppressFinalize( this );
}
protected virtual void Dispose( bool disposing )
{
if( disposing )
{
if( this.dbComm != null )
this.dbComm.Dispose();
if( this.dbTrans != null )
this.dbTrans.Dispose();
if( this.dbConn != null )
{
if( this.dbConn.State != System.Data.ConnectionState.Closed )
this.dbConn.Close();
this.dbConn.Dispose();
}
}
} #endregion ~ DbOperatorFactory()
{
this.Dispose();
}
} //class DbOperatorFactory