C# System.Data.SqlClient.SqlException转换

C# System.Data.SqlClient.SqlException转换,c#,C#,System.Data.SqlClient.SqlException:转换时转换失败 将varchar值“System.Data.DataRowView”设置为数据类型int 如何转换 public partial class FrmItems : MaterialSkin.Controls.MaterialForm { SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDb

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)

但例外情况表明它实际上属于
System.Data.DataRowView
类型。在这种情况下,您需要访问
属性,例如,
CbxCat.SelectedValue[“CategoryId”]

有关DataRowView的更多信息,请参阅:

我终于这样解决了。这花了我很多努力,但值得。谢谢大家的支持,非常感谢

在这里输入代码

public partial class FrmItems : MaterialSkin.Controls.MaterialForm
{
    SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=G:\Users\Admin\source\repos\Elektrokalkulace\Stock.mdf;Integrated Security=True;Connect Timeout=30");

    int CatId;

    public FrmItems()
    {
        InitializeComponent();

        refreshCat();

        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)
    {

    }
    private void refreshCat()
    {
        conn.Open();
        SqlCommand cmd = new SqlCommand("SELECT * FROM Categories", conn);
        SqlDataAdapter sda = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        sda.Fill(dt);
        conn.Close();
        CbxCat.DisplayMember = "NameCat";
        CbxCat.ValueMember = "CatId";
        CbxCat.DataSource = dt;
    }


    private void CbxCat_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (CbxCat.SelectedValue.ToString() != null)
        {
            CatId = Convert.ToInt32(CbxCat.SelectedValue.ToString());

            refreshSubcat(CatId);
        }
    }

    private void refreshSubcat(int CatId)
    {
        conn.Open();
        SqlCommand cmd = new SqlCommand("SELECT * FROM Subcategories WHERE CatId=@CatId", conn);
        cmd.Parameters.AddWithValue("CatId", CatId);
        SqlDataAdapter sda = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        sda.Fill(dt);
        conn.Close();
        CbxSubcat.DisplayMember = "NameSubcat";
        CbxSubcat.ValueMember = "SubcatId";
        CbxSubcat.DataSource = dt;
    }   
    private void CbxSubcat_SelectedIndexChanged(object sender, EventArgs e)
    {
        conn.Open();
        SqlCommand cmd = new SqlCommand("SELECT * FROM Items WHERE SubCatId='" + CbxSubcat.SelectedValue + "'", conn);
        SqlDataAdapter sda = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        sda.Fill(dt);
        conn.Close();
        dataGridViewItem.DataSource = dt;

    }


    private void pictureBox1_Click(object sender, EventArgs e)
    {
        FrmMainMenu menu = new FrmMainMenu();
        menu.Show();
        this.Hide();
    }
}
enter code here

您能否共享异常的完整堆栈跟踪?哪一行抛出错误?dt.Fill(dtSubCategories);当然,如果我将数据库中的主键从int改为varchar,它就会工作。但是我的意图是让主键保持为int,外键保持为int,这对某些人来说很简单,但我只在第一个月编程。我是初学者。感谢您的帮助,写道“System.ArgumentException:没有从System.Data.DataRowView类型对象映射到已知的本机类型托管提供程序。”@pokerista yes-您没有正确解析值。尝试使用:
CbxCat.Text
。即
int.Parse(CbxCat.Text)