ASP.NET学习记录:KingFrame框架数据库方面的一些使用文档

信息系统项目,其实主要是前端如何展示以实现用户交互(核心)以及后端实现同数据库的连通处理(即增删改查),这篇主要记录团队凝练十年编程技术后沉淀下来的基于ASP.NET的KingFrame框架在后端同数据库连通处理等一些处理上的学习:

增删改查

King.DataBase.SqlServer.GetNonQueryEffectedRow(cmd)  // 根据sqlstr执行增、删、改
King.DataBase.SqlServer.ExecuteWithTransactionCmd(al)  // 事物执行多条sql,失败则全部回滚

King.DataBase.SqlServer.getPagedDataJson(cmd)  // 获取具有分页属性的json对象,即直接将sql查询的结果封装带有分页的json结果

King.DataBase.SqlServer.GetDataSet(cmd) // 根据sqlstr获取DataSet

DataTable dt5 = King.DataBase.SqlServer.GetDataSet(cmd5).Tables[0];根据sqlstr获取DataSet后并获取Table[0],可以供后面吗具体操作

King.DataBase.SqlServer.getJsonOfDataTable(dt)  // 将DataTable 转换为Json
King.StringOper.getJsonStr(ksd).ToString() // 将蓄序列数据转换成json数据

//构建sql语句要传递的值

SqlCommand cmd = new SqlCommand(sqlstr);
cmd.Parameters.AddWithValue("@TableKey", Guid.NewGuid().ToString());

 

1 插入数据-insert

string sqlstr = "insert into 生产资料信息(TableKey,牌号,牌照颜色,生产资料类型id,型号,出厂时间,照片,行驶证号码,购买时间,所有人,所有人联系电话,核定吨座位,下次二级维护日期,运输证号,本次年审日期,年审结果,厂牌,落户日期,车辆技术等级,下次技术等级评定日期) ";
sqlstr += " values(@TableKey,@牌号,@牌照颜色,@生产资料类型id,@型号,@出厂时间,@照片,@行驶证号码,@购买时间,@所有人,@所有人联系电话,@核定吨座位,@下次二级维护日期,@运输证号,@本次年审日期,@年审结果,@厂牌,@落户日期,@车辆技术等级,@下次技术等级评定日期)";
SqlCommand cmd = new SqlCommand(sqlstr);
cmd.Parameters.AddWithValue("@TableKey", Guid.NewGuid().ToString());
cmd.Parameters.AddWithValue("@牌号", context.Request["ph"]);
...
if (context.Request["ccsj"] == null || context.Request["ccsj"] == "")
{
cmd.Parameters.AddWithValue("@出厂时间", DBNull.Value);
}
else
{
cmd.Parameters.AddWithValue("@出厂时间", context.Request["ccsj"]);
}
cmd.Parameters.AddWithValue("@照片", context.Request["sczp"]);
//cmd.Parameters.AddWithValue("@照片", DBNull.Value);
...
try
{
King.DataBase.SqlServer.GetNonQueryEffectedRow(cmd);
context.Response.Write("1");
}
catch (Exception ex)
{
context.Response.Write(ex.Message.ToString());
}

Tips:  DBNull.Value  处理为空的数据  

2 删除数据-Delete

在项目中一般都不是直接删除数据,而是通过标记该条数据有效否通过update该指字段为0来实现隐式删除,所以删除操作的本质仍是update更新操作,具体见下一节的Update更新数据操作;

3 更新数据-Update

string sqlstr = "update 生产资料归属企业 set 解除挂靠关系时间=@解除挂靠关系时间,解除挂靠关系操作时间=@解除挂靠关系操作时间,解除挂靠关系操作人id=@解除挂靠关系操作人id,是否有效挂靠=@是否有效挂靠 where TableKey=@TableKey";
SqlCommand cmd = new SqlCommand(sqlstr);
cmd.Parameters.AddWithValue("@解除挂靠关系时间", context.Request["jcgksj"]);
cmd.Parameters.AddWithValue("@解除挂靠关系操作时间", System.DateTime.Now);
cmd.Parameters.AddWithValue("@解除挂靠关系操作人id", King.GlobalOper.getGlobalPara("userId"));
cmd.Parameters.AddWithValue("@是否有效挂靠", 0);
cmd.Parameters.AddWithValue("@TableKey", context.Request["sendkey"]);
try
{
	King.DataBase.SqlServer.GetNonQueryEffectedRow(cmd);
	context.Response.Write("1");
}
catch (Exception ex)
{
	context.Response.Write(ex.Message.ToString());
}

4 查询数据-Select

查询数据,会有数据返回,而这些数据可能从数据库取出后需要进行一定的逻辑处理,在返回前端,如对时间进行相应的格式化或者合并原本两个字段的起始时间变成一个字段作为期限值等二次细加工

