源代码:13033480群共享
基本的数据库连接,已经很好地完成了数据库的基本操作。但,为了模块化,我们需要把具有一定功能的代码块,放到函数中;进而,再放到类中,放到类库里。
【操作步骤】
一、把数据库基本操作放到函数ExecuteReader()中,这个函数将来要放在类库DBUtility中的类SQLHelpe.cs里。
using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.Configuration;
using NetShop.Model;
public partialclass_Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
const string SQL_SELECT_CATEGORIES = "SELECT CategoryId, Name, Descn FROM Category";
IList<CategoryInfo> categories =newList<CategoryInfo>();
String connectionString =ConfigurationManager.ConnectionStrings["SQLConnString1"].ConnectionString;
//数据保存到Model中
using (SqlDataReader rdr = ExecuteReader(connectionString,CommandType.Text, SQL_SELECT_CATEGORIES,null))
{
while (rdr.Read())
{
CategoryInfo cat =newCategoryInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2));
categories.Add(cat);
}
}
//数据绑定绑定到用户界面
lstCategories.DataSource = categories;
lstCategories.DataTextField = "Name";
lstCategories.DataValueField = "ID";//Model中的字段与数据库表中的字段一样,是不是更好?
lstCategories.DataBind();
}
//返回一个SqlDataReader的数据库通用的基本操作函数
//只需要知道针对哪个连接、命令的类型、内容和参数,就能执行Command命令,返回一个DataReader。
public static SqlDataReader ExecuteReader(string connectionString,CommandType cmdType,string cmdText,paramsSqlParameter[] commandParameters)
{
SqlCommand cmd = new SqlCommand();
SqlConnection conn = new SqlConnection(connectionString);
try
{
conn.Open();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = cmdText;
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return rdr;
}
catch
{
conn.Close();
throw;
}
}
}
二、把读取数据库NetShop表Category中的数据代码块放在函数GetCategories()中,这个函数将来要放在数据访问层SQLServerDAL中的类Category.cs里。
using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.Configuration;
using NetShop.Model;
public partialclass_Default : System.Web.UI.Page
{
const string SQL_SELECT_CATEGORIES = "SELECT CategoryId, Name, Descn FROM Category";
IList<CategoryInfo> categories =newList<CategoryInfo>();
String connectionString = ConfigurationManager.ConnectionStrings["SQLConnString1"].ConnectionString;
protected void Page_Load(object sender, EventArgs e)
{
//数据绑定绑定到用户界面
lstCategories.DataSource = GetCategories();
lstCategories.DataTextField = "Name";
lstCategories.DataValueField = "ID";//Model中的字段与数据库表中的字段一样,是不是更好?
lstCategories.DataBind();
}
public IList<CategoryInfo> GetCategories()
{
//数据保存到Model中
//使用using块,隐式关闭rdr。
//??关闭rdr同时就关闭conn了??
using (SqlDataReader rdr = ExecuteReader(connectionString,CommandType.Text, SQL_SELECT_CATEGORIES,null))
{
while (rdr.Read())
{
CategoryInfo cat =newCategoryInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2));
categories.Add(cat);
}
}
return categories;
}
//返回一个SqlDataReader的数据库通用的基本操作函数
//只需要知道针对哪个连接、命令的类型、内容和参数,就能执行Command命令,返回一个DataReader。
public static SqlDataReader ExecuteReader(string connectionString,CommandType cmdType,string cmdText,paramsSqlParameter[] commandParameters)
{
SqlCommand cmd = new SqlCommand();
//阅读器关闭时 Read 的尝试无效。
//这里,因为要返回rdr,如果读取数据有效,conn不能关闭,也不能用using块隐式关闭。
SqlConnection conn = new SqlConnection(connectionString);
try
{
conn.Open();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = cmdText;
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return rdr;
}
catch
{
conn.Close();
throw;
}
}
}
三、把绑定数据代码块,形成一个函数BindCategories(),这个函数和调用它的代码,以及窗体,将来,都要放在用户控件文件夹Controls里。
using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.Configuration;
using NetShop.Model;
public partialclass_Default : System.Web.UI.Page
{
const string SQL_SELECT_CATEGORIES = "SELECT CategoryId, Name, Descn FROM Category";
IList<CategoryInfo> categories =newList<CategoryInfo>();
String connectionString = ConfigurationManager.ConnectionStrings["SQLConnString1"].ConnectionString;
protected void Page_Load(object sender, EventArgs e)
{
BindCategories();
}
//数据绑定绑定到用户界面
private void BindCategories()
{
lstCategories.DataSource = GetCategories();
lstCategories.DataTextField = "Name";
lstCategories.DataValueField = "ID";//Model中的字段与数据库表中的字段一样,是不是更好?
lstCategories.DataBind();
}
//获取商品类别,存入Model中的CategoryInfo构成的列表中。
public IList<CategoryInfo> GetCategories()
{
//使用using块,隐式关闭rdr。
//??关闭rdr同时就关闭conn了??
using (SqlDataReader rdr = ExecuteReader(connectionString,CommandType.Text, SQL_SELECT_CATEGORIES,null))
{
while (rdr.Read())
{
CategoryInfo cat =newCategoryInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2));
categories.Add(cat);
}
}
return categories;
}
//返回一个SqlDataReader的数据库通用的基本操作函数
//只需要知道针对哪个连接、命令的类型、内容和参数,就能执行Command命令,返回一个DataReader。
public static SqlDataReader ExecuteReader(string connectionString,CommandType cmdType,string cmdText,paramsSqlParameter[] commandParameters)
{
SqlCommand cmd = new SqlCommand();
//阅读器关闭时 Read 的尝试无效。
//这里,因为要返回rdr,如果读取数据有效,conn不能关闭,也不能用using块隐式关闭。
SqlConnection conn = new SqlConnection(connectionString);
try
{
conn.Open();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = cmdText;
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return rdr;
}
catch
{
conn.Close();
throw;
}
}
}
【技术要点】
1、 Repeater
2、try…catch结构
3、using块
4、变量位置