【问题标题】:C# incorrect insert float data [duplicate]C#不正确插入浮点数据[重复]
【发布时间】:2018-03-14 21:04:07
【问题描述】:

我在下面的代码中插入浮点数。但它保存不正确。 例如,我插入 14.5 或 14,5 它节省了 145 请帮帮我

string table_no = gbox1.Text.Trim();
string gametime = time_hour.Text.Trim() + ":" + time_minute.Text.Trim();
string localdate = DateTime.Now.ToShortDateString();
float money = float.Parse(txtbox_1.Text, CultureInfo.InvariantCulture);

try
{
      connection.Open();
      baza("insert into stollar (id, table_no, gametime, localdate,  money) values ('" + txt1.Text + "','" + table_no + "', '" + gametime + "', '" + localdate + "', '" + money + "' )");
      connection.Close(); 
}

【问题讨论】:

  • 不要对你的 sql 变量使用字符串连接!请改用参数化的 sql。您的列类型也应该正确并使用本机类型,而不是字符串表示。参数还应为每个值使用本机值(而不是字符串表示形式)。
  • 为什么不将数字存储为数字,而不是在保存时转换并在加载时转换?
  • 您永远不应该将用户输入直接插入到 SQL 语句中。使用参数化查询并将这些值(经过一些验证)作为参数传递。
  • 您在这里依赖 很多 来自两个不同系统(C# 和 SQL)的字符串和数字之间的隐式转换。如果您的数据精度对您很重要,请明确维护您的数据类型。
  • 旁注:看起来您可能正在尝试跨方法/类重用 SqlConnection 实例(谁知道)。也不要这样做,根据需要创建和处置您的 SqlConnection 实例。大多数提供商都内置了连接池。

标签: c#


【解决方案1】:

不要对你的 sql 变量使用字符串连接! 改用参数化 sql。您的列类型也应该正确并使用本机类型,而不是字符串表示。参数还应为每个参数使用本机值(而不是字符串表示)。

这是一个很可能可以解决您的问题的代码修复程序您需要更改架构以确保您使用的是本机类型。这将解决您存储值的本地化字符串表示而不是本机类型的问题。以下是我对正确数据类型的猜测。

  • id - 如果您希望 Db 自动生成它,它可能应该是一个标有 Identity 的 int。在这种情况下,请更改架构并且不要在插入中传递值。
  • table_no - 可能是varchar,请务必在参数中指定正确的长度。
  • gametime - 应该是 Time 类型,将 TimeSpan 传递给值
  • localdate - 我推荐datetime2 但也可以使用datetime
  • money - 使用 decimal 并在您的架构中指定精度和比例。确保这些与您在参数上设置的内容相匹配。

调整后的代码

const string sql = @"INSERT INTO stollar (id, table_no, gametime, localdate,  money) VALUES (@id, @table_no, @gametime, @localdate, @money)";
using(SqlConnection conn = new SqlConnection(/*your connection string from app.config or web.config*/))
using(SqlCommand cmd = new SqlCommand(sql, conn))
{
    cmd.Parameters.Add(new SqlParameter("@id", SqlDbType.Int){Value = int.Parse(txt1.Text)});
    cmd.Parameters.Add(new SqlParameter("@table_no", SqlDbType.VarChar, 100){Value = gbox1.Text.Trim()});
    cmd.Parameters.Add(new SqlParameter("@gametime", SqlDbType.Time){Value = TimeSpan.FromMinutes(int.Parse(time_hour.Text.Trim()) * 60 + int.Parse(time_minute.Text.Trim()))});
    cmd.Parameters.Add(new SqlParameter("@localdate", SqlDbType.DateTime){Value = DateTime.Now});
    cmd.Parameters.Add(new SqlParameter("@money", SqlDbType.Decimal){Precision = 10, Scale = 2, Value = decimal.Parse(txtbox_1.Text, CultureInfo.InvariantCulture)});

    conn.Open();
    cmd.ExecuteNonQuery();
}

【讨论】:

  • 它不起作用
  • @iLLkeeNNemo - it does not work 是您从不知道 PC 工作原理以及需要提供哪些信息的用户那里听到的。你是一名程序员,可以做得更好。通读How to Ask并相应地更新您的问题,您还应该提供minimal reproducible example
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 2014-11-26
  • 1970-01-01
  • 2020-02-28
  • 2015-02-22
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多