使用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 时出错