首页 > 解决方案 > 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();
    }
}

标签: c#

解决方案


你声称它在下面的第二行失败了?

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_


推荐阅读