在公司调试挺好的。
现在人在现场,没有编程环境,不清楚到底是那地方出错了,求高手帮忙分析下代码,看在哪地方加点什么东西能过关。
万分感激
SqlConnection connection = new SqlConnection(connnectionString);                string sql = "select top 1 DatapointID from DatapointValue2 order by LastModified desc";                SqlCommand cmdDatapointID = new SqlCommand(sql, connection);// 定义Command对象                connection.Open();
                object a = cmdDatapointID.ExecuteScalar();
                connection.Close();
                int ab = Convert.ToInt32(a);                /*___________________________________________取PropID值______________________________________*/
                SqlConnection connectionPropID = new SqlConnection(connnectionString);                string sqlPropID = "select top 1 PropID from DatapointValue2 order by LastModified desc";                SqlCommand cmdPropID = new SqlCommand(sqlPropID, connectionPropID);// 定义Command对象                connectionPropID.Open();
                object objCmdPropID = cmdPropID.ExecuteScalar();
                connectionPropID.Close();
                int propID = Convert.ToInt32(objCmdPropID);
                /****************************************根据DatapointID取出时间********************************************/
                OdbcConnection connection2 = new OdbcConnection(connnectionString2);                string sql2 = "select LastModified from DBA.DatapointValue where DatapointID=" + ab + "and PropID=" + propID;                OdbcCommand cmd3 = new OdbcCommand(sql2, connection2);// 定义Command对象                connection2.Open();
                object abc = cmd3.ExecuteScalar();
                connection2.Close();
                double abcd = Convert.ToDouble(abc);                /*******************************************Sybase数据库中的表数据迁移到Server中**********************************************/
                OdbcConnection conn1 = new OdbcConnection();
                SqlConnection conn2 = new SqlConnection();
                OdbcCommand cmd1 = new OdbcCommand();
                SqlCommand cmd2 = new SqlCommand();
                System.Data.Odbc.OdbcDataReader dr;
                conn1.ConnectionString = connnectionString2;
                conn2.ConnectionString = connnectionString;                cmd1.Connection = conn1;
                cmd2.Connection = conn2;
                cmd1.CommandText = "SELECT DatapointID,Value,Persist,PropID,LastModified FROM DBA.DatapointValue where LastModified >" + abcd;
                conn1.Open();
                dr = cmd1.ExecuteReader();
                conn2.Open();
                while (dr.Read())
                {
                    string insertString = "INSERT INTO DatapointValue2(DatapointID,Value,Persist,PropID,LastModified) VALUES ('{0}','{1}','{2}','{3}','{4}')";
                    insertString = string.Format(insertString, dr[0], dr[1], dr[2], dr[3], dr[4]);                    cmd2.CommandText = insertString;
                    cmd2.ExecuteNonQuery();
                }
                dr.Close();
                conn1.Close();
                conn2.Close();                label2.Text = "第" + i + "次传递成功!3分钟后再次传递...";
                i = i + 1;
                btn_Stop.Enabled = true;

解决方案 »

  1.   

    看一下abc 有可能为空值倒是类型装换失败,转换前判一下abc 是否为null
      

  2.   

    根据提示,应该是从数据库查询出来的一个对象为空,在转换的时候出错有可能是:int ab = Convert.ToInt32(a);
    也有可能是 int propID = Convert.ToInt32(objCmdPropID);没有环境,就自己模拟条件在sql里查询一下吧
      

  3.   

    Convert对象先判断一下取得的是不是Null
      

  4.   

    看看在哪一行出错的,判断从数据库取出来的值是否为DBNull.Value,如果为DBNull.Value则进行相应处理,否则继续。
      

  5.   

    临时凑的话,Null的话就设定个0之类的值
      

  6.   

    可以直接修改sql 语句用 isnull()
      

  7.   

    top 1 DatapointID =>top 1 isnull(DatapointID,0) DatapointID
      

  8.   

    我用这种方式试试,我电脑带了 但是用自己电脑读不到数据 一步一步排除 SqlConnection connection = new SqlConnection(connnectionString);                string sql = "select top 1 DatapointID from DatapointValue2 order by LastModified desc";                SqlCommand cmdDatapointID = new SqlCommand(sql, connection);// 定义Command对象                connection.Open();
                    object a = cmdDatapointID.ExecuteScalar();
                    connection.Close();
                    MessageBox.Show("1111111");
                    int ab = Convert.ToInt32(a);
                    MessageBox.Show("2222222");
                    /*___________________________________________取PropID值______________________________________*/
                    SqlConnection connectionPropID = new SqlConnection(connnectionString);                string sqlPropID = "select top 1 PropID from DatapointValue2 order by LastModified desc";                SqlCommand cmdPropID = new SqlCommand(sqlPropID, connectionPropID);// 定义Command对象                connectionPropID.Open();
                    object objCmdPropID = cmdPropID.ExecuteScalar();
                    connectionPropID.Close();                MessageBox.Show("33333");                int propID = Convert.ToInt32(objCmdPropID);                MessageBox.Show("44444");
      

  9.   

    从数据库中读取的所有数据,在转换之前均加上是否为DBNULL判断即可。
      

  10.   


                 MessageBox.Show("44444");
                    /****************************************根据DatapointID取出时间********************************************/
                    OdbcConnection connection2 = new OdbcConnection(connnectionString2);                string sql2 = "select LastModified from DBA.DatapointValue where DatapointID=" + ab + "and PropID=" + propID;                OdbcCommand cmd3 = new OdbcCommand(sql2, connection2);// 定义Command对象                connection2.Open();
                    object abc = cmd3.ExecuteScalar();
                    connection2.Close();
              
                    double abcd = Convert.ToDouble(abc);
                    MessageBox.Show("55555");知道位置了..
    MessageBox.Show("44444");显示出来了 
    MessageBox.Show("55555");没有显示
    应该是一楼说的abc转换的问题,这地方应该怎么修改。
      

  11.   

    LastModified =>isnull(LastModified,0) LastModified 就是你的sql 语句没有查到内容
      

  12.   

    string sql2 = "select LastModified from DBA.DatapointValue where DatapointID=" + ab + "and PropID=" + propID;                OdbcCommand cmd3 = new OdbcCommand(sql2, connection2);// 定义Command对象                connection2.Open();
                    object abc = cmd3.ExecuteScalar();
                    connection2.Close();
                    double abcd = Convert.ToDouble(abc);--------------------------------------------------------------
    你的sql 语句返回的是空的结果集但你使用的是 ExecuteScalar 读取,自然就是DBNull而DBNull 是不能转换为.net 的基础类型的你可以判断 cmd3.ExecuteScalar() 是否等于DBNull 也可以使用 sql 的isnull 函数 ,当指定表达式为null 时(sql),设置为一个指定的值
      

  13.   

    double abcd;
    if(abc!=null && abc!=System.DBNull.Value)
       abcd=Convert.ToDouble(abc);
      

  14.   

    判断一下,判断 if(!abc.GetType().Equals(typeof(System.DBNull)))
      

  15.   

    isnull(LastModified,0) LastModified
      

  16.   

    设置可空类型Nullable ??
    object o; 
    int? i;  
    i=(o is System.DBNull)? null:(int)o;  
      

  17.   

    这个问题正好暴露了程序本身的一个逻辑错误,修改了逻辑错误以及加上了DBNull的判断。
    感谢各位回帖!!学习了!!
    水平有限,给分不对的地方请多多包含。