使用c#将varchar转换为float时出错

Posted

技术标签:

【中文标题】使用c#将varchar转换为float时出错【英文标题】:Error to convert varchar to float using c# 【发布时间】: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,它加载一个数据表,但从不将其用于任何事情。你真的需要那个查询或数据表吗? 【参考方案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); 这就是我试图完成的。没关系。

以上是关于使用c#将varchar转换为float时出错的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2012 将数据类型 varchar 转换为数字时出错

将数据类型 varchar 转换为数字时出错。插入语句[重复]

将数据类型 varchar 转换为日期时将 int 年份转换为字符串时出错

Polybase - 将数据类型 VARCHAR 转换为 DATETIME 时出错

在计算 SUM 之前过滤列(错误:将数据类型 varchar 转换为 int 时出错)

在存储过程中将 varchar 转换为数字时出错