繁体   English   中英

SQL Server中有没有function转换成十进制数?

[英]Is there a function in SQL Server to convert to a decimal number?

我在一列中有一个单元格值为“12,000”。 而我想改为“11,000”并显示它......但它只显示一个空白区域。 在数据库中,该值显示为 NULL。

在数据库中,类型为Decimal(18,3)

我在C#的代码是这样的:

decimal dec = Convert.ToDecimal(dgvRow.Cells[16].Value.ToString());
string query = "UPDATE cabecdoc SET CDU_Peso = TRY_CONVERT(DECIMAL(18,3),'" + dec + "' ) WHERE Id = '" + idDoc + "'";

如果我进行查询:

UPDATE CabecDoc 
SET CDU_Peso = TRY_CONVERT(DECIMAL(18,3), '11.000') 
WHERE Id = 'fb9668a9-46fa-11ec-9494-00155d01b010'

在 Microsoft SQL 服务器中 - 它可以工作......但在我的 C# 程序中它显示一个空格值。

好的,假设文本值没有 $(或货币字符),那么这将起作用:

        string strSQL = "UPDATE cabecdoc " +
                        "SET CDU_Peso = @Peso " +
                        "WHERE Id = @ID";
        using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
        {
            conn.Open();
            cmdSQL.Parameters.Add("@Peso", SqlDbType.Decimal).Value = dgvRow.Cells[16].Text;
            cmdSQL.Parameters.Add("@ID", SqlDbType.NVarChar).Value = idDoc;
            cmdSQL.ExecuteNonQuery();
        }

因此,如果单元格具有:

12000
12,000
12,000.00

然后以上将正常工作。

但是,如果单元格要具有:

 $12,000.00

然后你需要为此使用全球化转换器。

像这样说:

   // -- using System.Globalization;

            Decimal TestNum = 0;
            decimal.TryParse(TextBox1.Text,
            NumberStyles.Currency,
            CultureInfo.CurrentCulture.NumberFormat, out TestNum); 

现在,如果转换器失败,那么 TestNum 将不会改变(上面的“out”返回值),然后我们现在有这个:

        string strSQL = "UPDATE cabecdoc " +
                        "SET CDU_Peso = @Peso " +
                        "WHERE Id = @ID";
        using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
        {
            conn.Open();
            cmdSQL.Parameters.Add("@Peso", SqlDbType.Decimal).Value = TestNum;
            cmdSQL.Parameters.Add("@ID", SqlDbType.NVarChar).Value = idDoc;
            cmdSQL.ExecuteNonQuery();
        }

而第一个只要没有货币字符(如“$”)就可以工作?

嗯,它会工作,但第一个例子不处理“”(空字符串)。

所以,你可以说使用这个:

string MyPeso = dgvRow.Cell[16].Text;
if (MyPeso == "")
   MyPeso = "0";

....
cmdSQL.Parameters.Add("@Peso", SqlDbType.Decimal).Value = MyPeso;

此外,如前所述,不仅使用参数更容易 - 您甚至不必知道(或思考)是否需要包围值 - 因此 sql 更容易阅读,并且如前所述,它是 sql注射安全。

例如这个:

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM