我想在.net 2008里面编一个包含 数据库联接 和BindDataGrid,BindDropDownList这些通用函数的类config。
总是控制不好myConnection,总报myConnection为null。
myConnection最好在哪里开关?
代码比较多,麻烦高手了!下面是代码:我自己想的原理:
类里面公用myConnection,DataSet
config()构造函数里Open(); // 打开数据库联接
Fill(sql)调用myConnection填充DataSet
BindDataGrid,BindDropDownList为通用函数,他们调用Fill(sql);,用完最后关了myConnection.Close();Web.config
  <connectionStrings>
    <add name="data"
         providerName="System.Data.SqlClient"
         connectionString= "server=DH;database=DB_GMM;uid=sa;pwd=dhsa."/>
  </connectionStrings>mypage.aspx
        protected string searchstring;
        protected config conn = new config();
            searchstring = "select * from T_User";
            conn.BindDataGrid(searchstring,MyDataGrid)
config.cs
namespace Web_GMM
{
/// <summary>
/// config 的摘要说明。
/// </summary>
public class config: System.Web.UI.Page
{
        public SqlConnection myConnection;
public SqlCommand myCommand;
public SqlDataAdapter myAdapter;
public SqlDataReader myReader;
public SqlCommandBuilder myCommandBuilder; public DataSet ds;
public DataTable dt;
public DataRow dr;

public config()
{
Open(); // 打开数据库
} ~config()
        {
            myConnection.Dispose();//释放连接池资源
} /// <summary>
/// 连接数据库
/// </summary>
public void Open()
{
            System.Configuration.Configuration rootWebConfig =
                System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("/MyWebSiteRoot");
            System.Configuration.ConnectionStringSettings connString;
            if (0 < rootWebConfig.ConnectionStrings.ConnectionStrings.Count)
            {
                connString = rootWebConfig.ConnectionStrings.ConnectionStrings["data"];
                if (null != connString)
                {
                    myConnection = new SqlConnection(connString.ToString());
                    myConnection.Open();
                }
                else
                { 
                
                }
            }
} /// <summary>
/// 关闭数据库和清除DateSet对象
/// </summary>
public void Close()
{
if (ds!=null) // 清除DataSet对象
{
ds.Clear();
}
if (myConnection!=null)
{
myConnection.Close(); // 关闭数据库
}
} /// <summary>
/// 建立DataSet对象,用记录填充或构架(如果必要)DataSet对象,DataSet即是数据在内存的缓存
/// </summary>
/// <param name="str_Sql">打开表Sql语句</param>
public void Fill(string str_Sql)
{
Open();
myAdapter = new SqlDataAdapter(str_Sql,myConnection);
            myAdapter.SelectCommand = new SqlCommand(str_Sql, myConnection);
ds = new DataSet();
myAdapter.Fill(ds);
} /// <summary>
/// 获得包含在DataSet对象的映谢表集合中的index为0的映谢表
/// </summary>
/// <param name="str_Sql">Select-SQL语句</param>
public void GetTable(string str_Sql)
{
Fill(str_Sql);
dt=ds.Tables[0]; myConnection.Close();
} /// <summary>
/// 获得符合该Sql语句的表记录数
/// </summary>
/// <param name="str_Sql">Select-SQL语句</param>
/// <returns>返回表记录条数</returns>
public int GetRowCount(string str_Sql)
{
Fill(str_Sql);
            try
            {
                int count = ds.Tables[0].Rows.Count;
                return count;
            }
            catch
            {
                return 0;
            }
            finally
            { 
                ds.Clear();
                myConnection.Close();
            }
} /// <summary>
/// 通过传Sql语句关键key值获得表中一行的数据
/// </summary>
/// <param name="str_Sql">带关键Key值参数的Select-SQL语句</param>
public void GetRowRecord(string str_Sql)
{
Fill(str_Sql);
dr=ds.Tables[0].Rows[0];
myConnection.Close();
} /// <summary>
/// 执行Transact-SQL语句,对数据库记录做插入,修改,删除等操作
/// </summary>
/// <param name="str_Sql">Transact-SQL语句</param>
public void ExeSql(string str_Sql)
{   
Open();
myCommand = new SqlCommand(str_Sql,myConnection);
myCommand.ExecuteNonQuery();
myCommand.Dispose();
} /// <summary>
/// 在DataGrid控件中删除数据库记录
/// </summary>
/// <param name="id">数据库表关键字key字段名</param>
/// <param name="tablename">数据库表名</param>
/// <param name="cb_Id">CheckBox控件id值</param>
/// <param name="lbl_Id">Label控件id值</param>
/// <param name="myDataGrid">DataGrid控件,即是数据绑定列表</param>
public void ExeDel(string id,string tablename,string cb_Id,string lbl_Id,DataGrid myDataGrid)
{
for (int i=0;i<myDataGrid.Items.Count;i++)
{
CheckBox myCheckBox;
Label myLabel;
myCheckBox=(CheckBox)myDataGrid.Items[i].FindControl(cb_Id);
myLabel=(Label)myDataGrid.Items[i].FindControl(lbl_Id);
if(myCheckBox.Checked==true)
{
string strDelSql="delete from "+tablename+" where "+id+"="+myLabel.Text;
ExeSql(strDelSql);
}
}
} /// <summary>
/// 绑定DataGrid控件并显示数据
/// </summary>
/// <param name="str_Sql">Select-SQL语句</param>
/// <param name="mydatagrid">DataGrid控件id值</param>
public void BindDataGrid(string str_Sql,DataGrid mydatagrid)
{
Fill(str_Sql);
mydatagrid.DataSource=ds.Tables[0].DefaultView;
mydatagrid.DataBind();
myConnection.Close();
} /// <summary>
/// 绑定DropDownList控件并显示数据,DropDownList控件Value,Text值将分别等于等于str_Value,str_Text值
/// </summary>
/// <param name="str_Value">绑定DropDownList控件Value值相对应数据库表字段名</param>
/// <param name="str_Text">绑定DropDownList控件Text值相对应数据库表字段名</param>
/// <param name="sql">Select-SQL语句</param>
/// <param name="myDropDownList">DropDownList控件id值</param>
public void BindDropDownList(string str_Value,string str_Text,string sql,DropDownList myDropDownList)
{
Fill(sql);
myDropDownList.DataSource=ds.Tables[0].DefaultView;
myDropDownList.DataValueField =str_Value;
myDropDownList.DataTextField=str_Text;
            myDropDownList.DataBind();
            myConnection.Close();
}

解决方案 »

  1.   

    使用using关键字,就不必考虑这些了。using()
    {
    }
      

  2.   

    MSDN里面确实是用
    using() 

    },具体怎么实现好呀!高手提点建议吗,最后做得通用了,我会把全部代码和使用方法贴出来的!
      

  3.   

    使用using的时候都会实现IDisposable接口.默认调用Dispose 方法来释放资源
      

  4.   


    using(SqlConnection conn = new SqlConnection("xxxx"))
    {
         SqlDataAdapter da = new SqlDataAdapter(str_Sql,conn);
         .............. 
    }
    MSDN上应该有例子.自己看看
      

  5.   

    就是你那个Fill方法里可以如下选择:
    1.using块里建立连接
    2.或者在Try Catch Finally的Try打开连接 、操作,最后在 Finally里关闭连接,
    3.打开、操作、关闭 。hehe不推荐