【问题标题】:Data Type Money C#数据类型 Money C#
【发布时间】:2014-11-27 13:47:39
【问题描述】:

有人请帮帮我,我不知道为什么!

当我在我的 SQL Server 数据库中插入一个值(例如 3469,2)时,我得到 34692,0000

列的类型为Money,值为double类型

// code
public void updateligne_facture(String Ref, int Qte,String Reffacture,float prixvente,int tva)
{
        SqlConnection con = new SqlConnection();
        con.ConnectionString = @"Data Source=AKRAM-PC\SQLEXPRESS;Initial Catalog=MM_DataBase;Integrated Security=True";

        con.Open();

        double prix = Qte * prixvente;

        double prix_ttc = prix * (1 + (tva/ 100D));

        String requete = "update lc SET lc.Quantite='" + Qte + "',lc.Prix_HT='"+prix+"',lc.Prix_TTC='"+prix_ttc+"' FROM LIGNES_FACTURE as lc  JOIN  MM_ARTICLE as art ON lc.ID_Article=art.ID  JOIN MM_Facture as f ON lc.ID_Facture=f.ID   WHERE art.AR_Ref='" + Ref + "' AND f.Ref='" + Reffacture + "'";
        SqlCommand command = new SqlCommand(requete, con);
        command.ExecuteNonQuery();
        con.Close();
    }

【问题讨论】:

  • 能否请您也出示您的插入代码?
  • 在c#中使用小数
  • 您应该始终使用parameterized queries。这种字符串连接对SQL Injection 攻击开放。还可以使用using 语句处理您的数据库连接和对象。
  • @Soner Gönül 是的,我将使用参数化查询。但我必须为这个问题做些什么!
  • 如果我没记错的话,decimal 是 SQL Server 中优于 money 的首选数据类型,因为它更加精确和可用:Should you choose the MONEY or DECIMAL(x,y) datatypes in SQL Server?

标签: c# sql sql-server-2008


【解决方案1】:

根据微软type mapping guide,SQL Server的Money类型在C#中映射到decimal

注意:进行查询的正确方法是使用参数,如下所示:

decimal prix = (decimal)(Qte * prixvente);
decimal prix_ttc = prix * (1 + (tva/ 100M));

String requete = @"UPDATE lc 
                   SET lc.Quantite = @qte, 
                       lc.Prix_HT = @prix,
                       lc.Prix_TTC = @prix_ttc
                   FROM LIGNES_FACTURE as lc
                   JOIN  MM_ARTICLE as art ON lc.ID_Article=art.ID
                   JOIN MM_Facture as f ON lc.ID_Facture=f.ID
                   WHERE art.AR_Ref = @ref 
                     AND f.Ref = @reffacture";
SqlCommand command = new SqlCommand(requete, con);
command.Parameters.Add("@qte", qte);
command.Parameters.Add("@prix", prix);
... // Set other parameters here
command.ExecuteNonQuery();

【讨论】:

    【解决方案2】:

    您可能遇到了小数分隔符的问题。根据您对变量的命名,您有一个法语(?)系统语言环境。因此,将您的变量转换为字符串会插入一个逗号作为小数点分隔符。
    如果您使用 SQL 语句,您的 SQL Server 需要一个点作为小数分隔符。所以你的 3469,2 得到 34692。

    也可以解决它
    - 使用参数化查询来处理它(强烈推荐)或
    - 格式化变量的字符串转换以使用点作为小数分隔符。但这会有几个缺点:您依赖于 SQL Server 的语言环境,并且如果您曾经将用户条目用作变量输入,则很容易受到注入攻击。

    【讨论】:

    • 谢谢@Uwe 我插入这条指令 String p = prix_ttc.ToString().Replace(',', '.');现在可以使用了
    • @user3475928 - 但这仍然是错误的方法!如果您使用参数化查询,您甚至不会遇到您遇到的问题。
    猜你喜欢
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 2023-03-12
    • 2020-10-26
    • 2018-05-07
    相关资源
    最近更新 更多