2012-03-02 110 views
0

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

(1)

double.TryParse(splitline[8], NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out natMB //conversion 

(2)把我的值在一个过程到我的SQL语句,我的推杆natMB成 'Verbruikgegevens',索引位置2 0或1指示如果我的输入的数据正在漫游或不。这是if语句的一部分,声明它是漫游或国家数据。

sqlStatementUpdate(TrafficdataID, 0,  
(Convert.ToDouble(Verbruikgegevens.Rows[intCount].ItemArray[2], 
CultureInfo.InvariantCulture)) 
在Visual Studio

(3)SQL语句(C#)

public void sqlStatementUpdate(long TrafficdataID, byte Roaming, double Value) 
{ 
    SqlCommand sqlCmd = new SqlCommand(); 
    sqlCmd.Connection = connection2; 
    sqlCmd.CommandType = CommandType.StoredProcedure; 
    sqlCmd.CommandText = "SP_SCTrafficdataDetailUpdate"; 
    DataAccessHelper.AddParam(sqlCmd, "TDDValue", SqlDbType.Decimal, Convert.ToDecimal(Value)); 
    DataAccessHelper.AddParam(sqlCmd, "TrafficdataID", SqlDbType.BigInt, TrafficdataID); 
    DataAccessHelper.AddParam(sqlCmd, "TDDRoaming", SqlDbType.Bit, Roaming); 
    DataAccessHelper.ExecSProcDS(sqlCmd); 
} 

(4)DataAccesHelper

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 

问题:我有可能继续使用双倍数据le,并且在将数据导入到我的sqltable时还将我的数字保留在逗号后面?现在,它似乎并没有工作,那WEL ......我定义我在我的SQLTABLE值作为小数虽然

+1

在你的问题中似乎没有问题...无论如何,如果您使用数据库中的“Decimal”字段,我建议您在C#中使用“Decimal”变量以保持兼容性和/或避免舍入错误。 – 2012-03-02 10:17:51

+0

不小数点会降低性能吗? – Dashzapp 2012-03-02 10:20:37

+0

你错过了一个问题。 sql是否剥离了您尝试插入的数字的小数部分? – Dervall 2012-03-02 10:21:01

回答

2

所以,问题是:

  • 我有一个代表数字的文本输入,使用有时逗号和有时一个小数点分隔符。我怎样才能可靠地将这些转换为数字?

答案:这与SQL数据类型无关。您需要先编写可靠的C#代码以将该数字转换为双精度或十进制。要么会做 - 你应该使用与你的数据库匹配的任何一个。

不变文化要求句号作为小数点,而不是逗号。因此,如果您使用逗号作为小数点分隔符,那么您正在使用错误的文化。

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

如果是来自用户输入,使用用户的文化,或者训练用户使用什么格式。最后,如果你有一些奇怪的格式,你可能需要编写自己的代码来使用正则表达式来规范格式。

速度问题

10000行是什么,应该采取秒不分钟。

我注意到你正在为每一行创建一个新的SqlCommand。每次你这样做,它必须去到SQL服务器,并将元数据与你所调用的存储过程进行匹配。

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

+0

针对速度问题。你的意思是定义一次,然后调用另一个过程来更改命令中的变量? – Dashzapp 2012-03-02 10:55:34

+0

我不认为它会以这种方式工作,我不会得到添加参数的overloop? – Dashzapp 2012-03-02 11:06:21

+0

当您创建SqlCommand时,只需将它们添加一次,并将该值设置为DBNull.Value。那么你说'cmdObject.Parameters [“@ paramName”]。Value = valueVariable;' – Ben 2012-03-02 11:10:47