none
c#如何转换numeric类型? RRS feed

  • 问题

  • vs2008,我在数据库表中设计了一个工资字段,用的是numeric(10,2),在前台插入数据时报错,我是这样转换的不行吗:Convert.ToDecimal(this.TextBox1.Text);那么怎样转换成numeric呢

    2010年7月13日 1:45

答案

  • 试过[DataField(Name="Charge", DbType="decimal", Precision=10, Scale=2)]吗?如果你用得是ORM,就要注意映射时C#类型问题。

    • 已标记为答案 fangyanqin 2010年7月20日 0:42
    2010年7月17日 6:16

全部回复

  • 既然是后台出错,应该提供你插入的sql语句。

    前面代码转换是没问题的。


    family as water
    2010年7月13日 1:59
  • 异常是否sql 发错的错误?

    2010年7月13日 3:19
  • Oracle.DataAccess.Types.OracleDecimal od1 = (Oracle.DataAccess.Types.OracleDecimal)oracleCommand.Parameters["p_Rst"].Value;
    int obj1 = od1.ToInt32();

    用你数据库ADO.NET驱动提供的数据类型。

    2010年7月13日 3:41
  • 好像表达清楚了呀。我用的数据库是sql2005,在表中设计的一个字段类型是numeric,而在我们的c#中好像没有这个类型,所以呢,在插入表的时候,报错了。所以呢,我来请教下,C#中的那个数据类型是和sql2005中的数据类型numeric是兼容的,或者说怎么在c#中怎么得到这个numeric的数据类型。

    2010年7月13日 4:31
  • sqlserver中的numeric对应c#中的System.Decimal,你应该把你的代码贴出来,

    这里有SQL SERVER数据类型与C#数据类型对照表

    http://www.cnblogs.com/gooddasenlin/archive/2008/12/08/1350065.html


    http://blog.csdn.net/zx13525079024
    2010年7月13日 4:55
  • 用 decimal 就可以。ADO.NET 会自动映射数据类型的。其实 float, double 也可以,不过要考虑溢出时的问题。这里很可能会抛异常的。
    Mark Zhou
    2010年7月13日 8:29
  •             using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(""))
                {
                    string a = "92345678.90";
                    conn.Open();
                    System.Data.SqlClient.SqlCommand com = conn.CreateCommand();
                    com.CommandText = "update test set money=@money";
                    System.Data.SqlClient.SqlParameter p1 = com.CreateParameter();
                    p1.DbType = DbType.Decimal;
                    p1.ParameterName = "@money";
                    p1.Value = a;  // p1.Value = Convert.ToDecimal(a);
                    com.Parameters.Add(p1);
                    com.ExecuteNonQuery();
                    conn.Close();
                }

    不转换类型也是可以的。你的报错也许源于其它问题。

    2010年7月13日 9:49
  • 我也觉得,不是数据类型转换的问题。就好象SQL Server,Access,Oracle这些数据库的数据类型瞄一眼,不一样的占多数,其实,他们之间在编程时是有对应的,而且在数据库执行SQL时,数据库会智能一下,只要不违反对字段的约束,都会正常执行。我用的Oracle 10g,Oracle 11g,就较以前的版本智能多了。


    1+1=The World http://blog.csdn.net/liuning800203
    2010年7月13日 14:11
  • 现在我们的应用程序是3层结构,实体层已经写明了字段的数据类型,插入数据或修改数据,会严格遵循,如果说插入的类型不符合,就会抛出错误,哎,没有办法,我只好将数据库表中的字段类型改成decimal以对应c#中的decimal。

    之前实体层的结构是这样的(部分代码):

     [DataField(Name="Charge", DbType="numeric", Precision=10, Scale=2)]
        public Nullable<numeric> Charge
        {
            get
            {
                return _charge;
            }
            set
            {
                if (_charge.HasValue && value.HasValue)
                {
                    if (_charge.Value != value.Value)
                    {
                        _charge = value;
                        SetChangedField("Charge");
                    }
                }
                else
                {
                    _charge = value;
                    SetChangedField("Charge");
                }
            }
        }

    那么我在给引用时,就会这样: 假如类型名为;MyTest

    MyTest.Charge=Convert.Decimal(this.textbox1.text)

    虽然我转换成了decimal,但是,不能和数据库中的类型对应,依然报错。

     

    2010年7月16日 0:39
  • 现在我们的应用程序是3层结构,实体层已经写明了字段的数据类型,插入数据或修改数据,会严&#26684;遵循,如果说插入的类型不符合,就会抛出错误,哎,没有办法,我只好将数据库表中的字段类型改成decimal以对应c#中的decimal。

    之前实体层的结构是这样的(部分代码):

     [DataField(Name="Charge", DbType="numeric", Precision=10, Scale=2)]
        public Nullable<numeric> Charge
        {
            get
            {
                return _charge;
            }
            set
            {
                if (_charge.HasValue && value.HasValue)
                {
                    if (_charge.Value != value.Value)
                    {
                        _charge = value;
                        SetChangedField("Charge");
                    }
                }
                else
                {
                    _charge = value;
                    SetChangedField("Charge");
                }
            }
        }

    那么我在给引用时,就会这样: 假如类型名为;MyTest

    MyTest.Charge=Convert.Decimal(this.textbox1.text)

    虽然我转换成了decimal,但是,不能和数据库中的类型对应,依然报错。

     


    DataField(Name="Charge", DbType="numeric", Precision=10, Scale=2)]
    把 DbType="numeric",改成Decimal.

    最后使用的 DbParameter 一定要和下面的属性相同:

     p1.DbType = DbType.Decimal;

    2010年7月16日 12:56
  • 试过[DataField(Name="Charge", DbType="decimal", Precision=10, Scale=2)]吗?如果你用得是ORM,就要注意映射时C#类型问题。

    • 已标记为答案 fangyanqin 2010年7月20日 0:42
    2010年7月17日 6:16
  • 数据库中是numeric类型对应c#中decimal类型,

    如果是像数据库中执行操作的话。decimal类型是无需转换为numeric。

    况且就算类型不同,像int,numeric 等数据类型都是可以隐式转换的

    2010年7月19日 12:29