【问题标题】:c# Windows forms database issuec# Windows 窗体数据库问题
【发布时间】:2016-12-25 08:06:00
【问题描述】:

我正在尝试根据组合框中的名称从他们的表中获取制造商、供应商、项目组 ID。意味着我根据组合框中的名称将 id 传递给变量,然后将该 id 传递给数据库。但是当我运行这个应用程序时,我得到制造商、供应商和项目组变量的相同结果。这是为什么?

之前还可以,现在不行了!我想不通!

using (SqlConnection con = new SqlConnection(CS))
{
    con.Open();

    SqlCommand cmd = new SqlCommand("SELECT Manufact_Id from Manufacturer Where Name=@Name1", con);
    cmd.Parameters.AddWithValue("@Name1", combomanufacture_Createitem.Text);

    int a = Convert.ToInt32(cmd.ExecuteScalar());

    SqlCommand cmd2 = new SqlCommand("SELECT Supplier_Id from Supplier Where Supplier_Name=@Name2", con);
    cmd.Parameters.AddWithValue("@Name2", combo_supplierCreateitem.Text);

    int b = Convert.ToInt32(cmd.ExecuteScalar());

    SqlCommand cmd3 = new SqlCommand("SELECT ItemGroup_Id from ItemGroup Where Name=@Name3", con);
    cmd.Parameters.AddWithValue("@Name3", combo_itemgroupCreateitem.Text);

    int c = Convert.ToInt32(cmd.ExecuteScalar());

    try
    {
        SqlCommand cmd1 = new SqlCommand("INSERT INTO Items (Custom_Code, Name, Manufacturer, Supplier, Item_Group, Activate, Purchase_Rate, Landing_Cost, Profit_Percentage, Price_to_Customer, MRP,Opening_Stock, Manage_Stock, Description, Discount)  VALUES (@Customcode, @Name, @Manufacturer, @Supplier, @Itemgroup, @Activate, @Purchasedate, @Landingcost, @Profitpercentage, @PricetoCustomer, @MRP, @Openingstock, @Managestock, @Description1, @Discount)", con);

        cmd1.Parameters.AddWithValue("@Customcode", txt_customcode_Createitem.Text);
        cmd1.Parameters.AddWithValue("@Name", txt_nameCreateitem.Text);
        cmd1.Parameters.AddWithValue("@Manufacturer", a);
        cmd1.Parameters.AddWithValue("@Supplier", b);
        cmd1.Parameters.AddWithValue("@Itemgroup", c);
        cmd1.Parameters.AddWithValue("@Activate", combo_activateCreateitem.Text);
        cmd1.Parameters.AddWithValue("@Purchasedate", txt_purchasedateCreateitem.Text);
        cmd1.Parameters.AddWithValue("@Landingcost", txt_landingcosCreateitem.Text);
        cmd1.Parameters.AddWithValue("@Profitpercentage", txt_activateCreateitem.Text);
        cmd1.Parameters.AddWithValue("@PricetoCustomer", txt_PricetocustCreateitem.Text);
        cmd1.Parameters.AddWithValue("@MRP", txt_mrpCreateitem.Text);
        cmd1.Parameters.AddWithValue("@Openingstock", txt_openingstockCreateitem.Text);
        cmd1.Parameters.AddWithValue("@Managestock", combomanagestock_Createitem.Text);
        cmd1.Parameters.AddWithValue("@Description1", txt_descriptionCreateitem.Text);
        cmd1.Parameters.AddWithValue("@Discount", txt_DiscountCreateitem.Text);

        cmd1.ExecuteReader();

        MessageBox.Show("Items added Successfully");

        con.Close();
    }
    catch (Exception e1)
    {
        MessageBox.Show(e1 + "Please enter valid data");
    }
}

【问题讨论】:

  • 旁注:由于您不希望从您的INSERT 语句返回任何数据,您应该使用cmd1.ExecuteNonQuery(); 来执行它(而不是.ExecuteReader() 调用,它将返回一个@ 987654325@ 处理返回的结果集)

标签: c# .net sql-server winforms


【解决方案1】:

