ASP.NET 4.6报错:将varchar值'YES'转换为int类型失败求助
解决GridView更新时"varchar转int失败"的问题
老兄,这个时效性极强的问题我太熟悉了!报错Conversion failed when converting the varchar value 'YES' to data type int的核心原因很明确:你数据库里对应列是int类型,但更新时传过去的是字符串'YES'/'NO',类型不匹配。下面给你几个快速解决的方案,按优先级来:
方案1:修改DropDownList的Value值为数字(最推荐)
直接让DropDownList提交数据库能识别的int值,文本显示YES/NO即可。比如你从数据库取选项数据时,把对应数字(比如1=YES,0=NO)设为DataValueField,文本设为DataTextField:
<EditItemTemplate> <asp:DropDownList ID="ddlYesNo" runat="server" DataSourceID="dsYesNoOptions" DataValueField="OptionValue" <!-- 这里绑定数字1/0 --> DataTextField="OptionText"> <!-- 这里绑定YES/NO --> </asp:DropDownList> <asp:SqlDataSource ID="dsYesNoOptions" runat="server" ConnectionString="<%$ ConnectionStrings:YourDBConn %>" SelectCommand="SELECT OptionValue, OptionText FROM YesNoOptions"> </asp:SqlDataSource> </EditItemTemplate>
这样用户看到的是YES/NO,但提交给数据库的是1/0,完美匹配int类型列,从根源解决问题。
方案2:在RowUpdating事件中手动转换值
如果暂时没法改DropDownList的绑定,就在GridView更新前把文本转成数字:
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) { // 找到编辑行里的DropDownList DropDownList ddlYesNo = (DropDownList)GridView1.Rows[e.RowIndex].FindControl("ddlYesNo"); if (ddlYesNo != null) { string selectedText = ddlYesNo.SelectedItem.Text; // 把YES/NO转成对应的int值 int dbValue = selectedText.Equals("YES", StringComparison.OrdinalIgnoreCase) ? 1 : 0; // 替换更新参数里的值 e.NewValues["YourTargetColumnName"] = dbValue; } }
记得把YourTargetColumnName换成你数据库里的实际列名。
方案3:检查SqlDataSource的更新参数配置
如果你的SqlDataSource直接绑定了GridView的更新操作,要确保更新参数的类型和数据库列一致:
<asp:SqlDataSource ID="dsGridView" runat="server" ConnectionString="<%$ ConnectionStrings:YourDBConn %>" UpdateCommand="UPDATE YourTable SET TargetColumn = @TargetVal WHERE Id = @RowId"> <UpdateParameters> <!-- 这里Type要设为Int32,匹配数据库的int列 --> <asp:Parameter Name="TargetVal" Type="Int32" /> <asp:Parameter Name="RowId" Type="Int32" /> </UpdateParameters> </asp:SqlDataSource>
如果之前参数类型设成了String,就会导致字符串转int失败。
先试试方案1,应该最快解决问题!如果还有细节卡壳,随时对照上面的代码调整。
内容的提问来源于stack exchange,提问作者NMeneses
相关产品推荐
相关产品推荐

