一般来说,在C#对数据库程序设计时变量的类型要和数据库中的字段类型相对应,即需要做变量的数据类型与字段的数据类型映射(数据库中的数据类型和c#的数据类型的映射表),例如string类型对应与Varchar(char)类型。 但是对于数据库中的Bit类型,就无法使用C#中的Boolean值进行对应,原因是Bit型会有三种状态(0,1,null)而Boolean型只能是(True,False),非真即假的状态让Boolean类型无法与数据库中的null对应起来,所以在使用Bit类型转换成C#类型是就需要使用自定义的“三值逻辑”,也就是自己设定一个struct类型。 所以,以下是笔者在晚上找到并略微修改的实现“三值逻辑运算”的C#代码,该代码实现了三种状态(DBNull,False,True),和网上相关代码不同是将DBNull的值设为-1,而将False的值设置成0.笔者认为这样更符合数据库中Bit类型存储的规律。在数据库操作语句的时候:0代表False,1代表True,这更符合Bit类型在数据库中的值的存储方式。 以下是代码部分: Code 1using System; 2using System.Collections.Generic; 3using System.Text; 4 5namespace Chemmu.Dev.BaseTools 6{ 7 public struct dbbool 8 { 9 //与数据库中Bit类型对应的三种状态 10 public static readonly dbbool Null = new dbbool(-1); 11 public static readonly dbbool False = new dbbool(0); 12 public static readonly dbbool True = new dbbool(1); 13 public sbyte value; 14 15 初始化#region 初始化 16 private dbbool(int value) 17 { 18 this.value = (sbyte)value; 19 } 20 21 public dbbool(bool value) 22 { 23 this.value = (value ? (sbyte)1 : (sbyte)0); 24 } 25 26 public dbbool(DBNull value) 27 { 28 this.value = (sbyte)-1; 29 } 30 31 public dbbool(object value) 32 { 33 if (value == null) 34 { 35 throw new ArgumentException("the value must in true, false or dbnull!"); 36 } 37 if (value.GetType() == typeof(bool)) 38 { 39 this.value = ((bool)value ? (sbyte)1 : (sbyte)0); 40 return; 41 } 42 if (value.GetType() == typeof(DBNull)) 43 { 44 this.value = (sbyte)-1; 45 return; 46 } 47 throw new ArgumentException("the value must in true, false or dbnull!"); 48 } 49 #endregion 50 51 /**//// <summary> 52 /// 显示类型转换 53 /// </summary> 54 /// <param name="value"></param> 55 /// <returns></returns> 56 public static dbbool Prase(string value) 57 { 58 switch (value) 59 { 60 case "True": 61 return true; 62 case "False": 63 return false; 64 case "Null": 65 return null; 66 default: 67 throw new ArgumentException("The value must in \"True\", \"False\" or \"Null\"!"); 68 } 69 } 70 71 /**//// <summary> 72 /// 判断是否为空 73 /// </summary> 74 public bool IsNull { get { return value == -1; } } 75 /**//// <summary> 76 /// 判断是否为True 77 /// </summary> 78 public bool IsTrue { get { return value == 1; } } 79 /**//// <summary> 80 /// 判断是否为False 81 /// </summary> 82 public bool IsFalse { get { return value == 0; } } 83 84 dbbool类型与bool、DBNull类型之间的转换#region dbbool类型与bool、DBNull类型之间的转换 85 public static implicit operator dbbool(bool x) 86 { 87 return x ? True : False; 88 } 89 90 public static implicit operator dbbool(DBNull x) 91 { 92 return Null; 93 } 94 95 public static explicit operator bool(dbbool x) 96 { 97 if (x.value == -1) throw new InvalidOperationException(); 98 return x.value > 0; 99 } 100 101 public static explicit operator DBNull(dbbool x) 102 { 103 if (x.value != -1) throw new InvalidOperationException(); 104 return DBNull.Value; 105 } 106 #endregion 107 108 逻辑运算#region 逻辑运算 109 public static dbbool operator ==(dbbool x, dbbool y) 110 { 111 if (x.value == 0 || y.value == 0) return Null; 112 return x.value == y.value ? True : False; 113 } 114 115 public static dbbool operator !=(dbbool x, dbbool y) 116 { 117 if (x.value == 0 || y.value == 0) return Null; 118 return x.value != y.value ? True : False; 119 } 120 121 public static dbbool operator !(dbbool x) 122 { 123 if (x.value == 0) 124 return new dbbool(x.value + 1); 125 if (x.value == 1) 126 return new dbbool(x.value - 1); 127 return new dbbool(x.value); 128 } 129 #endregion 130 131 public override bool Equals(object obj) 132 { 133 return base.Equals(obj); 134 } 135 136 public override int GetHashCode() 137 { 138 return this.value; 139 } 140 141 public override string ToString() 142 { 143 if (value > 0) return "True"; 144 if (value < 0) return "False"; 145 return "Null"; 146 } 147 } 148} 当然,可以根据该算法的基础上增加工厂模式,并扩展出比如“四值逻辑元素”等。