【问题标题】:Error when data is bind into data table or gridview数据绑定到数据表或网格视图时出错
【发布时间】:2015-11-20 03:00:27
【问题描述】:

将 varchar 值“DADE”转换为数据类型 int 时转换失败。

我使用的

SQL 命令是这样的:

SELECT * FROM p_details 
WHERE LOWER(name) LIKE '%has%ln%' 
AND  
  CODE = 13 
AND 
  T_CODE='H' 

我的代码是:

SqlDataReader drr = com4.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(drr); <--error line
GridView7.DataSource = dt;
GridView7.DataBind();

【问题讨论】:

  • 请多放一些代码不应该出现那个错误,因为你没有转换 DADE
  • 这是我唯一拥有的东西,从数据库中获取数据并关闭连接。在数据库表中,所有列都为 varchar,但我不知道它为什么要转换为 int。
  • 尝试使用SqlDataAdapter 代替:using(var da=new SqlDataAdapter(sql, con))da.Fill(dt);
  • @TimSchmelter SqlDataAdapter 在这种情况下会做什么?
  • @krishnakumar:您声明所有列都是 varchar,并且您没有将任何内容转换为 int,但您的 sql 是 WHERE CODE = 13。如果 code 也是一个 varchar 你正在将 13 转换为它。您的其中一列中有一个值DADE。它是哪一列?您从哪里访问该列?

标签: c# sql asp.net sql-server gridview


【解决方案1】:

在评论中,您声明所有列都是varchar,并且您没有将任何内容转换为int,但您的sql 是WHERE CODE = 13

所以code 也是varchar。通过将它与int 13 进行比较,您不会将13 转换为varchar,反之亦然,您将code 中的每个值都转换为int

为什么?因为data type precedence 规则:

  • 优先级较低的数据类型转换为优先级较高的数据类型

int 具有更高的优先级,因此所有varchar 值都将转换为int。我假设您在该列中有一个值 'DADA',该值无法转换为 int

所以解决方案很简单,通过使用'13' 而不是13 将其设为varchar

SELECT * FROM p_details 
WHERE LOWER(name) LIKE '%has%ln%' 
AND  
  CODE = '13' 
AND 
  T_CODE = 'H' 

除此之外,您应该始终使用 sql 参数来防止 sql-injection:

SELECT * FROM p_details 
WHERE LOWER(name) LIKE @lowname
AND  
  CODE = @code 
AND 
  T_CODE = @tCode

com4.Parameters.Add("@lowname", SqlDbType.VarChar).Value = "%" + name.ToLower() + "%");
com4.Parameters.Add("@code", SqlDbType.VarChar).Value = code;
com4.Parameters.Add("@tCode", SqlDbType.VarChar).Value = tCode;

【讨论】:

  • 像魅力一样工作,我在想任何方式它将 int 转换为 varchar 致盲,而不考虑数据类型优先级,谢谢。
  • @krishnakumar:您知道始终使用正确的类型并避免隐式转换是多么重要。
  • 是的,先生,我职业生涯开始时从你那里学到的最重要的一课。谢谢。
猜你喜欢
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多