如何根据实体动态生成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语句,方法如下: ...
随机推荐
- Hexo搭建博客教程(3) - 远程部署到GitHub Pages
本章讲的是如何将本地的个人项目远程部署到 GitHub Pages,涉及到GitHub的项目仓库.Git的使用,以及Hexo的远程部署等. 1. 安装 hexo-deployer-git 插件 想要将 ...
- Centos 内存释放
原因:最近发现服务器老师提示内存不足的警报,很多时候内存都占用百分之80以上,查看运行的服务似乎并没有占用很大的内存,top查看运行的服务,然后按shift+m排名第一的才百分之1.x,看了别人的博客 ...
- macos php安装扩展sqlsrv连接sqlserver
Install the PHP Drivers for SQL Serve sudo pecl install pdo_sqlsrv sudo pecl install sqlsrv 微软官方文档 ...
- 设置Linux环境变量的方法和区别_Ubuntu/CentOS
设置 Linux 环境变量可以通过 export 实现,也可以通过修改几个文件来实现,有必要弄清楚这两种方法以及这几个文件的区别. 通过文件设置 Linux 环境变量 首先是设置全局环境变量,对所有用 ...
- compose 函数实现
总结componse函数实现过程 大致特点 参数均为函数, 返回值也是函数 第一函数接受参数, 其他函数接受的上一个函数的返回值 第一个函数的参数是多元的, 其他函数的一元的 自右向左执行 简单实现 ...
- 基于node 搭建http2服务
1.准备工作:安装node2.安装http2: npm install http2 -g安装完成后,在安装目录中appData/Roaming>npm>node_modules>ht ...
- Linux 命令与学习
2014-10-10 ps -ef|grep *** 可以查找包含***名称的进程 netstat -ntlp 查看端口占用 kill -9 pid 强制杀死进程 ...
- servlet基础概念
一.servlet是什么? 运行在Web服务器上(如:tomcat),作为浏览器请求与数据库或其他应用程序之间的中间层 二.servlet主要任务: 1.读取浏览器发送的显式数据(如:html表单)隐 ...
- azkaban-web-start.sh启动时出现Table 'execution_flows' is marked as crashed and should be repaired Query错误的解决办法(图文详解)
问题详情 [hadoop@master bin]$ ./azkaban-web-start.sh Using Hadoop Using Hive from /home/hadoop/app/hive ...
- AJPFX关于一维数组的声明与初始化
一维数组:可以理解为一列多行.类型相同的数据,其中每个数据被称为数组元素:一维数组的声明方式: type varName[]; 或 type[] varName;(推荐) ...