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的区别,就会被自己给弄糊涂了。
[解决办法]
其实楼主没有领会一个关键问题 —— 数据库与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列啊