【问题标题】:Error to convert varchar to float using c#使用c#将varchar转换为float时出错
【发布时间】:2020-03-09 04:06:49
【问题描述】:

我有一个问题,我正在尝试在数据表中记录的值(类型浮点)之间进行操作,问题是当我尝试在维护后使用组合框更新数据中的值(文本框中的操作结果)时操作,它显示错误(System.Data.SqlClient.SqlException:'错误将数据类型 varchar 转换为浮点数。'),那么我该如何解决这个问题!请帮助

这是我的代码的一部分,其中存在错误

private void comboBox5_SelectedIndexChanged(object sender, EventArgs e)
    {
        con.Open();
        String query = "UPDATE Table_com SET Contents='" + textBox6.Text + "' WHERE Variable='" + comboBox5.Text + "'";
        SqlDataAdapter SDA = new SqlDataAdapter(query, con);
        SDA.SelectCommand.ExecuteNonQuery();
        SqlCommand cmd = con.CreateCommand();
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "select * from Table_com where Variable='" + comboBox5.SelectedItem.ToString() + "'";
        cmd.ExecuteNonQuery();
        DataTable dt = new DataTable();
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(dt);

        con.Close();
        MessageBox.Show("Variable mise à jour avec succés");

    }

【问题讨论】:

  • 发布似乎产生错误的值。
  • 您能否提供您要更新的表的定义(即创建语句)?顺便说一句:使用 CommandParameter 而不是将 UI 中的值直接放入查询字符串中。这可能会导致严重的安全问题(SQL 注入)
  • 如果您尝试更新的 SQL 字段是浮点数,那么您不能使用 Field='1',因为它是一个 varchar,您必须改用 Field=1(没有撇号)。也永远不要直接将变量放入 SQL 语句中,而是使用prepared statements,否则你很容易受到 SQL 注入的攻击。
  • 不要通过连接字符串来创建查询。想象一下如果有人在文本框中输入' where 1=0; drop table Table_sagemcom;-- 会发生什么。使用参数化查询传递强类型变量
  • 您的代码执行 SELECT 查询两次,但从不对结果做任何事情。首先是ExecuteNonQuery,它不返回任何结果,然后是da.Fill,它加载一个数据表,但从不将其用于任何事情。你真的需要那个查询或数据表吗?

标签: c# sql .net datatable casting


【解决方案1】:

您不能使用浮点整数等值,例如文本字段:

String query = "UPDATE Table_com SET Contents='" + textBox6.Text + "' WHERE Variable='" + comboBox5.Text + "'";

而且你的代码真的很危险,你可以使用这样的参数,不要使用字符串并将你的值转换为浮点数:

static void Main(string[] args)
        {
            var ConnectionString = "YOUR CONNECTION STRING";
            DataTable dt = new DataTable();
            using (SqlConnection con = new SqlConnection(ConnectionString))
            {
                String query = "UPDATE Table_com SET Contents=@contents WHERE Variable=@variable";

                using (SqlCommand cmd = new SqlCommand(query, con))
                {
                    cmd.CommandType = System.Data.CommandType.Text;

                    cmd.Parameters.Add("@contents", SqlDbType.Float).Value = Convert.ToDouble(textBox6.Text);
                    cmd.Parameters.Add("@variable", SqlDbType.NVarChar).Value = comboBox5.Text;

                    using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                    {
                        da.Fill(dt);
                    }
                }
            }

        }

【讨论】:

  • 我不明白为什么我必须转换 comboBox5 ,它的类型是正确的(varchar),问题出在文本框中,我试过你的方法,但它给了我同样的转换错误!
  • 你的问题在哪里,然后转换它。我给你举例。如果您的文本框的浮点值 123.123 将其转换为浮点数并将其用作浮点数。
【解决方案2】:

这是我尝试参考wikiCan回答的内容

 SqlConnection con = new SqlConnection(@"Data Source=DESKTOP-VEFPLGG\SQLEXPRESS;Initial Catalog=test;Integrated Security=True");    
 private void comboBox5_SelectedIndexChanged(object sender, EventArgs e)
    {

        DataTable dt = new DataTable();
        String query = "UPDATE Table_com SET Contents=@contents ";

            using (SqlCommand cmd = new SqlCommand(query, con))
            {
                cmd.CommandType = System.Data.CommandType.Text;

                cmd.Parameters.Add("@contents", SqlDbType.Float).Value = textBox6.Text;
                //cmd.Parameters.Add("@variable", SqlDbType.Float).Value = Convert.ToDouble(comboBox5.Text);

                using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                {
                    da.Fill(dt);
                }
            }
    }

【讨论】:

  • 尝试转换为浮动。 cmd.Parameters.Add("@contents", SqlDbType.Float).Value =Convert.ToDouble(textBox6.Text);
  • 这就是我试图完成的。没关系。
猜你喜欢
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-08
  • 2019-01-22
相关资源
最近更新 更多