尝试在数据库中查找值时出错

时间:2013-01-31 18:18:42

标签: c# database compiler-errors

所以我有textboxbutton。我想在textbox中输入一个值,它会在row所调用的'机票'中找到我在table中输入的值。我还想创建一个'回扣单' object中的table被称为“Rebateslip'”。这个table有2个字段 - id是自动增量的,而ticketId是我在textbox中输入的值(所以基本上我只是通过了ticketId我刚刚进入了“RebateSlip”表格。我将所有功能都放在class名为'模型'然后我在button事件处理程序中调用它们。

 public bool rebateslip(int ticketID)
    {
        SqlCommand myCommand = new SqlCommand("SELECT ID FROM ticket WHERE ID = @ticketID", con);
        SqlDataAdapter sqlDa = new SqlDataAdapter(myCommand);

        myCommand.Parameters.AddWithValue("@ticketID", ticketID);
        var reader = myCommand.ExecuteReader();
        return reader.HasRows;

    }

    public void createRebateslip(int ticketId)
    {
        SqlCommand myCommand = new SqlCommand("INSERT INTO RebateSlip (ticketId) VALUES (@ticketId); SELECT SCOPE_IDENTITY();", con);
        myCommand.Parameters.AddWithValue("@ticketId", ticketId);
        string insertID = (myCommand.ExecuteScalar()).ToString();
        rebateSlipList.Add(new RebateSlip(Int32.Parse(insertID), ticketId));
    }

它适用于一个数字,但是如果我尝试在textbox中输入另一个数字我得到错误,那么已经有一个与命令关联的开放DataReader,必须先关闭它。 这是按钮的代码。如果在表格中找到了该值,那么可以使用' rebatelip'应该创建,但这也无法正常工作。

 private void buttonPrintRebateSlip_Click(object sender, EventArgs e)
    {

        int id;
        if (!int.TryParse(textBoxRebateSlip.Text, out id))
        {
            return;
        }
        if (model.rebateslip(id))
        {
            MessageBox.Show("Found ticket");
            //create rebate slip object
            model.createRebateslip(id);
            textBoxRebateSlip.Clear();
        }
        else
        {
            MessageBox.Show("Ticket not in database");
            textBoxRebateSlip.Clear();
        }

    }

3 个答案:

答案 0 :(得分:2)

摘自SqlDataReader.Close Method

  

使用时必须显式调用Close方法   SqlDataReader使用关联的SqlConnection进行任何其他操作   目的

您应该使用using Statement

public bool rebateslip(int ticketID)
{
    using(SqlCommand myCommand = new SqlCommand("SELECT ID FROM ticket WHERE ID = @ticketID", con))
    {
        using(SqlDataAdapter sqlDa = new SqlDataAdapter(myCommand))
        {

            myCommand.Parameters.AddWithValue("@ticketID", ticketID);
            using(var reader = myCommand.ExecuteReader())
            {
                return reader.HasRows;
            } 
        }
    }
}

无论如何,你的sqlDa SqlDataAdapter在上下文中没有任何意义。可能你只需要:

public bool rebateslip(int ticketID)
{
    using(SqlCommand myCommand = new SqlCommand("SELECT ID FROM ticket WHERE ID = @ticketID", con))
    {
        myCommand.Parameters.AddWithValue("@ticketID", ticketID);
        using(var reader = myCommand.ExecuteReader())
        {
            return reader.HasRows;
        }
    }
}

答案 1 :(得分:0)

reader.close一旦你完成了它。

此外 - 您应该使用usingtry...catch

答案 2 :(得分:0)

这样你就永远不会有读者变量。使用范例仍然更好。

    public bool rebateslip(int ticketID)
    {
        SqlCommand myCommand = new SqlCommand("SELECT ID FROM ticket WHERE ID = @ticketID", con);
        SqlDataAdapter sqlDa = new SqlDataAdapter(myCommand);

        myCommand.Parameters.AddWithValue("@ticketID", ticketID);
        return myCommand.ExecuteReader().HasRows;
    }

    public void createRebateslip(int ticketId)
    {
        SqlCommand myCommand = new SqlCommand("INSERT INTO RebateSlip (ticketId) VALUES (@ticketId); SELECT SCOPE_IDENTITY();", con);
        myCommand.Parameters.AddWithValue("@ticketId", ticketId);
        int insertID = (int)myCommand.ExecuteScalar();
        rebateSlipList.Add(new RebateSlip(insertID, ticketId));
    }

此外,您似乎将ticketID存储在Ticket表中的Insert表(来自insertID)和insertID中(来自ticketID)。相反,您应该使用第三个表,其中只存储insertID&ticket和TickID,允许多个到多个关系,同时允许通过单个操作更改/删除它们。