您正在创建新命令 (cmd2/cmd3) 但您设置了参数并执行旧实例.. (cmd)

所以你正在执行相同的 cmd,这就是你得到相同结果的原因:

SqlCommand cmd = new SqlCommand("SELECT Manufact_Id from Manufacturer Where Name=@Name1", con);
cmd.Parameters.AddWithValue("@Name1", combomanufacture_Createitem.Text);
int a = Convert.ToInt32(cmd.ExecuteScalar());

SqlCommand cmd2 = new SqlCommand("SELECT Supplier_Id from Supplier Where Supplier_Name=@Name2", con);
// HERE!!  cmd.Parameters... should be cmd2.Parameters
cmd.Parameters.AddWithValue("@Name2", combo_supplierCreateitem.Text);
int b = Convert.ToInt32(cmd.ExecuteScalar());

SqlCommand cmd3 = new SqlCommand("SELECT ItemGroup_Id from ItemGroup Where Name=@Name3", con);
// AND HERE  cmd.Parameters... should be cmd3
cmd.Parameters.AddWithValue("@Name3", combo_itemgroupCreateitem.Text);
// cmd.execute?  should be cmd3....
int c = Convert.ToInt32(cmd.ExecuteScalar());

复制/粘贴错误..

【讨论】:

  • 它一直在发生。问题是您再也看不到它了。这让这个网站令人难以置信,因为对其他人的全新看法会有所帮助!
  • 说实话不是复制粘贴!它是我写的。而且我不喜欢复制粘贴,这会让你成为一个懒惰的愚蠢程序员。所以你可以猜到,当你是初学者并编写自己的代码时......简单的错误会被忽视,后来让你发疯!感谢您的帮助!
【解决方案2】:

您正在为第二个和第三个命令执行第一个“cmd”。

SqlCommand cmd = new SqlCommand("SELECT Manufact_Id from Manufacturer Where Name=@Name1", con);
            cmd.Parameters.AddWithValue("@Name1", combomanufacture_Createitem.Text);
            int a = Convert.ToInt32(cmd.ExecuteScalar());

            SqlCommand cmd2 = new SqlCommand("SELECT Supplier_Id from Supplier Where Supplier_Name=@Name2", con);
            cmd.Parameters.AddWithValue("@Name2", combo_supplierCreateitem.Text);
            int b = Convert.ToInt32(cmd.ExecuteScalar());

            SqlCommand cmd3 = new SqlCommand("SELECT ItemGroup_Id from ItemGroup Where Name=@Name3", con);
            cmd.Parameters.AddWithValue("@Name3", combo_itemgroupCreateitem.Text);
            int c = Convert.ToInt32(cmd.ExecuteScalar());

应该是:

SqlCommand cmd = new SqlCommand("SELECT Manufact_Id from Manufacturer Where Name=@Name1", con);
            cmd.Parameters.AddWithValue("@Name1", combomanufacture_Createitem.Text);
            int a = Convert.ToInt32(cmd.ExecuteScalar());

            SqlCommand cmd2 = new SqlCommand("SELECT Supplier_Id from Supplier Where Supplier_Name=@Name2", con);
            cmd2.Parameters.AddWithValue("@Name2", combo_supplierCreateitem.Text); //UPDATED!
            int b = Convert.ToInt32(cmd2.ExecuteScalar()); //UPDATED!

            SqlCommand cmd3 = new SqlCommand("SELECT ItemGroup_Id from ItemGroup Where Name=@Name3", con);
            cmd3.Parameters.AddWithValue("@Name3", combo_itemgroupCreateitem.Text); //UPDATED!
            int c = Convert.ToInt32(cmd3.ExecuteScalar()); //UPDATED!

您可能复制/粘贴并忘记将 2 和 3 添加到 cmd 的末尾!

【讨论】:

  • 其实不是从其他网站复制粘贴。我创建了这个代码..虽然它不是一个大的逻辑代码。 bt 我也在其他形式中使用这种逻辑。作为一个初学者,我猜会发生这种愚蠢的错误,这也会让你发疯!!!!谢谢您的帮助! :)
猜你喜欢
  • 1970-01-01
  • 2019-07-13
  • 2012-01-04
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多