C#z中关于存取数据库NULL和0的问题

需求: 注册用户的时候,对于年龄,地址,姓名等字段如果客户不想填写,这说明这些字段的值是“不知道”,

但是,如果按照一般的观点,存入数据库的则是0,或者“ ”空,这是不符合要求的,因此,需要存入数据库的应该是null

此时,需要DbNull的用法

//存储数据的时候这样使用
//获取控件输入的字符
string name = txtName.Text;
string age = txtAge.Text;
string height = txtHeight.Text;
//如果没用户没有输入姓名,则Text属性为空字符串
object objName;
if(name.Length<=0)
{
    objName = DBNull.Value;//DBNull.Value用来表示数据库中的值
}
else
{
    objName = name;
}
object objAge;
if(age.Length<=0)
{
    objAge = DBNull.Value;
}
else
{
    objAge = age;
}
//读取数据的时候这样使用
DataRow row = table.Rows[0];
string name;
if(row["Name"]==DBNull.Value)
{
    name=null;
}
else
{
    name = (string)row["Name"];
}
int? age;//int age 不行,因为int不可以为null,加?号,表示一个可空的int类型
if(row["Age"]==DBNull.Value)
{
    age = null;
}
else
{
    age = (int)row["Age"];
}
int Height = (int)row["Height"];

微软MSDN的解释如下:

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

DBNull 类型是一个单独的类,这意味着只有一个 DBNull 对象存在。 DBNull.Value 成员表示单独的 DBNull 对象。DBNull.Value 可用于将不存在的值显式分配给数据库字段,但大多数 ADO.NET 数据提供程序在字段没有有效值时会自动分配 DBNull 值。 您可以通过将从数据库字段检索到的值传递给 DBNull.Value.Equals 方法,确定该字段值是否为 DBNull 值。 然而,有些语言和数据库对象提供一些方法,可以更容易地确定数据库字段值是否为DBNull.Value。 这些方法包括 Visual Basic 的 IsDBNull 函数、Convert.IsDBNull 方法、DataTableReader.IsDBNull 方法和 IDataRecord.IsDBNull 方法。

请勿将面向对象的编程语言中的 null 概念与 DBNull 对象混淆。 在面向对象的编程语言中,null 表示缺少对象的引用。 DBNull 表示未初始化的变量或不存在的数据库列。

时间: 2025-01-08 01:06:13

C#z中关于存取数据库NULL和0的问题的相关文章

在js中if条件为null/undefined/0/NaN/&quot;&quot;表达式时,统统被解释为false,此外均为true哦。。。(官方原文如下:)

Boolean 表达式 一个值为 true 或者 false 的表达式.如果需要,非 Boolean 表达式也可以被转换为 Boolean 值,但是要遵循下列规则: 所有的对象都被当作 true. 当且仅当字符串为空时,该字符串被当作 false. null 和 undefined 被当作 false. 当且仅当数字为零时,该数字被当作 false. 原文地址:https://www.cnblogs.com/wangchufang/p/9208213.html

[.NET 4.5] ADO.NET / ASP.NET 使用 Async 和 Await 异步 存取数据库

此为文章备份,原文出处(我的网站)  [.NET 4.5] ADO.NET / ASP.NET 使用 Async 和 Await 异步 存取数据库 http://www.dotblogs.com.tw/mis2000lab/archive/2014/05/08/ado.net4.5_async_await_20140508.aspx 以前的ADO.NET也能作  "异步"(Async,大陆说法:异步),可以参考 KKBruce 2009/11月的文章: SQLCOMMAND的异步行程

Go语言中使用MySql数据库

Go语言中使用MySql数据库 1.MySQL驱动 Go中支持MySQL的驱动目前比较多,有如下几种,有些是支持database/sql标准,而有些是采用了自己的实现接口,常用的有如下几种: https://github.com/Go-SQL-Driver/MySQL 支持database/sql,全部采用go写. https://github.com/ziutek/mymysql 支持database/sql,也支持自定义的接口,全部采用go写. https://github.com/Phil

Go语言中使用SQLite数据库

Go语言中使用SQLite数据库 1.驱动 Go支持sqlite的驱动也比较多,但是好多都是不支持database/sql接口的 https://github.com/mattn/go-sqlite3 支持database/sql接口,基于cgo(关于cgo的知识请参看官方文档或者本书后面的章节)写的 https://github.com/feyeleanor/gosqlite3 不支持database/sql接口,基于cgo写的 https://github.com/phf/go-sqlite

在Cocos2d-x中使用SQLlite数据库

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了.它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl.C#.PHP.Java等,还有ODBC接口' 在Cocos2d-X中使用SQLlite数据库 首先下载SQLlite数据库,SQLlite数据库的下载地址:http://download.

Android中使用Sqlite数据库 (一) 建表

一.实现一个类,继承SQLiteOpenHelper类,并实现构造函数,onCreate()  onUpgrade() import android.content.Context; import android.database.DatabaseErrorHandler; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; impo

Android中使用Sqlite数据库 (二) 增删改查

定义接口 package com.example.android_db.service; import java.util.List; import java.util.Map; public interface PersonService { public boolean addPerson(Object[] params); public boolean deletePerson(Object[] params); public boolean updatePerson(Object[] p

PostgreSQL介绍以及如何开发框架中使用PostgreSQL数据库

最近准备下PostgreSQL数据库开发的相关知识,本文把总结的PPT内容通过博客记录分享,本随笔的主要内容是介绍PostgreSQL数据库的基础信息,以及如何在我们的开发框架中使用PostgreSQL数据库,希望大家多多提意见. 1.PostgreSQL数据库介绍 PostgreSQL是以加州大学伯克利分校计算机系开发的 POSTGRES,现在已经更名为PostgreSQL.它具有很多不错的特点: 开源:PostgreSQL 是一个自由的对象-关系数据库服务器(数据库管理系统),它在灵活的 B

Winform开发框架中实现多种数据库类型切换以及分拆数据库的支持 - 伍华聪

在很多应用系统里面,虽然一般采用一种数据库运行,但是由于各种情况的需要,可能业务系统会部署在不同类型的数据库上,如果开发的系统能够很方便支持多种数据库的切换,那可以为我们减少很多烦恼,同时提高系统的适应性和强壮型.还有一种情况,由于业务数据库的不断膨胀或者方便数据库的切割隔离,有时候也会把不同的业务数据库进行分拆,如权限提供数据库,客户关系管理数据库,工作流程数据库,企业营运数据库等等,因此在一个系统里面,同时使用2个或者以上的数据库的情况也是有的.针对这两种情况,本文介绍在我的Winform开