4.1 不需要处理,直接返回前端-通过getPagedDataJson方法直接封装成json返回

#region 构建过滤字符串
string conditionStr = "and 有效否=1 and 父部门id='" + context.Request["sendkey"] + "'";
if (context.Request["qymc"] != "")
{
	conditionStr += " and 企业名称 like '%" + context.Request["qymc"] + "%'";
}
#endregion
var sqlstr = "exec KingPage @tableName, @tableCount, @pageSize, @currentPage, @sortColumn, @strCondition, @pageCount output, @counts output";
var cmd = new SqlCommand(sqlstr);
cmd.Parameters.AddWithValue("@tableName", "view_企业信息");
cmd.Parameters.AddWithValue("@tableCount", "TableKey,企业类型,企业名称,法人代表,营业执照号,法人联系电话,经营期限起,经营期限止,企业地址");
cmd.Parameters.AddWithValue("@pageSize", int.Parse(context.Request["pageSize"]));
cmd.Parameters.AddWithValue("@currentPage", int.Parse(context.Request["pageid"]));
cmd.Parameters.AddWithValue("@sortColumn", "经营期限起 asc");
cmd.Parameters.AddWithValue("@strCondition", conditionStr);
cmd.Parameters.Add("@pageCount", SqlDbType.BigInt).Direction = ParameterDirection.Output;
cmd.Parameters.Add("@counts", SqlDbType.BigInt).Direction = ParameterDirection.Output;
context.Response.Write(King.DataBase.SqlServer.getPagedDataJson(cmd));

4.2 对某几个字段进行了细加工,需要再次封装返回

#region 构建过滤字符串
string conditionStr = "and 有效否=1 and 父部门id='" + context.Request["sendkey"] + "'";
if (context.Request["qymc"] != "")
{
	conditionStr += " and 企业名称 like '%" + context.Request["qymc"] + "%'";
}
#endregion
var sqlstr = "exec KingPage @tableName, @tableCount, @pageSize, @currentPage, @sortColumn, @strCondition, @pageCount output, @counts output";
var cmd = new SqlCommand(sqlstr);
cmd.Parameters.AddWithValue("@tableName", "view_企业信息");
cmd.Parameters.AddWithValue("@tableCount", "TableKey,企业类型,企业名称,法人代表,营业执照号,法人联系电话,经营期限起,经营期限止,企业地址");
cmd.Parameters.AddWithValue("@pageSize", int.Parse(context.Request["pageSize"]));
cmd.Parameters.AddWithValue("@currentPage", int.Parse(context.Request["pageid"]));
cmd.Parameters.AddWithValue("@sortColumn", "经营期限起 asc");
cmd.Parameters.AddWithValue("@strCondition", conditionStr);
cmd.Parameters.Add("@pageCount", SqlDbType.BigInt).Direction = ParameterDirection.Output;
cmd.Parameters.Add("@counts", SqlDbType.BigInt).Direction = ParameterDirection.Output;
//context.Response.Write(King.DataBase.SqlServer.getPagedDataJson(cmd));
// 变化 这里先取出了通过sql查询返回的数据,然后放在DataTable中,进行处理
DataTable dt = King.DataBase.SqlServer.GetDataSet(cmd).Tables[0];
dt.Columns.Add("经营期限");
foreach (DataRow dr in dt.Rows)
{
	if (dr["经营期限起"].ToString() != "" && dr["经营期限止"].ToString() != "")
	{
		dr["经营期限"] = DateTime.Parse(dr["经营期限起"].ToString()).ToString("yyyy-MM-dd") + " — " + DateTime.Parse(dr["经营期限止"].ToString()).ToString("yyyy-MM-dd");
	}
	else
	{
		dr["经营期限"] = "";
	}
}
// 处理结束后,在对DataTable对象转换成Json对象-getJsonOfDataTable
string jsonStr = King.DataBase.SqlServer.getJsonOfDataTable(dt);
// 实例化返回的信息对象
King.DataBase.KSDataList ksd = new King.DataBase.KSDataList();
// 对数据进行处理,添加返回数据的分页信息和序列化json数据的结果集
ksd.pageCount = cmd.Parameters["@pageCount"].Value.ToString();
ksd.counts = cmd.Parameters["@counts"].Value.ToString();
ksd.CurrentPageJson = jsonStr;
// 将上面封装在一起的KSDataList结果集,最后一次封装成json返回
context.Response.Write(King.StringOper.getJsonStr(ksd).ToString());

4.3 获取表中的数据进行处理,获取后保存成DataTable ,然后对datatable进行处理

