读书人

C# 对象不能从 DBNull 转换为其他

发布时间: 2014-01-17 00:06:00 作者: rapoo

C# 对象不能从 DBNull 转换为其他类型
foreach (DataRow dr in dtData.Rows) //遍历行 in 行的集合
{
byte[] EDS = new byte[183];
EDS[0] = 0x82; // emm table id
EDS[1] = 0x40; //
EDS[2] = 0x3f;
EDS[3] = 0x02;// emm secton length
byte[] groupid = HexStrToHexBytes(dr["Group_name"].ToString());
EDS[4] = groupid[0];
EDS[5] = groupid[1];
// emm secton length
//发送emm



string strConn = "Data Source=127.0.0.1;Initial Catalog=yz;User ID=sa;Password=sa123456";
SqlConnection ConnAcc = new SqlConnection(strConn);
string strSQL = "SELECT SGK FROM Group_SGK3 ";
SqlDataAdapter de = new SqlDataAdapter(strSQL, ConnMdb);
try
{
//da.Fill(dt);
dtData.Clear();
de.Fill(dtData);
}
catch
{
break;
}

for (int n = 0; n < 7; n++)
{
int GK;
foreach (DataRow rdr in dtData.Rows)
{



int SGK = Convert.ToInt32(rdr["SGK"]);
GK = SGK << n;


if (Convert.ToBoolean(rdr["state1"]))
{


byte[] gk = new byte[8];
Array.Copy(HexStrToHexBytes(GK.ToString()), 0, gk, 7, 1);

;
SKeyValue = SKeyValue1;
byte[] EncryptSk = EncryptDES(SKeyValue, gk);


EDS[6] = 0x01;
Array.Copy(EncryptSk, 0, EDS, 7, EncryptSk.Length);
//Thread.Sleep(5);
}
else
{



EDS[6] = 0x01;





EDS[7] = 0xff;
EDS[8] = 0xff;
for (int i = 9; i < 15; i++)
{
EDS[i] = 0x00;

}

}



if (Convert.ToBoolean(rdr["state1"]))这句话出错说“对象不能从 DBNull 转换为其他类型”,可是我的数据库不是空的呀,这是怎么回事?请高人指点!
请问下
"SELECT SGK FROM Group_SGK3 "
你这里面有“state1”列?????
sql语句中加上这一列吧
[解决办法]
state1从哪里来的?sql语句里木有啊。
[解决办法]
你没有查询这个列的数据: string strSQL = "SELECT SGK FROM Group_SGK3 ";
也许以前的DataTable里面有这个列,但是你这里重新填充该DataTable数据时使用的查询语句里面没有获取该列的数据。
[解决办法]

引用:
有一点你要特别注意,null和DBNull.value不是同一个概念,对数据表的列来说,不是null,而是DBNll.value


是这样的!

如果搞不清楚null和DBNull的区别,就会被自己给弄糊涂了。
[解决办法]
其实楼主没有领会一个关键问题 —— 数据库与C# 的类型如何正确对应?

啥意思?

bit --> bool 没有错,
但 bit 类型允许为null时, 你对应什么呢?
换句话说: 人家问你你的钢笔是否能借用一下, 但是你回复是不知道, 你要人家如何理解你的意思?

几种解决方法:
1. 在 C# 中设定为 bool? 类型, 转换时:
bool? result = rdr["state1"]==DBNull.value? null : Convert.ToBoolean(rdr["state1"]);

2. 在sql语句中设定isnull的情况:
例 "SELECT isnull(SGK,0) SGK FROM Group_SGK3"

3. 将表中字段SGK改为非空(not null)即可

[解决办法]
楼主,DBNull是C#中的,你可以给这个数据一个默认值,它就不会报这样的错了
[解决办法]
你数据库里面有,但你没读出来啊!你的SQL语句只读取了SGK列啊

读书人网 >C#

热点推荐