首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C# 对象不能从 DBNull 转换为其他类型,该怎么处理

2014-01-17 
C#对象不能从 DBNull 转换为其他类型foreach (DataRow dr in dtData.Rows)//遍历行 in 行的集合{byte[] ED

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列啊

热点排行