数据类型Money C#

时间:2014-11-27 13:47:39

标签: c# sql sql-server-2008

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

当我将例如3469,2的值插入我的SQL Server数据库时,我得到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();
    }

2 个答案:

答案 0 :(得分:2)

根据Microsoft 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();

答案 1 :(得分:1)

您可能遇到小数点分隔符问题。从命名变量开始,您就拥有了法语(?)系统区域设置。因此,将变量转换为字符串会为小数点分隔符插入逗号 如果使用SQL语句,则SQL Server需要一个点作为小数分隔符。所以你的3469,2获得了34692.

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