如何根据实体动态生成sql语句
2015-07-12 13:18
681 查看
该文章同时解决了,如何向数据库中添加Null值,以及如何处理“参数化查询未提供参数”的错误。解决方案请看第二段折叠的代码。
背景:
在项目开发的过程中,往往需要根据实体的值来修改sql语句,比如说,有一个学生类Stu,代码如下:
View Code
其中的sql语句为:
在sql语句中,同时存在查询参数Name,City,Grade和Nick,所以需要判断每一个查询参数是否为NUll,然后分别赋值,注意如果这里不判空.
代码如下:
当stu.Nick为null时,程序将报错:“参数化查询 需要参数 但未提供该参数 ”。
当stu.Grade不赋予数值时,将取C#整形数据的默认值0,同样不是理想的结果,Nick和Grade均应赋值为null,所以必须判断该字段是否为空。
于是,引入了根据实体的实际数值,动态生成sql语句的方法,Show You the Code:
如代码所示,需要判断City等字段是否为null,以及Grade字段是否为0(不合理,有待改进),来决定是否添加查询参数City或者是Grade。
以上,两种方法在字段的个数相当的时候,代码量不相上下,当实体的属性较多时,后一种明显占优。
背景:
在项目开发的过程中,往往需要根据实体的值来修改sql语句,比如说,有一个学生类Stu,代码如下:
var parameters = new List<SqlParameter>(); using (SqlConnection conn = ConnDB.CreateConn()) { conn.Open(); string str = "insert into Stu(Name,City,Grade,Nick) values(@Name,@City,@Grade,@Nick)"; if (stu.Name != null) { parameters.Add(new SqlParameter() { ParameterName = "@Name", Value = stu.Name }); } else { parameters.Add(new SqlParameter() { ParameterName = "@Name", Value = DBNull.Value }); } if (stu.City != null) { parameters.Add(new SqlParameter() { ParameterName = "@City", Value = stu.City }); } else { parameters.Add(new SqlParameter() { ParameterName = "@City", Value = DBNull.Value }); } if (stu.Nick != null) { parameters.Add(new SqlParameter() { ParameterName = "@Nick", Value = stu.Nick }); } else { parameters.Add(new SqlParameter() { ParameterName = "@Nick", Value = DBNull.Value }); } if (stu.Grade != 0) { parameters.Add(new SqlParameter() { ParameterName = "@Grade", Value = stu.Grade }); } else { parameters.Add(new SqlParameter() { ParameterName = "@Grade", Value = DBNull.Value }); } ConnDB.Excute(str, conn, parameters); }
View Code
其中的sql语句为:
insert into Stu(Name,City,Grade,Nick) values(@Name,@City,@Grade,@Nick)
在sql语句中,同时存在查询参数Name,City,Grade和Nick,所以需要判断每一个查询参数是否为NUll,然后分别赋值,注意如果这里不判空.
代码如下:
parameters.Add(new SqlParameter() { ParameterName = "@Grade", Value = stu.Grade });
当stu.Nick为null时,程序将报错:“参数化查询 需要参数 但未提供该参数 ”。
当stu.Grade不赋予数值时,将取C#整形数据的默认值0,同样不是理想的结果,Nick和Grade均应赋值为null,所以必须判断该字段是否为空。
于是,引入了根据实体的实际数值,动态生成sql语句的方法,Show You the Code:
string str = @"insert into Stu(ColumnName) values(ColumnValue)"; if (stu.Name != null) { columnName.Append(",Name"); columnValue.Append(",@Name"); parameters.Add(new SqlParameter() { ParameterName = "@Name", Value = stu.Name }); } if (stu.Nick != null) { columnName.Append(",Nick"); columnValue.Append(",@Nick"); parameters.Add(new SqlParameter() { ParameterName = "@Nick", Value = stu.Nick }); } if (stu.Grade != 0) { columnName.Append(",Grade"); columnValue.Append(",@Grade"); parameters.Add(new SqlParameter() { ParameterName = "@Grade", Value = stu.Grade }); } if (stu.City != null) { columnName.Append(",City"); columnValue.Append(",@City"); parameters.Add(new SqlParameter() { ParameterName = "@City", Value = stu.City }); } str = str.Replace("ColumnName", columnName.ToString().TrimStart(",".ToCharArray())); str = str.Replace("ColumnValue", columnValue.ToString().TrimStart(",".ToCharArray()));
如代码所示,需要判断City等字段是否为null,以及Grade字段是否为0(不合理,有待改进),来决定是否添加查询参数City或者是Grade。
以上,两种方法在字段的个数相当的时候,代码量不相上下,当实体的属性较多时,后一种明显占优。
相关文章推荐
- zencart批量更新后台邮箱地址sql
- mysql必知必会(五)
- Move System Databases in MS SQL SERVER
- 【sql】——日志表过大,整理日志表
- 【SQL】——行列转换
- (7.2.8)SQL Server 数据库定时自动备份
- 学习笔记-NoSQL
- 效率较高的Oracle数据库之间数据同步(非dblink)
- mysql yum 安装
- 报错:1130-host ... is not allowed to connect to this MySql server
- .Net路(十三)导出数据库到EXCEL
- sql web Admin 源码.net 升级
- 学习笔记-MYSQL
- SQL Server Web Admin
- Oracle查询树形结构
- web sql
- django with mysql (part-4)
- Oracle中的分页
- mysql的可重复读REPEATABLE READ隔离级别和幻读
- iOS 持久化存储之CoreData VS 直接SQlite