源代码:13033480群共享
一、把数据库基本操作,放在publicabstractclassSQLHelper类中
做这个类,要注意这么几个问题:
1、 空间
因为要存放几个类,这时,需要一个命名空间
namespace NetShop.Web
{
}
2、抽象类publicabstractclassSqlHelper{}
这种类,里面的变量和函数都做成了静态的,使用的时候,不需要定义或声明,也就是所谓的实例化,可以直接调用,调用方法如下:
using (SqlDataReader rdr =SqlHelper.ExecuteReader(SqlHelper.ConnectionStringLocalTransaction,CommandType.Text, SQL_SELECT_CATEGORIES, null))
3、静态变量
public staticreadonlystring ConnectionStringLocalTransaction =ConfigurationManager.ConnectionStrings["SQLConnString1"].ConnectionString;
实现代码如下:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.Configuration;
using NetShop.Model;
//加命名空间时,注意修改窗体文件的属性Inherits="NetShop.Web._Default"
namespace NetShop.Web
{
public partial class _Default : System.Web.UI.Page
{
const string SQL_SELECT_CATEGORIES = "SELECT CategoryId, Name, Descn FROM Category";
IList<CategoryInfo> categories =newList<CategoryInfo>();
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 =SqlHelper.ExecuteReader(SqlHelper.ConnectionStringLocalTransaction,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;
}
}
//抽象类,函数和变量都是静态的,使用时,不需要实例化,直接调用。
public abstract class SqlHelper
{
public static readonly string ConnectionStringLocalTransaction =ConfigurationManager.ConnectionStrings["SQLConnString1"].ConnectionString;
//返回一个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;
}
}
}
}
二、把获取分类表内容的代码,放在类publicclassCategory中
1、 public abstract classSQLHelper{}
2、 private const string SQL_SELECT_CATEGORIES ="SELECT CategoryId, Name, Descn FROM Category";
3、 IList<CategoryInfo> categories = new List<CategoryInfo>();
4、Category category =newCategory();
5、lstCategories.DataSource = category.GetCategories();
6、代码
using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.Configuration;
using NetShop.Model;
//加命名空间时,注意修改窗体文件的属性Inherits="NetShop.Web._Default"
namespace NetShop.Web
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
BindCategories();
}
//数据绑定绑定到用户界面
private void BindCategories()
{
Category category = new Category();
lstCategories.DataSource = category.GetCategories();
lstCategories.DataTextField = "Name";
lstCategories.DataValueField = "ID";//Model中的字段与数据库表中的字段一样,是不是更好?
lstCategories.DataBind();
}
}
public class Category
{
private const string SQL_SELECT_CATEGORIES = "SELECT CategoryId, Name, Descn FROM Category";
//获取商品类别,存入Model中的CategoryInfo构成的列表中。
public IList<CategoryInfo> GetCategories()
{
IList<CategoryInfo> categories =newList<CategoryInfo>();
//使用using块,隐式关闭rdr。
//??关闭rdr同时就关闭conn了??
using (SqlDataReader rdr =SqlHelper.ExecuteReader(SqlHelper.ConnectionStringLocalTransaction,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;
}
}
//抽象类,函数和变量都是静态的,使用时,不需要实例化,直接调用。
public abstract class SqlHelper
{
public static readonly string ConnectionStringLocalTransaction =ConfigurationManager.ConnectionStrings["SQLConnString1"].ConnectionString;
//返回一个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;
}
}
}
}
三、把类放到App_Code文件夹中
1、 Web→添加新项→类→Category
2、点击确定,弹出消息框,网站中添加文件夹App_Code
3、将Default.aspx.cs中的类Category剪切过去,注意相应的using
此时调试运行,会找不到SqlHelper类,貌似不能由App_Code反向找吧。
4、 同样,在App_Code中添加类SqlHelper
using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.Configuration;
using NetShop.Model;
///<summary>
/// SqlHelper 的摘要说明
///</summary>
//抽象类,函数和变量都是静态的,使用时,不需要实例化,直接调用。
public abstractclassSqlHelper
{
public static readonly string ConnectionStringLocalTransaction =ConfigurationManager.ConnectionStrings["SQLConnString1"].ConnectionString;
//返回一个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;
}
}
}
四、把类分放到类库DBUitility和SQLServerDAL中
1、在解决方案资源管理器中,剪切SqlHelper.cs,粘贴到类库DBUtility中,修改命名空间namespace NetShop.DBUtility,添加引用NetShop.Model
2、同样,剪切Category.cs,粘到类库SQLServerSAL中,修改命名空间namespace NetShop.SQLServerDAL,添加引用NetShop.Model、NetShop.DBUtility
Web中添加引用NetShop.DBUtility和NetShop.SQLServerDAL,并添加using NetShop.SQLServerDAL;
按照PetShop的源代码,修改一下SqlHelper.cs的文件名为SQLHelper.cs,此时,程序集名称和命名空间名称并没有改变,所以,没有带来任何影响。