如何根据实体动态生成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语句,方法如下: ...
随机推荐
- 移动端rem.js的使用方法
下面的代码一是我根据rem的使用经验,自己写的一个rem.js,发现很好用,能适用所有移动端h5页面的自适应需求: 代码一: window.onload = function(){ /*720代表设计 ...
- Codeforces Round #321 (Div. 2) A, B, C, D, E
580A. Kefa and First Steps 题目链接: A. Kefa and First Steps 题意描述: 给出一个序列,求最长不降连续子序列多长? 解题思路: 水题,签到 代码: ...
- [WOJ1583]向右看齐
题目链接: WOJ1583 题目分析: 大水题--我就来水个题解 倒序扫,单调栈维护单减序列,每个对象的答案是栈里它下面那个元素 代码: #include<bits/stdc++.h> # ...
- D. Taxes 哥德巴赫猜想
http://codeforces.com/contest/735/problem/D 这题其实我还不是很懂,那个只是猜想,然而却用了. 只想说说找到第一小于n的素数这种思路是不行的. 121 = 1 ...
- 01_C++学习笔记_入门
1.float类型只能表示数字里面的前6位或者前7位.也就是说c++只能保证float类型的数字的前6位是正确的.如果要求的精度更高的话,请使用double和long double. float精度是 ...
- Web API性能优化(一)压缩
简单的应用场景:分页获取日志JSON信息. 很简单的实现,简单的记录一下 未压缩时候 使用PostMan请求http://localhost:34390/api/gpm/syslog/page?pag ...
- python工具之myql数据库操作
import pymysql import config ''' 1.0 简单封装 1.1 添加了insert_id属性,返回insert时返回的主键 1.2 添加了column属性,返回查询的col ...
- mysql索引原理及创建与查询
索引介绍 一:为什么要有索引 索引是用来优化查询效率(速度)的 没有索引的话,对于大数据的表,就只能每次都遍历一遍,数据量越大,耗时越多有索引的话,可以提升好几个数量级的速度 一般的应用系统,读写比例 ...
- 在vscode中显示空格和tab符号
转自:https://blog.csdn.net/bmzk123/article/details/86501706 使用python时最烦人的就是代码对齐,而且tab和空格还不一样,为了便于对其,希望 ...
- ubuntu下安装apcu扩展
apcu前身是apc,apc分为系统缓存和用户缓存 1.系统缓存是指PHP执行时增加缓存,减少PHP文件的反复检查和编译,从而达到系统加速的目的. 2.用户缓存是指,PHP代码中将数据写入缓存,是用户 ...