该文章同时解决了,如何向数据库中添加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语句的更多相关文章

  1. 模拟Hibernate动态生成SQL语句

    这里有一个xml配置文件,也就是Hibernate框架中会用到的POJO和数据库的映射文件 <?xml version="1.0" encoding="utf-8& ...

  2. Java代码实体类生成SQL语句(Java实体类转数据库)

    有的时候把数据库删了,如果照着实体类重新创建数据库的话比较麻烦,可以使用这个工具,把代码复制到项目里面设置一下即可把Java代码中的实体类转换为SQL语句输出为一个文件,打开执行命令即可. 下载:ht ...

  3. 利用反射生成SQL语句

    // 修改学员信息的方法 public bool ModifyStudent(MODEL.Students model) { // 利用反映获取类对所有属性,用来动态生成SQL语句 StringBui ...

  4. 反射生成SQL语句入门

    今天我们来学习学习通过反射技术来生成SQL语句. 反射提供了封装程序集.模块和类型的对象.您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型.然后,可以调用类型的方法或访 ...

  5. mybatis使用注解替代xml配置,动态生成Sql

    mybatis使用注解替代xml配置时,遇到判断条件是否为null或者为空时,@Select很难搞定,不知道怎么办? mybatis3中增加了使用注解来配置Mapper的新特性,使用 SelectPr ...

  6. 利用反射自动生成SQL语句(仿Linq)

    转:http://www.cnblogs.com/the7stroke/archive/2012/04/22/2465597.html using System; using System.Colle ...

  7. 根据excel表格字段生成sql语句

    根据excel表格字段生成sql语句 1.1 前言 根据excel表格字段生成sql语句主要是利用了excel的拼接函数 CONCATENATE .该实例主要以mysql脚本支持.实例需求如下:exc ...

  8. 4、注解反射生成SQL语句

    .任务说明         ①有一张用户表,字段包括:用户ID.用户名.昵称.年龄.性别.所在城市.邮箱.手机号:         ②使用java注解来对用户表的每个字段或字段的组合条件进行动态生成S ...

  9. Excel表格生成sql语句

    假如excel表格中有A.B.C三列数据,希望导入到数据库users表中,对应的字段分别是name,sex,age ,在你的excel表格中增加一列,利用excel的公式自动生成sql语句,方法如下: ...

随机推荐

  1. 4-redis数据过期策略

    1 基本 redis也许只是用来存放临时数据.比如股市行情.游戏中一个持续一个月的活动等,都属于缓存数据,过了一段就没用了.如果没有过期策略,就会有大量垃圾数据在内存中堆积. 2 TTL time t ...

  2. 连接php/mysql

    1 安装php5.6 首先确保mysql已安装 ./configure --prefix=/app/php-5.6.36 --with-mysql=mysqlnd --enable-mysqlnd - ...

  3. UWP 页面跳转传值

    如果涉及到页面跳转,一般用Frame这个控件来管理不同的页面. <Grid Name="RootGrid"> <Frame Name="RootFram ...

  4. Social Net ZOJ - 3649

    Social Net ZOJ - 3649 题意: 反正原题题意我是看不懂... 参考:http://www.cnblogs.com/names-yc/p/4922867.html 给出一幅图,求最大 ...

  5. DFS/并查集 Codeforces Round #286 (Div. 2) B - Mr. Kitayuta's Colorful Graph

    题目传送门 /* 题意:两点之间有不同颜色的线连通,问两点间单一颜色连通的路径有几条 DFS:暴力每个颜色,以u走到v为结束标志,累加条数 注意:无向图 */ #include <cstdio& ...

  6. 【LeetCode 337 & 329. memorization DFS】House Robber III

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...

  7. [转]C#综合揭秘——细说多线程(上)

    引言 本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发. 其中委托的BeginInvoke方法以及回调函数最为常用. 而 I/O线程 ...

  8. 定时器、线程queue、进程池和线程池

    1.定时器 指定n秒后,执行任务 from threading import Timer,current_thread import os def hello(): print("%s he ...

  9. 总结这几天学到的HTML标签

    1.基础知识W3S,操作慕课网或者FCC网 2.标签必须闭合 标签一般成对出现如:<h1>xxxx</h1> 标签也有空内容标签如:<br/> 标签的属性和属性值放 ...

  10. 如何开发 Laravel 扩展包并发布到 Composer

    如何开发 Laravel 扩展包并发布到 Composer  发布于 2019-01-22 cxp1539  1074 Vie   开发扩展包 我们来做一个根据第一个字符或者汉字生成头像的larave ...