【发布时间】:2012-03-02 10:11:52
【问题描述】:
我正在尝试在已转换的 SQL 更新语句中输入双精度值(参见代码 1),以将他的数字保留在逗号后面。
(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))
(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) 数据访问助手
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 时,我是否可以继续使用双精度数,并将我的数字放在逗号后面?现在它似乎没有那么好用......我在我的 SQLTable 中将我的值定义为小数
【问题讨论】:
-
您的问题似乎没有问题...无论如何,如果您使用数据库中的
Decimal字段,我建议您在 C# 中使用Decimal变量来保持兼容和/或避免舍入错误。 -
小数不会降低性能吗?
-
您错过了一个问题。 sql 是否会删除您尝试插入的数字的小数部分?
-
十进制可能比双精度稍慢,但这实际上取决于您的问题到底是什么。你愿意为了准确而放弃一些速度吗?
-
仅处理 10000 条记录需要 15 分钟,这听起来像是您的整体设计有问题,我认为如果您修复了设计缺陷,您可以只使用小数,而一开始就没有问题。