【问题标题】:message error "Specified cast is not valid"消息错误“指定的演员表无效”
【发布时间】:2015-12-22 10:23:55
【问题描述】:

我正在尝试使用此方法从数据库访问中获取信息

public List<gerant> getinfogerant()
    {
        List<gerant> gerer = new List<gerant>();
        string sql_gerant = "select CIN,NOM,PRENOM,ADRESS_PERSONNEL,NUM_TEL,MAIL,MOBILE,CP_GERANT,VILLE_GERANT,DATE_CIN from GERANT";
        connexion connect = new connexion();
        OleDbConnection connection = connect.getconnexion();
        connection.Open();
        OleDbCommand cmd = new OleDbCommand(sql_gerant, connection);
        OleDbDataReader reader = cmd.ExecuteReader();
       while(reader.Read())
        {
            gerer.Add(new gerant(reader.GetInt64(0),
                reader.GetString(1),
                reader.GetString(2),
                reader.GetString(3),
            reader.GetDouble(4),
                reader.GetString(5),
                reader.GetDouble(6),
                reader.GetInt32(7),
                reader.GetString(8),
                reader.GetDateTime(9))
                );

        }
        connection.Close();
        return gerer;

    }

在我的数据库访问中,我将字段 cin 定义为长整数并格式化为“00000000”

但我在reader.GetInt64(0) 中遇到错误:

指定的演员表无效

我该如何解决?

【问题讨论】:

  • 格式化的“0000000”是什么意思?如果这是语句的结果,则 CIN 是一个字符串。
  • CIN 字段可以是null吗?
  • 您确定您在reader.GetInt64(0) 中遇到异常,而不是在整个gerant 构造函数中吗?
  • @nabuchodonossor : 这意味着 cin 必须插入 8 位
  • @MikhailNeofitov:我用 GetString 更改了 GetInt64(0) 并且它有效?

标签: c# database


【解决方案1】:

试试这个代码

public List<gerant> getinfogerant()
{
    List<gerant> gerer = new List<gerant>();

    try
    {
        connexion connect = new connexion();
        OleDbCommand cmd = new OleDbCommand();

        cmd.Connection = new OleDbConnection(connect.getconnexion());
        cmd.CommandType = CommandType.Text;
        comd.CommandText = "select CIN,NOM,PRENOM,ADRESS_PERSONNEL,NUM_TEL,MAIL,MOBILE,CP_GERANT,VILLE_GERANT,DATE_CIN from GERANT";

        connection.Open();

        OleDbDataReader reader = cmd.ExecuteReader();

        while(reader.Read())
        {
            gerant g = new gerant();

            if (!reader.IsDBNull(0)) g.CIN = int.Parse(reader.GetValue(0).ToString());
            if (!reader.IsDBNull(1)) g.NOM = reader.GetValue(1).ToString();
            if (!reader.IsDBNull(2)) g.PRENOM = reader.GetValue(2).ToString();
            if (!reader.IsDBNull(3)) g.ADRESS_PERSONNEL = reader.GetValue(3).ToString();
            if (!reader.IsDBNull(4)) g.NUM_TEL = Convert.ToDouble(reader.GetValue(4).ToString());
            if (!reader.IsDBNull(5)) g.MAIL = reader.GetValue(5).ToString();
            if (!reader.IsDBNull(6)) g.MOBILE =Convert.ToDouble(reader.GetValue(6).ToString());
            if (!reader.IsDBNull(7)) g.CP_GERANT = int.Parse(reader.GetValue(7).ToString());
            if (!reader.IsDBNull(8)) g.VILLE_GERANT = reader.GetValue(8).ToString();
            if (!reader.IsDBNull(9)) g.DATE_CIN = Convert.ToDateTime(reader.GetValue(9).ToString());

            gerer.add(g);
        }
        return gerer;
    }
    catch(Exception ex)
    {
        throw ex;
    }
    finally
    {
        reader.Close();
        connection.Close();
    }
}

请调整类和方法的名称: - 公共列表 getInfogerant() -> 公共列表 getInfoGerant()

  • 连接连接=新连接(); -> 连接(不是 x)

【讨论】:

    【解决方案2】:

    请检查 DBNULL 值,您可能得到一个空值。

    问候 贾斯比尔辛格

    【讨论】:

      【解决方案3】:

      Access 中的整数有 1、2 和 4 字节类型。单字节数命名为 Byte(范围 0-255),双字节数命名为 Integer(-32768 到 32767),然后是 Long Integer(-20 亿到 20 亿)。

      https://eggerapps.at/mdbviewer/docs/en/field-types.html 使用 getint32

      【讨论】:

        【解决方案4】:

        我猜,你得到的异常不是在 reader.GetInt64(0) 而是在 gerant 构造函数中,所以它可以是任何列。

        要检查这个修改你的代码如下

                while (reader.Read())
                {
                    var cin = reader.GetInt64(0);
                    var nom = reader.GetString(1);
                    var prenom = reader.GetString(2);
                    var addressPersonel = reader.GetString(3);
                    var numTel = reader.GetDouble(4);
                    var mail = reader.GetString(5);
                    var mobile = reader.GetDouble(6);
                    var cpGerant = reader.GetInt32(7);
                    var villeGerant = reader.GetString(8);
                    var dateCin = reader.GetDateTime(9);
        
                    gerer.Add(new gerant(cin,
                        nom,
                        prenom,
                        addressPersonel,
                        numTel,
                        mail,
                        mobile,
                        cpGerant,
                        villeGerant,
                        dateCin)
                        );
                }
        

        你会得到真正的异常。

        我建议检查NUM_TELMOBILE 列中的double 数字。

        另外,在阅读之前检查非string 列的DbNull 值。 longintdoubleDateTime 不能为空。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-22
          • 1970-01-01
          • 2018-02-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多