// 这是固定只有一条返回数据的写法
string sqlstr5 = "select 部门名称,部门电话,负责人,部门简介,父部门id from CreditPlatform_Frame.dbo.字典_部门 where TableKey=@id";
SqlCommand cmd5 = new SqlCommand(sqlstr5);
cmd5.Parameters.AddWithValue("@id", Request["sendkey"]);
DataTable dt5 = King.DataBase.SqlServer.GetDataSet(cmd5).Tables[0];
DataRow dr = dt5.Rows[0];
string qymc = dr["部门名称"].ToString();
// 有多条数据时,也可以类似前面处理时间一样对datatable进行foreach循环处理
foreach (DataRow dr in dt.Rows)
{
	if (dr["经营期限起"].ToString() != "" && dr["经营期限止"].ToString() != "")
	{
		dr["经营期限"] = DateTime.Parse(dr["经营期限起"].ToString()).ToString("yyyy-MM-dd") + " — " + DateTime.Parse(dr["经营期限止"].ToString()).ToString("yyyy-MM-dd");
	}
	else
	{
		dr["经营期限"] = "";
	}
}

5 多条sql语句同时操作

在一些操作中,如更新我们可能一个功能会需要同时更新多个表的数据,再次程序中,一般不建议将这一些操作分次(即前后做完一个在做一个sql),这种做法在一些情况下对数据可能会出现问题,比如这一批次的处理可能有10条,某些情况下,如网络网络不好,这些操作可能并没有都执行完,但是我们业务需求肯定是因为数据表有同步更新需求,才需要一起更新,如此就会导致我们系统的数据出现冲突.

好的做法就是将这些sql语句拼凑好之后,先放入一个数组list集合中,然后通过一个sql执行方法,一起进行操作.

try
{
	// ArrayList对象用于存放多个要执行的sql
    var al = new System.Collections.ArrayList();
    // 此处业务是前端同时传了多个id,然后需要根据id的个数循环操作,
	var keyArr = context.Request["id"].Split(',');
	var sqlstr = "";
	var cmd = new SqlCommand();
	foreach (var s in keyArr)
	{
        // 这里需要同时操作三张表,所以借助了ArrayList,每次通过add方法放入集合中,所以实际上ArrayList中可能有keyArr.Count*3条sql,如果你业务没有循环,其实就是放弃外面的foreach操作就好了
		sqlstr = "update CreditPlatform_Frame.dbo.字典_部门 set 有效否=0 where TableKey=(select 部门id from 企业信息 where TableKey=@key and 有效否=1)";
		cmd = new SqlCommand(sqlstr);
		cmd.Parameters.AddWithValue("@key", s);
		al.Add(cmd);

		sqlstr = "update 企业信息 set 有效否=0 where TableKey=@key;";
		cmd = new SqlCommand(sqlstr);
		cmd.Parameters.AddWithValue("@key", s);
		al.Add(cmd);

		// 强制清除生产资料未解除和从业人员未解除聘用数据
		sqlstr = "update 生产资料归属企业 set 解除挂靠关系时间=@解除挂靠关系时间,解除挂靠关系操作时间=@解除挂靠关系操作时间,解除挂靠关系操作人id=@解除挂靠关系操作人id,是否有效挂靠=@是否有效挂靠 where 是否有效挂靠=1 and 企业id=@TableKey";
		cmd = new SqlCommand(sqlstr);
		cmd.Parameters.AddWithValue("@解除挂靠关系时间", System.DateTime.Now);
		cmd.Parameters.AddWithValue("@解除挂靠关系操作时间", System.DateTime.Now);
		cmd.Parameters.AddWithValue("@解除挂靠关系操作人id", King.GlobalOper.getGlobalPara("userId"));
		cmd.Parameters.AddWithValue("@是否有效挂靠", 0);
		cmd.Parameters.AddWithValue("@TableKey", s);
		al.Add(cmd);

		sqlstr = "update 从业人员归属企业 set 解聘时间=@解聘时间,解聘操作时间=@解聘操作时间,解聘操作人id=@解聘操作人id,是否在聘=@是否在聘 where 是否在聘=1 and 企业id=@TableKey";
		cmd = new SqlCommand(sqlstr);
		cmd.Parameters.AddWithValue("@解聘时间", System.DateTime.Now);
		cmd.Parameters.AddWithValue("@解聘操作时间", System.DateTime.Now);
		cmd.Parameters.AddWithValue("@解聘操作人id", King.GlobalOper.getGlobalPara("userId"));
		cmd.Parameters.AddWithValue("@是否在聘", 0);
		cmd.Parameters.AddWithValue("@TableKey", s);
		al.Add(cmd);
	}
	// 这里特别注意,如果用了ArrayList存放了多条sql,那么执行的时候要用ExecuteWithTransactionCmd方法,这是专门处理多条sql的方法
	King.DataBase.SqlServer.ExecuteWithTransactionCmd(al);
	context.Response.Write(1);
}
catch (Exception ex)
{
	context.Response.Write(ex.Message.ToString());
}

