SQL C#双精度小数

SQL C#双精度小数,c#,sql,double,decimal,C#,Sql,Double,Decimal,我试图在一个已经转换的SQL更新语句中输入一个双精度值(参见代码1),以将他的数字保留在逗号后面 (一) (2) 将我的值放入SQL语句的过程中,我将natMB放入“Verbruikgegevens”索引位置2。0或1表示我输入的数据是否漫游。这是if语句的一部分,声明它是漫游数据或国家数据 sqlStatementUpdate(TrafficdataID, 0, (Convert.ToDouble(Verbruikgegevens.Rows[intCount].ItemArray[2

我试图在一个已经转换的SQL更新语句中输入一个双精度值(参见代码1),以将他的数字保留在逗号后面

(一)

(2) 将我的值放入SQL语句的过程中,我将natMB放入“Verbruikgegevens”索引位置2。0或1表示我输入的数据是否漫游。这是if语句的一部分,声明它是漫游数据或国家数据

sqlStatementUpdate(TrafficdataID, 0,     
(Convert.ToDouble(Verbruikgegevens.Rows[intCount].ItemArray[2],   
CultureInfo.InvariantCulture))
(3) Visual studio中的SQL语句(C#)

(4) 数据存取帮助器

internal static class DataAccessHelper
{
    public static void AddParam(SqlCommand cmd, string columnName, SqlDbType dbType, object paramvalue)
    {
        if (paramvalue is DateTime)
        {
            if (((DateTime)paramvalue).Date == DateTime.MinValue.Date)
            {
                paramvalue = DBNull.Value;
            }

        }

        if (paramvalue == null)
        {
            paramvalue = DBNull.Value;
        }

        string param = "@" + columnName;
        if (!cmd.Parameters.Contains(param))
        {
            if (dbType == SqlDbType.VarChar || dbType == SqlDbType.NVarChar || dbType == SqlDbType.Char || dbType == SqlDbType.NChar)
                cmd.Parameters.Add(param, dbType, 4000);
            else
                cmd.Parameters.Add(param, dbType);

            cmd.Parameters[param].SourceColumn = columnName;
            cmd.Parameters[param].Value = paramvalue;
        }
    }

    public static DataSet ExecSProcDS(SqlCommand cmd)
    {
        DataSet ds = new DataSet();

        try
        {
            SqlDataAdapter da = new SqlDataAdapter();
            da.SelectCommand = cmd;
            da.Fill(ds);
        }
        catch (Exception ex)
        {
            throw (ex);
        }
        return ds;
    }
(5) SQL语句

ALTER PROCEDURE [dbo].[SP_SCTrafficdataDetailUpdate] @TDDValue decimal, @TrafficdataID bigint, @TDDRoaming bit
AS
BEGIN
UPDATE    TR_SCTrafficDataDetail
SET              TDDValue = @TDDValue
WHERE     (TDDType = 'Data') AND (TrafficDataID = @TrafficdataID) AND (TDDRoaming = @TDDRoaming)
END
问题:在将数据导入sqltable时,是否可能继续使用double,并将数字保留在逗号后面?现在好像没那么好用。。。我在SQLTable中将我的值定义为十进制,但问题是:

  • 我有表示数字的文本输入,有时使用逗号,有时使用句点作为十进制分隔符。如何将这些数据可靠地转换为数字
答:这与SQL数据类型无关。您需要首先编写可靠的C#代码来将数字转换为双精度或十进制。两者都可以-您应该使用与数据库匹配的选项

不变区域性要求句点为小数点,而不是逗号。因此,如果使用逗号作为小数分隔符,则使用的区域性是错误的

如果知道数字的格式,请使用重载解析并直接指定格式

如果是用户输入,请使用用户的文化,或培训用户使用何种格式

最后,如果您有一些奇怪的格式,您可能需要编写自己的代码来使用正则表达式来规范格式

速度问题

10000行算不了什么,应该需要几秒钟而不是几分钟

我注意到您正在为每一行创建一个新的SqlCommand。每次执行此操作时,它都必须转到SQL server并将元数据与正在调用的存储过程相匹配


只需创建一次,然后通过将值设置为新行中的值来重新使用它。只是别忘了将NULL设置为DBNull.Value。

您的问题中似乎没有问题。。。无论如何,如果您使用数据库中的
Decimal
字段,我建议您使用C#中的
Decimal
变量来保持兼容和/或避免舍入错误。小数是否会降低性能?您缺少一个问题。sql是否删除了您试图插入的数字的小数部分?十进制可能比双精度稍慢,但这实际上取决于您的问题是什么。你愿意为了准确性而放弃一些速度吗?处理10000条记录只需15分钟听起来好像你的整体设计有问题,我认为如果你修复了设计缺陷,你可以使用十进制,而不是一开始就有问题。对于速度问题。你的意思是定义它一次,然后调用另一个过程来更改命令中的变量?我认为它不会这样工作,我不会得到添加参数的超循环吗?创建SqlCommand时,只添加一次,将值设置为DBNull.value。然后说
cmdObject.Parameters[“@paramName”].Value=valueVariable
internal static class DataAccessHelper
{
    public static void AddParam(SqlCommand cmd, string columnName, SqlDbType dbType, object paramvalue)
    {
        if (paramvalue is DateTime)
        {
            if (((DateTime)paramvalue).Date == DateTime.MinValue.Date)
            {
                paramvalue = DBNull.Value;
            }

        }

        if (paramvalue == null)
        {
            paramvalue = DBNull.Value;
        }

        string param = "@" + columnName;
        if (!cmd.Parameters.Contains(param))
        {
            if (dbType == SqlDbType.VarChar || dbType == SqlDbType.NVarChar || dbType == SqlDbType.Char || dbType == SqlDbType.NChar)
                cmd.Parameters.Add(param, dbType, 4000);
            else
                cmd.Parameters.Add(param, dbType);

            cmd.Parameters[param].SourceColumn = columnName;
            cmd.Parameters[param].Value = paramvalue;
        }
    }

    public static DataSet ExecSProcDS(SqlCommand cmd)
    {
        DataSet ds = new DataSet();

        try
        {
            SqlDataAdapter da = new SqlDataAdapter();
            da.SelectCommand = cmd;
            da.Fill(ds);
        }
        catch (Exception ex)
        {
            throw (ex);
        }
        return ds;
    }
ALTER PROCEDURE [dbo].[SP_SCTrafficdataDetailUpdate] @TDDValue decimal, @TrafficdataID bigint, @TDDRoaming bit
AS
BEGIN
UPDATE    TR_SCTrafficDataDetail
SET              TDDValue = @TDDValue
WHERE     (TDDType = 'Data') AND (TrafficDataID = @TrafficdataID) AND (TDDRoaming = @TDDRoaming)
END