如何根据实体动态生成sql语句
该文章同时解决了,如何向数据库中添加Null值,以及如何处理“参数化查询未提供参数”的错误。解决方案请看第二段折叠的代码。
背景:
在项目开发的过程中,往往需要根据实体的值来修改sql语句,比如说,有一个学生类Stu,代码如下:
public class Student
{
public int ID { get; set; }
public string Name { get; set; }
public int Grade { get; set; }
public string Nick { get; set; }
public string City { get; set; }
}
添加一条学生记录到数据表中,有时,只能够获取到部分学生信息,如:不知道学生SharpL的Grade信息,代码如下:
Student stu = new Student();
stu.Name = "SL3";
stu.City = "扬州";
操作语句如下:
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 != )
{
parameters.Add(new SqlParameter() { ParameterName = "@Grade", Value = stu.Grade });
}
else
{
parameters.Add(new SqlParameter() { ParameterName = "@Grade", Value = DBNull.Value });
}
ConnDB.Excute(str, conn, parameters);
}
其中的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 != )
{
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。
以上,两种方法在字段的个数相当的时候,代码量不相上下,当实体的属性较多时,后一种明显占优。
如何根据实体动态生成sql语句的更多相关文章
- 模拟Hibernate动态生成SQL语句
这里有一个xml配置文件,也就是Hibernate框架中会用到的POJO和数据库的映射文件 <?xml version="1.0" encoding="utf-8& ...
- Java代码实体类生成SQL语句(Java实体类转数据库)
有的时候把数据库删了,如果照着实体类重新创建数据库的话比较麻烦,可以使用这个工具,把代码复制到项目里面设置一下即可把Java代码中的实体类转换为SQL语句输出为一个文件,打开执行命令即可. 下载:ht ...
- 利用反射生成SQL语句
// 修改学员信息的方法 public bool ModifyStudent(MODEL.Students model) { // 利用反映获取类对所有属性,用来动态生成SQL语句 StringBui ...
- 反射生成SQL语句入门
今天我们来学习学习通过反射技术来生成SQL语句. 反射提供了封装程序集.模块和类型的对象.您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型.然后,可以调用类型的方法或访 ...
- mybatis使用注解替代xml配置,动态生成Sql
mybatis使用注解替代xml配置时,遇到判断条件是否为null或者为空时,@Select很难搞定,不知道怎么办? mybatis3中增加了使用注解来配置Mapper的新特性,使用 SelectPr ...
- 利用反射自动生成SQL语句(仿Linq)
转:http://www.cnblogs.com/the7stroke/archive/2012/04/22/2465597.html using System; using System.Colle ...
- 根据excel表格字段生成sql语句
根据excel表格字段生成sql语句 1.1 前言 根据excel表格字段生成sql语句主要是利用了excel的拼接函数 CONCATENATE .该实例主要以mysql脚本支持.实例需求如下:exc ...
- 4、注解反射生成SQL语句
.任务说明 ①有一张用户表,字段包括:用户ID.用户名.昵称.年龄.性别.所在城市.邮箱.手机号: ②使用java注解来对用户表的每个字段或字段的组合条件进行动态生成S ...
- Excel表格生成sql语句
假如excel表格中有A.B.C三列数据,希望导入到数据库users表中,对应的字段分别是name,sex,age ,在你的excel表格中增加一列,利用excel的公式自动生成sql语句,方法如下: ...
随机推荐
- hdu1232 畅通工程 基础并查集
#include <cstdio> #include <cstring> #include <algorithm> #include <cstdlib> ...
- kettle 导入xml 资源文件
Repository | ExploreRight click the root node of the repositorySelect Import objects from an XML fil ...
- Codeforces 1144G(dp)
据说这题是种dp的套路?然后被我国红名神仙(南大Roundgod)贪心了,不过思路上非常相近了,故而可贪吧. 设的dp[i][0]是:如果把第i个数放在上升序列里了,那么下降序列结尾的那个最大是多少: ...
- JSP报错The value for the useBean class attribute *** is invalid.
环境:IDEA+Tomcat9+JDK1.8 在前期学习时,环境一直能够"正常"使用,实际上环境并没有完全搭建成功. 推荐: https://blog.csdn.net/lw_po ...
- laravel中的队列
Laravel 队列为不同的后台队列服务提供统一的 API,可使用多种驱动,eg:mysql,redis,Beanstalkd等,驱动已经封装,不需要管理这些驱动,只需要修改配置就可以更改驱动,在驱动 ...
- ssm框架搭建(下) 简单案例
前言 这段时间没有更新博客,一直想做一个基于ssm的简单的项目.经过多次的尝试,终于实现了简单的增删查改功能了. 正文 由于前端的技术不是很熟悉,经过多方的查阅,使用了bootstrap的样式,来使界 ...
- Linux OpenGL 实践篇-9 模型
之前一直渲染箱子,显得有点单调.这一次我们绘制一个用艺术家事先用建模工具创建的模型. 本次实践参考:https://learnopengl-cn.github.io/03%20Model%20Load ...
- 网新恩普(T 面试)
1.你们项目中哪里用到了Redis? 2.介绍一下你的这个微服务项目
- 查看python关键字
打开命令窗口 输入python-——help()——keywords
- Linux 常用命令:解压缩
目录 Linux 常用命令:解压缩 说明 tar 涉及参数说明: 压缩 解压 zip压缩 涉及参数说明: uzip解压 涉及参数说明: gzip 涉及参数说明: 压缩率比较 Linux 常用命令:解压 ...