【问题标题】:Unable to cast object of type 'System.DBNull' to type 'System.String'. Error [duplicate]无法将“System.DBNull”类型的对象转换为“System.String”类型。错误[重复]
【发布时间】:2012-05-19 17:20:44
【问题描述】:

我不断收到此错误,因为该记录的 VendorID 为空。我已经看到这个问题已经被问过几次了,似乎我应该在它转换它并将它输入到 dbtable 之前检查是否为 null,但我不知道该怎么做。

public static PartOrder findPartOrder(string orderNo)
    {
        PartOrder aPartOrder = new PartOrder();
        OleDbDataAdapter myAdapter = new OleDbDataAdapter();
        if (aConnection.State == ConnectionState.Closed)
            aConnection.Open();
        OleDbCommand cmd = aConnection.CreateCommand();
        OleDbDataReader dbReader = null;
        cmd.CommandText = "SELECT * FROM PartOrder WHERE OrderNo = '" + orderNo + "'";
        dbReader = cmd.ExecuteReader();

        while (dbReader.Read())
        {
            aPartOrder.OrderNo = (string)dbReader.GetValue(0);
            aPartOrder.Length = (string)dbReader.GetValue(1);
            aPartOrder.Finish = (string)dbReader.GetValue(2);
            aPartOrder.Cost = (string)dbReader.GetValue(3);
            aPartOrder.PartDrawingNo = (string)dbReader.GetValue(4);
            aPartOrder.VendorId = (string)dbReader.GetValue(5);
            aPartOrder.ShopId = (string)dbReader.GetValue(6);
            aPartOrder.Completed = (string)dbReader.GetValue(7);
        }

        dbReader.Close();
        return aPartOrder;
    }

同样,行“aPartOrder.VendorId = (string)dbReader.GetValue(5);”收到错误,因为 VendorId 为空。

【问题讨论】:

    标签: c# sql arraylist


    【解决方案1】:

    对于这个特定的行试试这个:

    aPartOrder.VendorId = dbReader.GetValue(5)==DBNull?"":dbReader.GetValue(5).value;
    

    最好写一个辅助函数:

    private static string MyToString(object o)
    {
        if(o == DBNull.Value || o == null) 
           return "";
    
        return o.ToString();
    }
    

    并使用它:

    aPartOrder.VendorId = MyToString(dbReader.GetValue(5));
    

    【讨论】:

      【解决方案2】:

      单线答案

      aPartOrder.VendorId = dbReader.IsDBNull(5) ? "" :(string)dbReader.GetValue(5);
      

      【讨论】:

        【解决方案3】:

        dbReader.GetValue(5).HasValue ? dbReader.GetValue(5).ToString() : String.Empty

        【讨论】:

          【解决方案4】:

          使用OleDbDataReader.IsDBNull(ordinal) 验证字段值。

          if(!dbReader.IsDBNull(5))
            aPartOrder.VendorId = dbReader.GetString(5);
          

          建议:始终使用参数/预编译的sql语句来防止SQL-Injection攻击。

          cmd.CommandText = "SELECT * FROM PartOrder WHERE OrderNo = @OrderNo";
          cmd.Parameters.Add("@OrderNo",System.Data.OleDb.OleDbType.VarChar,20).Value=orderNo;
          dbReader = cmd.ExecuteReader();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-05-24
            • 2021-04-26
            • 2012-09-14
            相关资源
            最近更新 更多