• ADO.net 更新和插入数据 遇到null 执行不成功


    首先交代下背景,遇到一个问题:SqlCommand新增记录时,参数为null时,运行并不报错,只是返回(0),也就是更新失败。

    在用C#往数据库里面插入记录的时候, 可能有的字段我们并不赋值(有可能是无意识的情况,比如前面代码返回时间类型结果为NULL),那么这个字段的值就为null,一般情况下,参数会被数据库接受, 然后在数 据表的字段里面显示为NUll, 实际上这就牵扯到一个类型的

    问题, C#中的NUll与SQL中的null是不一样的, SQL中的null用C#表示出来就 是DBNull.Value, 所以在进行Insert的时候要注意的地方。

    摘引下MSDN:

    在.NET中,DBNull 类表示一个不存在的值。例如,在数据库的表中,某一行的某列中可能不包含任何数据。即,该列被视为根本不存在,而不只是没有值。一个表示不存在的列的 DBNull 对象。此外,COM 互操作使用 DBNull 类来区分 VT_NULL 变量(指示不存在

    的值)和 VT_EMPTY 变量(指示未指定的值)。

    DBNull 类型是一个单独的类,这意味着只有一个 DBNull 对象存在。DBNull.Value 成员表示唯一的 DBNull 对象。DBNull.Value 可用于将不存在的值显式分配给数据库字段,但大多数 ADO.NET 数据提供程序在字段没有有效值时会自动分配 DBNull 值。您可以通

    过将从数据库字段检索到的值传递给 DBNull.Value.Equals 方法,确定该字段值是否为 DBNull 值。然而,有些语言和数据库对象提供一些方法,可以更容易地确定数据库字段值是否为 DBNull.Value


    举个例子:

    SqlCommand cmd=new  SqlCommand("Insert into Student values(@name,@birth)" ,conn);
    cmd.parameters.add("@name" ,name);
    cmd.parameters.add("@birth" ,birth);
    cmd.ExecuteNonQuery();

    这段代码看着、编译都不会报错,但是如果是birth的值在.net中为null,则执行不成功。


    解决办法一:

     public static object  SqParameterVlidatelNull(object  obj)
            {
                if  (obj == null )
                    return  DBNull.Value;
                return  obj;
            }
    cmd.parameters.add("@name" ,SqParameterVlidatelNull(name));
    cmd.parameters.add(
    "@birth" ,SqParameterVlidatelNull(birth));
    cmd.ExecuteNonQuery();

    直接对参数进行验null值,如果为null,则返回DBNull.Value(如msdn描述的那个,返回一个不存在的值)。

    解决方法二:

    代码方面:更新和插入时,以对象的形式操作(因为操作时必须先实例化,可以在类的构造函数中加入初始值);

    数据表方面:在设计数据库时,加入默认约束(这样可以避免很多代码方面的低级错误)
          

  • 相关阅读:
    ubuntu
    什么是守护进程?
    Redis 简介
    什么是原子性,什么是原子性操作?
    什么是BSD协议?
    查看内存
    数据库备份与还原
    PostgreSQL 判断字符串包含的几种方法
    SQL 基础
    手风琴-过渡效果,显示隐藏列表案例
  • 原文地址:https://www.cnblogs.com/ericli-ericli/p/5894182.html
Copyright © 2020-2023  润新知