6  一些摸索的写法,不推荐,但是部分可借鉴

将获取的结果一个个保存到数组List序列中,以便后面对序列操作

List listS = new List();
foreach (var s in keyArr)
{
	var sqlstr = "select 部门id from 企业信息 where TableKey=@key and 有效否=1";
	var cmd = new SqlCommand();
	cmd = new SqlCommand(sqlstr);
	cmd.Parameters.AddWithValue("@key", s);
	DataTable dt = King.DataBase.SqlServer.GetDataSet(cmd).Tables[0];
	//string bmid = dt.Rows[0][0].ToString();
	listS.Add(dt.Rows[0][0].ToString());
}

完整记录

var keyArr = context.Request["id"].Split(',');
List listS = new List();
foreach (var s in keyArr)
{
	var sqlstr = "select 部门id from 企业信息 where TableKey=@key and 有效否=1";
	var cmd = new SqlCommand();
	cmd = new SqlCommand(sqlstr);
	cmd.Parameters.AddWithValue("@key", s);
	DataTable dt = King.DataBase.SqlServer.GetDataSet(cmd).Tables[0];
	//string bmid = dt.Rows[0][0].ToString();
	listS.Add(dt.Rows[0][0].ToString());
}
var sqlstr1 = "";
var cmd1 = new SqlCommand();
var al = new System.Collections.ArrayList();
foreach (var s in keyArr)
{
	sqlstr1 = "update 企业信息 set 有效否=0 where TableKey=@key;";
	cmd1 = new SqlCommand(sqlstr1);
	cmd1.Parameters.AddWithValue("@key", s);
	al.Add(cmd1);
}
foreach (var k in listS)
{
	sqlstr1 = "update CreditPlatform_Frame.dbo.字典_部门 set 有效否=0 where TableKey=@key;";
	cmd1 = new SqlCommand(sqlstr1);
	cmd1.Parameters.AddWithValue("@key", k);
	al.Add(cmd1);
}
King.DataBase.SqlServer.ExecuteWithTransactionCmd(al);
context.Response.Write(1);

此外还有一些写法

// 判断当前部门id是否公司-by 是否有下属节点,有节点说明还是层级部门,未到最后节点
string sqlstr1 = "select * from CreditPlatform_Frame.dbo.字典_部门 where 父部门id=@id";
SqlCommand cmd1 = new SqlCommand(sqlstr1);
cmd1.Parameters.AddWithValue("@id", Request["sendkey"]);
DataTable dt = King.DataBase.SqlServer.GetDataSet(cmd1).Tables[0];
if (dt.Rows.Count != 0)
{
	operae = "1";//部门
	string sqlstr2 = "select 部门名称,部门电话,负责人,排序,部门简介,位置关键字,父部门id from CreditPlatform_Frame.dbo.字典_部门 where TableKey=@id";
	SqlCommand cmd2 = new SqlCommand(sqlstr2);
	cmd2.Parameters.AddWithValue("@id", Request["sendkey"]);
	DataTable dt1 = King.DataBase.SqlServer.GetDataSet(cmd2).Tables[0];
	//this.bmmc.Value = dt1.Rows[0]["部门名称"].ToString();
	//this.bmdh.Value = dt1.Rows[0]["部门电话"].ToString();
	//this.fzr.Value = dt1.Rows[0]["负责人"].ToString();
	//this.px.Value = dt1.Rows[0]["排序"].ToString();
	//this.bz.Value = dt1.Rows[0]["部门简介"].ToString();
	//this.wzgjz.Value = dt.Rows[0]["位置关键字"].ToString();
}
else {
	
	// 判断 当前公司tablekey是否已经在企业信息表中
	string sqlstr3 = "select * from 企业信息 where TableKey=@id";
	SqlCommand cmd3 = new SqlCommand(sqlstr3);
	cmd3.Parameters.AddWithValue("@id", Request["sendkey"]);
	DataTable dt3 = King.DataBase.SqlServer.GetDataSet(cmd3).Tables[0];
	if (dt3.Rows.Count != 0)
	{
		operae = "2";//公司update
	}
	else {

数据库统计count的语句:

select a.py,b.gk from  ( select count(1) as py from 从业人员归属企业 where 有效否 =1 and 企业id= 1) a  FULL JOIN (select count(1) as gk from 生产资料归属企业 where 有效否 =1 and 企业id= 1) b on 1=1

 

你可能感兴趣的:(项目实战笔记)