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;
}
}
}

解决方案 »

  1.   

    不错connetion使用之前要不要open,使用之后要不要close???
      

  2.   

    你这也写得太简单了吧????
    既然用SQL Server的话存储过程肯定少不了了吧?怎么没有??
    还有事务等操作也没有嘛??
      

  3.   

    WanttoBe(mydream) ( ) 信誉:70  2006-08-12 13:47:00  得分: 0  
     
     
       不错connetion使用之前要不要open,使用之后要不要close???
      
    ----------------SqlDataAdapter对象调用Fill、Update前不用open,使用之后不用close
      

  4.   

    xiaomatian(趴趴熊◎%#……※×) ( ) 信誉:100  2006-08-12 13:53:00  得分: 0  
     
     
       你这也写得太简单了吧????
    既然用SQL Server的话存储过程肯定少不了了吧?怎么没有??
    还有事务等操作也没有嘛??----------------是简单了点,存储过程、事务暂时还用不着,呵呵
      

  5.   

    建议数据库连接在使用时打开,使用完马上关闭.不要一直打开.不要使用成员变量保存数据库连接.
    你应该有个统一的打开关闭数据库连接的方式在你的类中。
    而且你这样的方式,如果前面SQL执行出错,有可能导致连接被强行关闭.下次再操作时就出错了。
      

  6.   

    给楼主一些建议:
    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语句,是很有问题的做法。建议楼主修改。
      

  7.   

    给你一个我的:
    /// <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;
    }
      

  8.   

    /// <summary>
    /// 提交事务
    /// </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
      

  9.   

    zhzuo(秋枫):非常感谢您的指点!真有“听君一席话,胜读十年书”的感觉!虽然你说的很多我现在还不明白,但是确实我的代码缺陷很多!谢谢!!!!!zhgroup:也非常感谢你提供的代码,我会认真研究学习的。
      

  10.   

    我觉得捕捉异常这快,应该用thorw语句抛出一个异常,返回上一层捕捉该异常,这样便与代码调试跟踪!!!