//获取或设置一个值,该值指示参数是只可输入、只可输出、双向还是存储过程返回值参数。默认为input
//parameter.Value == null---其实实现的是,C#中的Null和数据库中的DBNull相对应
if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) && (parameter.Value == null))
{
parameter.Value = DBNull.Value;
}
//指定命令字符串的类型。
//其中CommandType是枚举类型{文本:Text;存储过程:StoredProcedure;表的名称:TableDirect}
//一直都没用过CommandType枚举的TableDirect的方式,今天试了一下报错,原来TableDirect只支持OleDB
//CommandType 属性设置为 TableDirect 时,应将 CommandText 属性设置为要访问的表的名称。当您调用“执行”(Execute) 方法之一时,将返回命名表的所有行和列。
//为了访问多个表,请使用逗号分隔的列表(没有空格或空白),其中包含要访问的多个表的名称。当 CommandText 属性命名多个表时,返回指定表的联接。
//只有用于 OLEDB 的 .NET Framework 数据提供程序才支持 TableDirect。 当 CommandType 设置为 TableDirect 时,不支持对多个表的访问。
cmd.CommandType = CommandType.Text;
/// <summary>
/// 执行查询语句,返回SqlDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close )
/// </summary>
/// <param name="strSQL">查询语句</param>
/// <returns>SqlDataReader</returns>
public static SqlDataReader ExecuteReader(string strSQL)
{
SqlConnection connection = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand(strSQL, connection);
connection.Open();
//CommandBehavior是一个枚举类型~!!
//括号中参数的意义在于:在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭。
//调用时和以前无差,只是此处必须这样写而已
SqlDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return myReader;
}
//由于在数据库中Remark字段是可以为null,所以必须做此判断!!
if (model.Remark.Length == 0)
{
parameters[4].Value = DBNull.Value;
}
else
{
parameters[4].Value = model.Remark;
}
PrepareCommand(cmd, connection, null, SQLString, cmdParms);
object obj = cmd.ExecuteScalar();
//清空cmd的参数列表
cmd.Parameters.Clear();
//如果返回值obj为null,或者,为DBNull~!!
if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
{
return null;
}
else
{
return obj;
}
//if (row["Remark"] != null)
//{
// model.Remark = row["Remark"].ToString();
//}
//对于在数据库中可为空的字段,Row2Model时的代码应该如下写,使用三元运算符~!
model.Remark = row.IsNull("Remark") ? "" : row["Remark"].ToString();
//此处容易犯错误!!【切记】【切记】
---------------当传入的参数比较少的话,直接传入参数!当传入的参数比较多(大于两个)的情况,则可以直接传对象的实体Model-------------------个人经验之谈~!!
---------------抛异常部分-------------【1】如果是弹出对话框,让你选择"是"还是"否",则是.NET Framework框架 捕获的错误,而你的程序中没有进行try catch,是框架替你捕获的~!!【2】而另一种情况,则是什么错误消息框也没弹出,则直接程序崩溃,自动关闭。这是一种连框架都没有想到的一种错误。【3】常理来说,程序运行一旦遇到错误,应该立即终止。但是弹出选择框让你选择是否继续,则是对于"发生异常,程序员有Try catch,抛出异常"这种有预谋的考虑所做出的妥协。【4】也就是说程序编写阶段对于种种可能发生的异常情况都考虑到,都进行了相应的抛出异常操作,则程序是不会崩溃,自动自动关闭的。
///三种方式实现,弹出----登陆成功,然后跳转
//【1】这种直接使用Response.Write()方法,可能会造成破坏网站整体的CSS结构。不建议使用
//Response.Write("<script languge=‘javascript‘>alert(‘登陆成功,欢迎【" + stu.Name + "】同学登陆本系统!‘); window.location.href=‘Main.aspx‘</script>");
//【2】Page.ClientScript.RegisterClientScriptBlock()这种方式生成的js代码,会在页面显示控件的前面提前生成(但仍然在Form表单之中,只不过在显示控件代码之前),造成的效果就是,弹框效果之后,弹框的后面无控件显示,一片白板~!!
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), Guid.NewGuid().ToString(), "alert(‘登陆成功,欢迎【" + stu.Name + "】同学登陆本系统!‘); window.location.href=‘Main.aspx‘", true);
//【3】Page.ClientScript.RegisterStartupScript(),与上面方法相比,生成的js代码也在Form表单之中,但是在显示控件代码之后。造成的效果就是,弹框效果之后,弹框的后面有控件显示~!!
//Page.ClientScript.RegisterStartupScript(this.GetType(), Guid.NewGuid().ToString(), @"<script languge=‘javascript‘>alert(‘登陆成功,欢迎【" + stu.Name + "】同学登陆本系统!‘); window.location.href=‘Main.aspx‘</script>", false);
---------------------可以将两个Sql命令放到一个Sql语句中去执行,两个命令之间用";"相隔~!!例如插入一条数据,再查出这条新数据所对应的Id,就是两个命令,但是一个方法去执行。------------------
/// <summary>
/// 批量删除数据
/// </summary>
public bool DeleteList(string TypeIdlist )
{
StringBuilder strSql=new StringBuilder();
strSql.Append("delete from RoomType ");
//批量删除数据时,传入的参数为被删除实体对应的Id列表集合(集合中的Id以逗号分隔表示,例如(1,6))
//这样才能使用数据库中的 In 关键字
strSql.Append(" where TypeId in ("+TypeIdlist + ") ");
int rows=DbHelperSQL.ExecuteSql(strSql.ToString());
if (rows > 0)
{
return true;
}
else
{
return false;
}
}
//-----------外键实体的处理,例如:房间表中的【外键】房间类型
【1】private int _roomType; 改成 private RoomType _roomType;-------用对象作为一个实体类的属性
【2】在DAL.Room类中的DataRowToModel()方法中修改代码:
if(row["RoomType"]!=null && row["RoomType"].ToString()!="")
{
model.RoomType=int.Parse(row["RoomType"].ToString());
}
改成:
-----------------添加,实例化DAL中的RoomType类
DAL.RoomType dal = new RoomType();
if(row["RoomType"]!=null && row["RoomType"].ToString()!="")
{
int roomtypeId=int.Parse(row["RoomType"].ToString());
model.RoomType = dal.GetModel(roomtypeId);
}