阅读器关闭时尝试调用 Read 无效。

bulls5988 2010-11-05 09:33:37
现在提示我这段的我并没有关闭rs1啊,为什么?

而且是在触发第二次:
if (e.KeyCode == Keys.Space)
{
if(lst.Count>1)
{
timer1.Enabled = true;
}
else
{
MessageBox.Show("奖品数量不足", "抽奖信息出错");
}
//开始抽奖
}
才出现错误


SqlConnection con = new SqlConnection(conn_str);
SqlCommand command1 = new SqlCommand(sql_str, con);
con.Open();
SqlDataReader rs1 = command1.ExecuteReader();
while (rs1.Read())
{
try
{
if (File.Exists(rs1[1].ToString()))
{
cj_names = rs1[1].ToString();
cj_pic_path = rs1[3].ToString();
cj_id = rs1[0].ToString();
names.Add(cj_names);
id.Add(cj_id);
lst.Add(Image.FromFile(cj_pic_path));
//重新从数据库装载LIST图片信息
}
}

catch (FileNotFoundException)
{
//忽略错误地址图片继续装入下一条图片记录
}
con.Close();
}


while (rs1.Read()),阅读器关闭时尝试调用 Read 无效。



namespace cj_sys
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
int i = 0;
List<Image> lst = new List<Image>();
List<string> names = new List<string>();
List<string> id = new List<string>();
string conn_str = "Server=*;Database=*;uid=sa;pwd=*";
string sql_str = "select * from cj_main where cj_show_counts>0";
string sql_update;
string cj_pic_path;
string cj_names;
string cj_id;

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Space)
{
if(lst.Count>0)
{
timer1.Enabled = true;
}
else
{
MessageBox.Show("奖品数量不足", "抽奖信息出错");
}
//开始抽奖
}
if (e.KeyCode == Keys.Enter)
{
timer1.Enabled = false;
if (lst.Count > 1)
{
string ids = label3.Text;
//确定抽奖结果

sql_update = "update cj_main set cj_show_counts =
cj_show_counts-1 where cj_id='" + Convert.ToInt32(ids) + "'";
SqlConnection conn = new SqlConnection(conn_str);
SqlCommand update = new SqlCommand(sql_update, conn);
conn.Open();
update.ExecuteNonQuery();
conn.Close();
lst.Clear();
names.Clear();
id.Clear();
//更新抽中图片记录的次数

SqlConnection con = new SqlConnection(conn_str);
SqlCommand command1 = new SqlCommand(sql_str, con);
con.Open();
SqlDataReader rs1 = command1.ExecuteReader();
while (rs1.Read())
{
try
{
if (File.Exists(rs1[1].ToString()))
{
cj_names = rs1[1].ToString();
cj_pic_path = rs1[3].ToString();
cj_id = rs1[0].ToString();
names.Add(cj_names);
id.Add(cj_id);
lst.Add(Image.FromFile(cj_pic_path));
//重新从数据库装载LIST图片信息
}
}

catch (FileNotFoundException)
{
//忽略错误地址图片继续装入下一条图片记录
}
con.Close();
}
}
else
{
timer1.Enabled = false;
lst.Clear();
names.Clear();
id.Clear();
MessageBox.Show("奖品数量不足","抽奖信息出错");
//处理剩余奖品数量不足以继续抽奖,终止。
}
}
if (e.KeyData == Keys.Escape)

{
Application.Exit();
//退出程序
}
}

private void Form1_Load(object sender, EventArgs e)
{
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;

SqlConnection conn = new SqlConnection(conn_str);
SqlCommand command = new SqlCommand(sql_str, conn);
conn.Open();
SqlDataReader rs = command.ExecuteReader();
try
{
while (rs.Read())
{
if (File.Exists(rs[3].ToString()))
{
cj_names = rs[1].ToString();
cj_pic_path = rs[3].ToString();
cj_id = rs[0].ToString();
names.Add(cj_names);
id.Add(cj_id);
lst.Add(Image.FromFile(cj_pic_path));
//从数据库中取得图片信息
}
}
}
catch (FileNotFoundException)
{
//如果找不到图片继续寻找下一条记录
}
conn.Close();
}

private void timer1_Tick(object sender, EventArgs e)
{
if (lst.Count > 1)
{
pictureBox1.Image = lst[i];
label1.Text = names[i];
label3.Text = id[i];
i++;
if (i >= lst.Count)
{
i = 0;
}
//窗体初始装载LIST图片
}
else
{

lst.Clear();
names.Clear();
id.Clear();
timer1.Enabled = false;
MessageBox.Show("奖品数量不足", "抽奖信息出错");
//数据库中已没有符合条件的记录
}

}

}
}

...全文
1538 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
houyanglie 2011-08-12
  • 打赏
  • 举报
回复
为什么?
houyanglie 2011-08-12
  • 打赏
  • 举报
回复
为什么
孟子E章 2010-11-06
  • 打赏
  • 举报
回复
con.Close(); 连接关闭了,rs1也就关闭了,所以,你只能循环完毕才能执行 con.Close();
winner2050 2010-11-06
  • 打赏
  • 举报
回复
 catch (FileNotFoundException)
{
//忽略错误地址图片继续装入下一条图片记录
}
con.Close();
}


catch (FileNotFoundException)
{
//如果找不到图片继续寻找下一条记录
}
conn.Close();


两个地方时错误的。

确定不读取数据以后才能关闭。
特别 2010-11-05
  • 打赏
  • 举报
回复
从你这个来看,应该能取一条数据,然后就报错了
特别 2010-11-05
  • 打赏
  • 举报
回复

while (rs1.Read())
{
try
{
if (File.Exists(rs1[1].ToString()))
{
cj_names = rs1[1].ToString();
cj_pic_path = rs1[3].ToString();
cj_id = rs1[0].ToString();
names.Add(cj_names);
id.Add(cj_id);
lst.Add(Image.FromFile(cj_pic_path));
//重新从数据库装载LIST图片信息
}
}

catch (FileNotFoundException)
{
//忽略错误地址图片继续装入下一条图片记录
}
con.Close(); //关闭连接不能放在循环里面,这样你最多只能读一条数据,然后就报你所讲的错误
}



应该将con.Close();放到while循环外面
来自故乡的风 2010-11-05
  • 打赏
  • 举报
回复
猜一句:是不是下标超出范围了(rs[3])?

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