DataAccess DA = new DataAccess();
SqlConnection Conn = DA.getConn();        //连接数据库
 //把“日记”界面上的相应控件与数据库绑定 ArrayList arr=new ArrayList();
string sql="select 标题,dy_pkid  from ta_diary";
SqlCommand myCommand = new SqlCommand(sql,Conn);
try
{
SqlDataReader myReader = myCommand.ExecuteReader();
while (myReader.Read())       
    arr.Add(myReader.GetString(0));
return arr;
}
finally 
{
Conn.Close();             //释放资源
}
为什么如果我要返回的是myReader.GetString(1)系统却提示说“类型转换无效”,其中dy_pkid类型为int!我改成“ arr.Add(myReader.Getint16(1));
”也是不行!这是为什么?

解决方案 »

  1.   

    arr.Add(myReader.GetInt32(1));
    如果有空值的话
    arr.Add(myReader.IsDBNull(1)?0:myReader.GetInt32(1));
      

  2.   

    表中的dy_pkid列设置为:标识;也就不会有空行(类型为int),
    可是改成“arr.Add(myReader.GetInt32(1));”还是老问题“类型转换无效”但是如果myReader检索的是字符类型就可以,而int类型就报错!
      

  3.   

    给arr.Add(myReader.GetInt32(1));设个断点,看看是不是这步出的错,
    另外给给出的不是全部代码,所以没法确定原因(至少要给全这个函数的全部代码,因为现在看出不这个函数中try块失败后,返回的值是什么,而且你已经放弃了错误捕获,你从哪得来的"类型转换无效"这条信息)
      

  4.   

    错误捕捉,还没开始学,先放着以后写,错误是运行后,C#自己跳出来的对话框上写的。
    类文件:
    using System;
    using System.Data.SqlClient; 
    using System.Collections;
    namespace PersonalOS
    {
    /// <summary>
    /// Dy_Listbxshow 的摘要说明。
    /// </summary>
    public class Dy_Listbxshow
    {
    public Dy_Listbxshow()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    }
    public ArrayList dy_show()
    {
    DataAccess DA = new DataAccess();
    SqlConnection Conn = DA.getConn();        //连接数据库
     //把“日记”界面上的相应控件与数据库绑定 ArrayList arr=new ArrayList();
    string sql="select 标题 from ta_diary";
    SqlCommand myCommand = new SqlCommand(sql,Conn);
    try
    {
    SqlDataReader myReader = myCommand.ExecuteReader();
    while (myReader.Read())       
        arr.Add(myReader.Getstring(0));
    return arr;
    }
    finally 
    {
    Conn.Close();             //释放资源
    }

    } }
    }
    这串代码我运行了,没有错。也能够把“标题”中的数据用ArrayList类全部return出来(但我要让这类反会的是dy_pkid列中的数据(int),而不是“标题”中的数据(nvarchar))。但是如果返回的列的类型不是string类型,运行的时候会出现刚刚说的对话框,且
    “arr.Add(myReader.Getstring(0));”出现青色和“类型转换无效”的对话框 
    窗体代码为:
    private void diary_Load(object sender, System.EventArgs e)
    {  
    //调用(返回ArrayList类型)类实现在dy_listlbx框中添加相应数据;
    Dy_Listbxshow lshow= new Dy_Listbxshow();
    ArrayList a=lshow.dy_show();
    for(int i=0;i<a.Count;i++)
    {
    dy_listlbx.Items.Add(a[a.Count-1-i]);
    }

    }
    也就是说在窗口“diary”载入的时候马上出现错误对话框!
      

  5.   

    这段代码还是你敲上去的,我找不到原因,也没法找原因
    arr.Add(myReader.Getstring(0));这句可以证明你是敲上去的
      

  6.   

    恩,是我写上去的,因为要做点修改,所以忘了“s” 要大写
    应该是“arr.Add(myReader.GetString(0));” 
    奇怪的是,如果不在Add方法里面使用myReader.GetInt16(0)就不会有错误!
      

  7.   

    你的代码应该没问题,再有了问题就是SQL语句是不是有问题了,比如你发上来的两条SQL语句不一样,而且你在同一个表中用了中文和英文两种字段名(这倒不一定是原因),不出既然出异常了,肯定是有原因的,看别的高手吧,我解决不了
      

  8.   

    谢谢了,试了好几次才不知道为什么把语句改成“arr.Add(myReader.GetInt32(1));”就OK了,而以前用的是GetInt16(1)....