所以我有textbox
和button
。我想在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();
}
}
答案 0 :(得分:2)
使用时必须显式调用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
一旦你完成了它。
此外 - 您应该使用using
或try...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,允许多个到多个关系,同时允许通过单个操作更改/删除它们。