none
Convert.ToDecimal 及 Convert.ToDateTime 转换时,值为空该如何处理? RRS feed

  • 问题

  • 数据库里有一个日期型及数字型的字段,均可以设置为空

    现在在前台做转换时Convert.ToDecimal 及 Convert.ToDateTime报错,该如何处理?

     

     


    做有意义的事^_^
    2010年8月31日 7:30

答案

  • 你好!

    1 前台程序提交前,建议对数据类型做验证。简单验证用 decimal.TryParse、DateTime.TryParse 来判断

    2 向数据插入空值时参数值使用 DbNull.Value 或在 SqlCommand 中不声明关于空值的字段。

    示例:

     

    static void Main(string[] args)
    {
     Guid id = Guid.NewGuid();
     string name = "张三";
     Nullable<decimal> price = null;
     Nullable<DateTime> createDateTime = null;
     AddProduct(id, name, price, createDateTime);
    
     DateTime.TryParse
    }
    
    static void AddProduct(Guid Id, string Name, Nullable<decimal> Price, Nullable<DateTime> CreateDateTime)
    {
     //Product 表结构
     //Id uniqueidentifier NOT NULL,
     //Name nvarchar(50) COLLATE NOT NULL,
     //Pirce decimal(18, 0) NULL,
     //CreateDateTime datetime NULL
    
     string commandText = "INSERT INTO Product(Id, Name, Pirce, CreateDateTime) VALUES(@Id, @Name, @Pirce, @CreateDateTime)";
     using (SqlConnection conn = new SqlConnection(@"Server=X-PC\SQLEXPRESS;DataBase=X;Integrated Security=SSPI;"))
     {
      SqlCommand comm = new SqlCommand(commandText, conn);
      comm.Parameters.AddWithValue("@Id", Id);
      comm.Parameters.AddWithValue("@Name", Name);
    
      if (Price == null)
      {
       comm.Parameters.AddWithValue("@Pirce", DBNull.Value);
      }
      else
      {
       comm.Parameters.AddWithValue("@Pirce", Price);
      }
    
      if (CreateDateTime == null)
      {
       comm.Parameters.AddWithValue("@CreateDateTime", DBNull.Value);
      }
      else
      {
       comm.Parameters.AddWithValue("@CreateDateTime", CreateDateTime);
      }
    
      conn.Open();
      comm.ExecuteNonQuery();
     }
    }
    

     

     


    知识改变命运,奋斗成就人生!
    2010年8月31日 12:42
    版主

全部回复

  • 你好

    或者你可以在對換前做一個 IF STATEMENT 來查看 內容是不是空的

    例如:
    decimal d =0;
    if( objComm.Parameters["@FieldValue"].Value != System.DBNull.Value){

    d= Convert.ToDecimal(objComm.Parameters["@Fieldvalue"].Value)

    }

    或用Try and Catch Statement 當有錯誤事做另一個動件

    E.G.

    decimal d =0;

    try{

    d= Convert.ToDecimal("你想轉換的資料")

    }Catch(Exception e){

    d= "如果是空時你想轉換成的數值"

    }

    Please correct me if my concept is wrong

     

     


    Chi
    2010年8月31日 7:49
    版主
  • 这样的话,我插入到数据库就一定会有个默认值。

    如果不想要默认值呢?


    做有意义的事^_^
    2010年8月31日 9:37
  • 你好

    你可以可不可以POST 一些你怎樣把資料放入DATABASE 的 CODE 上來看看

    你是在取資料時出現錯誤

    所以如果你在加入資料時 當知道這2個FIELD  是 NULL 的話 不把他加入 便可

    Please correct me if my concept is wrong

     

     


    Chi
    2010年8月31日 9:59
    版主
  • 你好!

    1 前台程序提交前,建议对数据类型做验证。简单验证用 decimal.TryParse、DateTime.TryParse 来判断

    2 向数据插入空值时参数值使用 DbNull.Value 或在 SqlCommand 中不声明关于空值的字段。

    示例:

     

    static void Main(string[] args)
    {
     Guid id = Guid.NewGuid();
     string name = "张三";
     Nullable<decimal> price = null;
     Nullable<DateTime> createDateTime = null;
     AddProduct(id, name, price, createDateTime);
    
     DateTime.TryParse
    }
    
    static void AddProduct(Guid Id, string Name, Nullable<decimal> Price, Nullable<DateTime> CreateDateTime)
    {
     //Product 表结构
     //Id uniqueidentifier NOT NULL,
     //Name nvarchar(50) COLLATE NOT NULL,
     //Pirce decimal(18, 0) NULL,
     //CreateDateTime datetime NULL
    
     string commandText = "INSERT INTO Product(Id, Name, Pirce, CreateDateTime) VALUES(@Id, @Name, @Pirce, @CreateDateTime)";
     using (SqlConnection conn = new SqlConnection(@"Server=X-PC\SQLEXPRESS;DataBase=X;Integrated Security=SSPI;"))
     {
      SqlCommand comm = new SqlCommand(commandText, conn);
      comm.Parameters.AddWithValue("@Id", Id);
      comm.Parameters.AddWithValue("@Name", Name);
    
      if (Price == null)
      {
       comm.Parameters.AddWithValue("@Pirce", DBNull.Value);
      }
      else
      {
       comm.Parameters.AddWithValue("@Pirce", Price);
      }
    
      if (CreateDateTime == null)
      {
       comm.Parameters.AddWithValue("@CreateDateTime", DBNull.Value);
      }
      else
      {
       comm.Parameters.AddWithValue("@CreateDateTime", CreateDateTime);
      }
    
      conn.Open();
      comm.ExecuteNonQuery();
     }
    }
    

     

     


    知识改变命运,奋斗成就人生!
    2010年8月31日 12:42
    版主
  • 如果您需要在实体类中尽可能的兼容数据库的格式,可以尝试用Nullable的类型来处理这些可空的数据。

    例如Decimal?或DateTime?,这些类型的变量可以被设置为空。


    Eternal Snow
    2010年8月31日 16:07
  • 1. 代码中有一个如下方法,进行数据库操作

    public static void New(string userid,decimal age,DateTime createdate,string notetext)

    2. 根据前台调用

    New(TextBoxN_USER_ID.Text, Convert.ToDecimal(TextBoxN_AGE.Text), Convert.ToDateTime(TextBoxN_CREATE_DATE.Text), TextBoxN_NOTE_TEXT.Text);

     

     

     


    做有意义的事^_^
    2010年9月1日 0:21
  • Nullable<decimal> price = null;

    这个由前台输入,不一定是 null

    这样不是每次都要先判断输入是否为空,是的话赋值为null,不是的话再做转换


    做有意义的事^_^
    2010年9月1日 0:23
  • 如下判定来实现,字段 is DBNULL?  默认值: Convert.ToDecimal(字段) ;就用一个条件表达式,即可。

     Convert.ToDateTime 同理

    2010年9月6日 9:03