开发环境:VS2010+SQLServer2008
功能:简单实现显示一张表的记录。
具体步骤:
1、打开 sql server2008
在里面创建名为 school 的数据库,然后在数据库中创建 grade 表,里面有两个字段 id(自增字段),name(varchar(50)),然后在该表中任意插入几条记录。
2、创建一个文件夹,用来存储该程序,假设放在“E:\test”文件夹下。
3、打开 VS2010,创建解决方案:
步骤:文件--新建--项目,在弹出来的“新建项目”对话框中,已安装的模板中选择“其他项目类型”--“Visual Studio 解决方案”,然后在右边选择“空白解决方案”,其次在名称中输入“MySchool”,然后在位置中选择上面的新建文件夹:E:\test,然后点击“确定”。4、创建一个 ASP.NET Web 应用程序,用来显示 grade 中的所有内容。
步骤:文件--新建--项目,在弹出来的“新建项目”对话框中,已安装的模板中选择“VisualC#”--“ASP.NET 空 Web 应用程序”,名称处取名叫“MySchool”,位置选择:e:\test\ myschool,解决方案中选择“添加到解决方案”--然后点击“确定”。
此时,右边的解决方案资源管理器中多出了一个 MyShcool。这里双击里面的 web.config 文件,向里面添加数据库连接代码。
<connectionStrings>
<add name="ConnectionString" connectionString="Integrated Security=sspi;server=.;database=school;connect timeout=30"/>
</connectionStrings>
5、Model 层,直接对数据库的表中的字段赋值和取出某个字段中的值的层。
步骤:在解决方案“MySchool” (工具->选项->项目和解决方案->总是显示显示解决方案)
上单击右键选择“添加”>
新建项目,已安装的模板中选择“Visual C#”--“类库”,名称:MySchoolModel;选择添加到解决方案;位置:E:\test\MySchool,
然后点击“确定”。此时右边的解决方案资源管理器中多了一个 MySchoolModel。添加一个新类 Grade.cs;然后双击这个文件,左边出现它的所有代码。然后在该类中添加如下代码:
然后点击“确定”。此时右边的解决方案资源管理器中多了一个 MySchoolModel。添加一个新类 Grade.cs;然后双击这个文件,左边出现它的所有代码。然后在该类中添加如下代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Model
{
class Grade
{
private int _id = 0;
private string _name = "";
public int ID
{
set { _id = value; }
get { return _id; }
}
public string GradeName
{
set { _name = value; }
get { return _name; }
}
}
}
6、创建一个类库 Utility 来完成数据库底层操作
步骤:在解决方案“MySchool” 上单击右键选择“添加” 新建项目,已安装的模板中选择“Visual C#”--“类库”,名称: Utility;解决方案:选择添加到解决方案;位置:E:\test\myschool,然后点击“确定”。此时右边的解决方案资源管理器中多了一个 Utility。添加一个新类SQLHelper.cs;然后双击这个文件,左边出现它的所有代码。 这里开始做引用了。
操作过程:
右击 Utility 目录下面的引用--添加引用。在弹出的添加引用对话框中,选择.net 选择卡,找到System.Configuration,再点击确定。
右击 Utility 目录下面的引用--添加引用。在弹出的添加引用对话框中,选择.net 选择卡,找到System.Configuration,再点击确定。
这样,右边的引用中就多了 System.Configuration 了。引用这个文件的目的是获取 web.config文件中的值,这里主要用来获取连接数据库字符串。
此时我们开始处理 SQLHelper.cs 文件了,在这个文件顶部添加如下引用:
此时我们开始处理 SQLHelper.cs 文件了,在这个文件顶部添加如下引用:
using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Collections;
然后定义相关连接数据库函数,如下:
public static string connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
public static int ExecuteSql(string SQLSting, params SqlParameter[] cmdParms)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand cmd = new SqlCommand())
{
try
{
PrepareCommand(cmd, connection, null, SQLSting, cmdParms);
int rows = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return rows;
}
catch (System.Data.SqlClient.SqlException E)
{
throw new Exception(E.Message);
}
}
}
}
public static DataSet Query(string SQLStirng, params SqlParameter[] cmdParms)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand();
PrepareCommand(cmd, connection, null, SQLStirng, cmdParms);
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
DataSet ds = new DataSet();
try
{
da.Fill(ds, "ds");
cmd.Parameters.Clear();
}
catch (System.Data.SqlClient.SqlException ex)
{
throw new Exception(ex.Message);
}
return ds;
}
}
}
private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, string cmdText, SqlParameter[] cmdParms)
{
if (conn.State != ConnectionState.Open)
conn.Open();
cmd.Connection = conn;
cmd.CommandText = cmdText;
if (trans != null)
cmd.Transaction = trans;
cmd.CommandType = CommandType.Text;
if (cmdParms != null)
{
foreach (SqlParameter parm in cmdParms)
cmd.Parameters.Add(parm);
}
}
PS:
1.ConfigurationManager 类:
提供对客户端应用程序配置文件的访问。
2.params:
使用params关键字可以指定采用数目可变的参数的方法参数。
3.SqlParameter 类:
表示 SqlCommand 的参数,或者其与 DataSet 列的映射。
4.SqlCommand 类:
表示要对 SQL Server 数据库执行的一个 Transact-SQL 语句或存储过程。
SqlCommand.Paramters.Clear()方法:从SqlParameter中移除所有的SqlParameterCollection对象。
5.SqlConnection 类:
表示到 SQL Server 数据库的打开连接。
6.SqlParameterCollection 类:
表示与 SqlCommand 关联的参数的集合以及各个参数到 DataSet 中列的映射。
7.SqlDataAdapter 类:
表示用于填充 DataSet 和更新 SQL Server 数据库的一组数据命令和一个数据库连接。
第二个参数 String是指定DataSet 里表的名字,例如 sqlDataAdapter.fill(DataSet,"学生表") 指定后,以后就可以这样调用这张表 DataSet.Tables["学生表"] .
第二个参数可以不要的,如果不要第二个参数 String 那你调用这张表只能通过索引号,例如 DataSet.Tables[0] 如果填充的表比较多的话,用这个参数比较容易管理和调用。
8.ConnectionState 枚举
描述与数据源连接的当前状态。
9.SqlTransaction 类
表示将在 SQL Server 数据库中进行的 Transact-SQL 事务。
10.CommandType 枚举
指定如何解释命令字符串。
7、数据访问层(MySchoolDAL),该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等。
创建的步骤如第 6 条,名称:MySchoolDAL;解决方案:添加到解决方案;路径为e:\test\MySchool。在该项目下添加新类为 GradeService.cs。这里要对 Model 层进行操作,所以要引用 Model 层。
方法,右击引用--添加引用--选择“项目”选项卡--选择 MySchoolModel--确定;用同样的方法添加对 Utility 项目引用。然后在 GradeService.cs 的顶部加上 using MySchoolModel(Model 的命名空间);由于这层还要调用数据库进行操作,需要加上 using Utility;(数据库实际操作在这里,Utility 项目的命名空间是什么这里就 using 什么)。
方法,右击引用--添加引用--选择“项目”选项卡--选择 MySchoolModel--确定;用同样的方法添加对 Utility 项目引用。然后在 GradeService.cs 的顶部加上 using MySchoolModel(Model 的命名空间);由于这层还要调用数据库进行操作,需要加上 using Utility;(数据库实际操作在这里,Utility 项目的命名空间是什么这里就 using 什么)。
using System;
using System.Data;
using System.Text;
using System.Data.SqlClient;
using MySchoolModel;
using Utility;
namespace MySchoolDAL
{
public class GradeService
{
public bool Add(MySchoolModel.Grade model)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("insert into grade(");
strSql.Append("name)");
strSql.Append(" values (");
strSql.Append("@name)");
SqlParameter[] parameters = {new SqlParameter("@name", SqlDbType.VarChar,50)};
parameters[0].Value = model.GradeName;
int rows = SQLHelper.ExecuteSql(strSql.ToString(), parameters);
if (rows > 0)
{
return true;
}
else
{
return false;
}
}
/// <summary>
///更新一条数据
/// </summary>
public bool Update(MySchoolModel.Grade model)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("update grade set ");
strSql.Append("name=@name");
strSql.Append(" where id=@id ");
SqlParameter[] parameters = {
new SqlParameter("@id", SqlDbType.Int,4),
new SqlParameter("@name", SqlDbType.VarChar,50)
};
parameters[0].Value = model.ID;
parameters[1].Value = model.GradeName;
int rows = SQLHelper.ExecuteSql(strSql.ToString(), parameters);
if (rows > 0)
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// 删除一条数据
/// </summary>
public bool Delete(int id)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("delete from grade ");
strSql.Append(" where id=@id ");
SqlParameter[] parameters = {
new SqlParameter("@id", SqlDbType.Int,4) };
parameters[0].Value = id;
int rows = SQLHelper.ExecuteSql(strSql.ToString(), parameters);
if (rows > 0)
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// 根据一个id得到某条信息的model
/// </summary>
public MySchoolModel.Grade GetModel(int id)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("select top 1 id,name from grade ");
strSql.Append(" where id=@id ");
SqlParameter[] parameters = {
new SqlParameter("@id", SqlDbType.Int,4) };
parameters[0].Value = id;
MySchoolModel.Grade model = new MySchoolModel.Grade();
DataSet ds = SQLHelper.Query(strSql.ToString(), parameters);
if (ds.Tables[0].Rows.Count > 0)
{
if (ds.Tables[0].Rows[0]["id"] != null &&
ds.Tables[0].Rows[0]["id"].ToString() != "")
{
model.ID = int.Parse(ds.Tables[0].Rows[0]["id"].ToString());
}
if (ds.Tables[0].Rows[0]["name"] != null &&
ds.Tables[0].Rows[0]["name"].ToString() != "")
{
model.GradeName = ds.Tables[0].Rows[0]["name"].ToString();
}
return model;
}
else
{
return null;
}
}
/// <summary>
/// 根据条件获得数据列表,如果strwhere为空,表示获得所有数据
/// </summary>
public DataSet GetList(string strWhere)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("select id,name ");
strSql.Append(" FROM grade ");
if (strWhere.Trim() != "")
{
strSql.Append(" where " + strWhere);
}
return SQLHelper.Query(strSql.ToString());
}
}
}
PS:
1.StringBuilder 类:
表示可变字符字符串。
8、业务层(Bll)
针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。创建的方法同上。名称为 MySchoolBLL;解决方案:添加到解决方案;路径为e:\test\MySchool;然后添加新类 GradeBll.cs。这层要引用 DAL 层和 Model 层,所以要添加引用 DAL 和 Model,添加引用的方法同上;然后在 GradeBll.cs 顶部加以下代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MySchoolModel;
using MySchoolDAL;
namespace MySchoolBLL
{
public class GradeBll
{
GradeService dal = new GradeService();
/// <summary>
/// 增加一条记录
/// </summary>
public bool Add(Grade model)
{
return dal.Add(model);
}
/// <summary>
/// 更新一条记录
/// </summary>
public bool Update(Grade model)
{
return dal.Update(model);
}
/// <summary>
/// 删除一条记录
/// </summary>
public bool Delete(int id)
{
return dal.Delete(id);
}
/// <summary>
/// 得到一个对象实体
/// </summary>
public Grade GetModel(int id)
{
return dal.GetModel(id);
}
/// <summary>
/// 获得所有数据列表
/// </summary>
public DataSet GetList()
{
return dal.GetList("");
}
}
}
9、表现层(UI)
通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。
现在开始给页面添加代码了,让查询出来的内容显示到页面上来。步骤:展开web项目myschool,找到default.aspx文件,双击。在页面上添加一个gridview用来显示查询出来的grade
信息。编辑列为HyperLinkField,班级名称列为BoundField。
信息。编辑列为HyperLinkField,班级名称列为BoundField。
<asp:GridView ID="gv" runat="server" >
<Columns>
<asp:HyperLinkField DataNavigateUrlFields="id"
DataNavigateUrlFormatString="gradeedit.aspx?type=2&id={0}"
HeaderText="编辑"
Text="编辑">
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" />
</asp:HyperLinkField>
<asp:BoundField DataField="name" HeaderText="班级名称"/>
</Columns>
</asp:GridView>
10.添加新页 gradeedit.aspx,完成班级信息的添加和编辑。
如果传递到本页的 type=1 表示是添加,如果 type=2 表示是编辑,需要从数据库检索出当前这条信息。
<div>
班级名称:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<br /> <br />
<asp:Button ID="Button1" runat="server" Text="确认" οnclick="Button1_Click" />
<asp:Button ID="Button2" runat="server" Text="取消" οnclick="Button2_Click" />
</div>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace MySchool
{
public partial class GradeEdit : System.Web.UI.Page
{
MySchoolBLL.GradeBll obj = new MySchoolBLL.GradeBll();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Request.QueryString["type"] != null)
{
int type = int.Parse(Request.QueryString["type"].ToString());//获取类型编号,是添加还是编辑
if (type == 2)
{
if (Request.QueryString["id"] != null)
{
int id = int.Parse(Request.QueryString["id"].ToString());//获取班级id
MySchoolModel.Grade model = obj.GetModel(id);
if (model != null)
model.Grade =NameTextBox1.Text;
}
}
}
}
}
protected void Button1_Click(object sender, EventArgs e)
{
if (Request.QueryString["type"] != null)
{
int type = int.Parse(Request.QueryString["type"].ToString());//获取类型编号,是添加还是编辑
MySchoolModel.Grade model = new MySchoolModel.Grade();
model.GradeName = TextBox1.Text.Trim();
if (type == 2)
{
if (Request.QueryString["id"] != null)
{
int id = int.Parse(Request.QueryString["id"].ToString());//获取班级id
model.ID = id;
}
else
return;
bool flag = obj.Update(model);
if (flag)
{
//Page.ClientScript.RegisterStartupScript(Page.GetType(), "", "<script>alert('修改成功!');</script>");
Response.Redirect("default.aspx");
}
else
{
Page.ClientScript.RegisterStartupScript(Page.GetType(), "", "<script>alert('修改不成功,请联系管理员!');</script>");
}
}
else
{
bool flag = obj.Add(model);
if (flag)
{
Page.ClientScript.RegisterStartupScript(Page.GetType(), "", "<script>alert('添加成功!');</script>");
Response.Redirect("default.aspx");
}
else
{
Page.ClientScript.RegisterStartupScript(Page.GetType(), "", "<script>alert('添加不成功,请联系管理员!');</script>");
}
}
}
}
protected void Button2_Click(object sender, EventArgs e)
{
Response.Redirect("default.aspx");
}
}
}
PS:
1.Page.IsPostBack 属性:
获取一个值,该值指示页上呈现第一次还是正在加载中为回发的响应。
true为Post提交(也就是提交表单),flase则为第一次进入该页面。
2.Request.QueryString(取得地址栏参数值)获取地址栏中的参数,意思就是取得”?"号后面的参数值.如果是多个是用这”&”符号连接起来的.
例如:http://localhost:1988/JPKC/zuoyeDown.aspx?catalog=2009年第二学期
Request.QueryString["catalog"]的内容是2009年第二学期
Request.QueryString["catalog"]的内容是2009年第二学期