c# - System.Data.SqlClient.SqlException 转换
问题描述
System.Data.SqlClient.SqlException:将 varchar 值“System.Data.DataRowView”转换为数据类型 int 时转换失败。
如何转换?
public partial class FrmItems : MaterialSkin.Controls.MaterialForm
{
SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=G:\Users\Admin\source\repos\Elektrokalkulace\Sklad.mdf;Integrated Security=True;Connect Timeout=30");
SqlDataAdapter dt;
DataTable dtCategories = new DataTable();
DataTable dtSubCategories = new DataTable();
DataTable dtItems = new DataTable();
public FrmItems()
{
InitializeComponent();
dt = new SqlDataAdapter("SELECT * FROM Categories", conn);
dt.Fill(dtCategories);
CbxCat.DataSource = dtCategories;
CbxCat.DisplayMember = "NameCat";
CbxCat.ValueMember = "CatId";
var skinManager = MaterialSkinManager.Instance;
skinManager.AddFormToManage(this);
skinManager.Theme = MaterialSkinManager.Themes.DARK;
skinManager.ColorScheme = new ColorScheme(Primary.BlueGrey800, Primary.BlueGrey900, Primary.BlueGrey500, Accent.LightBlue200, TextShade.WHITE);
}
private void FrmItems_Load(object sender, EventArgs e)
{
// TODO: Tento řádek načte data do tabulky 'skladDataSet.Items'. Můžete jej přesunout nebo jej odstranit podle potřeby.
this.itemsTableAdapter.Fill(this.skladDataSet.Items);
}
private void CbxCat_SelectedIndexChanged(object sender, EventArgs e)
{
dtSubCategories.Clear();
dt = new SqlDataAdapter("SELECT * FROM Subcategories WHERE CatId='"+ CbxCat.SelectedValue +"'", conn);
dt.Fill(dtSubCategories);
CbxSubcat.DataSource = dtSubCategories;
CbxSubcat.DisplayMember = "NameSubCat";
CbxSubcat.ValueMember = "SubCatId";
}
private void CbxSubcat_SelectedIndexChanged(object sender, EventArgs e)
{
dtItems.Clear();
dt = new SqlDataAdapter("SELECT * FROM Items WHERE SubCatId='" + CbxSubcat.SelectedValue + "'", conn);
dt.Fill(dtItems);
dataGridViewItem.DataSource = dtItems;
}
private void pictureBox1_Click(object sender, EventArgs e)
{
FrmHlavniMenu menu = new FrmHlavniMenu();
menu.Show();
this.Hide();
}
}
解决方案
你声称它在下面的第二行失败了?
dt = new SqlDataAdapter("SELECT * FROM Subcategories WHERE CatId='"+ CbxCat.SelectedValue +"'", conn);
dt.Fill(dtSubCategories);
如果 CatId 是一个 INT,那么这将因为值周围的撇号 (') 而失败。请使用参数:
dt = new SqlDataAdapter("SELECT * FROM Subcategories WHERE CatId = @CatId", conn);
dt.SelectCommand.Parameters.AddWithValue("@CatId", CbxCat.SelectedValue);
dt.Fill(dtSubCategories);
其次,什么是类型CbxCat.SelectedValue
?如果它返回一个字符串,那么您需要将值解析为整数:int.Parse(CbxCat.SelectedValue)
但异常表明它实际上是 type System.Data.DataRowView
。在这种情况下,您需要访问该item
属性,例如,CbxCat.SelectedValue["CategoryId"]
有关 DataRowView 的更多信息,请参阅: https ://docs.microsoft.com/en-us/dotnet/api/system.data.datarowview.item?view=netframework-4.8#System_Data_DataRowView_Item_System_String_
推荐阅读
- java - 类中定义的枚举是静态嵌套类吗?
- javascript - 向我的 MongoDB 添加日期
- ios - Swift - 为什么我的函数中的函数没有被调用?
- regex - 正则表达式 -> 匹配 000001 和 999999 之间的数字
- java - 如何在条件下设置/调用对象和方法
- promise - 如何将承诺错误转换为自定义类型?
- elasticsearch - elasticsearch 无法识别阿拉伯字符
- javascript - 自调用 JavaScript 函数是否会导致堆栈溢出异常
- azure - 如何使用 Azure SignalR 获取集线器上下文?
- django - %5E 被插入反向 url