SQL C#使用小数进行双精度运算
本文关键字:双精度 运算 小数 SQL | 更新日期: 2023-09-27 18:26:19
我试图在已经转换的SQL更新语句中输入一个双值(请参阅代码1),以将他的数字放在逗号后面。
(1)
double.TryParse(splitline[8], NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out natMB //conversion
(2) 将我在SQL语句的过程中的值放入"Verbruikgegevens",索引位置2。0或1表示我输入的数据是否正在漫游。这是if语句的一部分,声明它是漫游数据还是国家数据。
sqlStatementUpdate(TrafficdataID, 0,
(Convert.ToDouble(Verbruikgegevens.Rows[intCount].ItemArray[2],
CultureInfo.InvariantCulture))
(3) Visual studio(C#)中的SQL语句
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
问:在将数据导入到sqltable时,我是否可能一直使用双精度,并将数字放在逗号后面?现在它似乎没有那么好用。。。我通过
所以问题是:
- 我有代表数字的文本输入,有时使用逗号,有时使用句点作为小数分隔符。如何将这些可靠地转换为数字
答:这与SQL数据类型无关。您需要首先编写可靠的C#代码来将数字转换为双精度或十进制。两者都可以——您应该使用与数据库匹配的数据库。
不变区域性要求句点作为小数点,而不是逗号。因此,如果使用逗号作为小数分隔符,则使用了错误的区域性。
如果您知道数字的格式,请使用重载的Parse并直接指定格式。
如果是来自用户输入,请使用用户的文化,或者培训用户使用什么格式。
最后,如果您有一些奇怪的格式,您可能需要编写自己的代码来使用正则表达式规范格式。
速度问题
10000行不算什么,它应该需要几秒钟而不是几分钟。
我注意到您正在为每一行创建一个新的SqlCommand。每次这样做时,它都必须转到SQL服务器,并将元数据与您正在调用的存储过程进行匹配。
只需创建一次,然后通过将值设置为新行中的值来重用它。只是不要忘记将NULL设置为DBNull.Value.