读书人

数据库操作的有关问题

发布时间: 2012-02-26 20:19:44 作者: rapoo

数据库操作的问题
public SqlDataReader selectlendrtnrec(string readerid, string bookid)//查询是否这位读者借阅了这本图书
{
string cmdtext = "select * from lendrtnrec where readerid= " + " ' " + readerid + " ' " + "and bookid= " + " ' " + bookid + " ' ";
SqlCommand mycommand = new SqlCommand(cmdtext, myconn);
myconn.Open();
SqlDataReader dr = mycommand.ExecuteReader(CommandBehavior.CloseConnection);

return dr;
}
public int returnbook(string readerid, string bookid)//归还图书,操作lendrtnrec,readerinfo,bookinfo三个表
{
string cmdtext1 = "delete lendrtnrec where readerid= " + " ' " + readerid + " ' " + "and bookid= " + " ' " + bookid + " ' ";
string cmdtext2= "update readerinfo set 借书总数 =借书总数-1,未还书数=未还书数-1 where 编号= "+ " ' "+readerid + " ' ";
string cmdtext3 = "update bookinfo set 数量=数量+1 where 图书编号= " + " ' " + bookid + " ' ";
myconn.Open ();
SqlCommand mycommand1 = new SqlCommand(cmdtext1, myconn);
SqlCommand mycommand2 = new SqlCommand(cmdtext2, myconn);
SqlCommand mycommand3 = new SqlCommand(cmdtext3, myconn);
mycommand2.ExecuteNonQuery();
mycommand3.ExecuteNonQuery();
int nresult = mycommand1.ExecuteNonQuery();
myconn.Close();
return nresult;



}
private void button1_Click(object sender, EventArgs e)
{
SqlDataReader dr = user.selectlendrtnrec(textBox1.Text, textBox2.Text);
string ss = " ";
if (dr.Read())
{
ss = dr[0].ToString();
}
if (ss != " " && ss != null)
{

user.returnbook(textBox1.Text, textBox2.Text);
}
else { MessageBox.Show( "该读者未借阅该图书,请确认是否输错! "); }
}

我想先确认是否有这条记录,然后再执行returnbook,出现错误,连接未关闭。连接的当前状态为已打开。
请问怎么做才能成功?returnbook部分怎么才能做到3个表同时更新,而不是一个出现错误不能更新,而另外两个却更新了?

[解决办法]
把更新3个表的代码做成一个事务,出现错误即回滚即可。
[解决办法]
定义一StringBuilder类型变量 str
str.Append(cmdtext1).Append(cmdtext2).Append(cmdtext3);
myconn.Open ();
SqlCommand mycommand1 = new SqlCommand(str.ToString(), myconn);
int nresult = mycommand1.ExecuteNonQuery();
myconn.Close();
return nresult;

[解决办法]
注意哪个public SqlDataReader selectlendrtnrec(string readerid, string bookid)方法中返回的 dr, 这个东东用完(无论正常与否)就要调用其Close()方法关闭,否则该数据库连接将一直挂起(),这样使用SqlDataReader不是很好。另外数据库连接尽量用完就关闭。


[解决办法]
SQL 2005上有详细的代码讲解事务
[解决办法]
public bool selectlendrtnrec(string readerid, string bookid)//修改返回值为bool就足够了

returnbook使用事务
[解决办法]
用事务试试看……

读书人网 >C#

热点推荐