我会发现一个错误:system.invalidoperationException:'该连接已经打开。'
我认为我的代码没有任何问题,如果我犯了一个错误或关闭连接的错误,我会检查千次。我无法弄清楚,请帮助我:/
如果您发现问题,请让我知道我需要做什么。基本上,我需要做的是当所选列更改datagrid中时,我想达到该行的ID并获取所有数据并将它们放在我的表单上,
谢谢并度过美好的一天
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp111
{
public partial class Form1 : Form
{
OleDbConnection baglanti = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source= hasta_bilgisi.accdb");
DataTable veritablosu = new DataTable();
public Form1()
{
InitializeComponent();
}
private void button_cikis_Click(object sender, EventArgs e)
{
this.Close();
}
private void Form1_Load(object sender, EventArgs e)
{
veritablosu.Columns.Add("hasta_id");
veritablosu.Columns.Add("isim");
veritablosu.Columns.Add("d_tarihi");
veritablosu.Columns.Add("d_yeri");
veritablosu.Columns.Add("kan_grubu");
veritablosu.Columns.Add("cinsiyet");
veritablosu.Columns.Add("adres");
veritablosu.Columns.Add("tel");
baglanti.Open();
OleDbCommand komut = new OleDbCommand("select * from tbl_Hasta where isim Like 'A%'", baglanti);
OleDbDataReader okuyucu = komut.ExecuteReader();
DataRow satır = veritablosu.NewRow();
while (okuyucu.Read())
{
satır = veritablosu.NewRow();
satır[0] = okuyucu[0].ToString();
satır[1] = okuyucu[1].ToString();
satır[2] = okuyucu[2].ToString();
satır[3] = okuyucu[3].ToString();
satır[4] = okuyucu[4].ToString();
satır[5] = okuyucu[5].ToString();
satır[6] = okuyucu[6].ToString();
satır[7] = okuyucu[7].ToString();
veritablosu.Rows.Add(satır);
}
dataGridView1.DataSource = veritablosu;
baglanti.Close();
}
private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
veritablosu.Clear();
if (tabControl1.SelectedIndex == 0)
{
baglanti.Open();
OleDbCommand komut = new OleDbCommand("select * from tbl_Hasta where isim Like 'A%'", baglanti);
OleDbDataReader okuyucu = komut.ExecuteReader();
DataRow satır = veritablosu.NewRow();
while (okuyucu.Read())
{
satır = veritablosu.NewRow();
satır[0] = okuyucu[0].ToString();
satır[1] = okuyucu[1].ToString();
satır[2] = okuyucu[2].ToString();
satır[3] = okuyucu[3].ToString();
satır[4] = okuyucu[4].ToString();
satır[5] = okuyucu[5].ToString();
satır[6] = okuyucu[6].ToString();
satır[7] = okuyucu[7].ToString();
veritablosu.Rows.Add(satır);
}
dataGridView1.DataSource = veritablosu;
baglanti.Close();
}
else if (tabControl1.SelectedIndex == 1)
{
baglanti.Open();
OleDbCommand komut = new OleDbCommand("select * from tbl_Hasta where isim Like 'B%' or isim Like 'C%' or isim Like 'D%'", baglanti);
OleDbDataReader okuyucu = komut.ExecuteReader();
DataRow satır = veritablosu.NewRow();
while (okuyucu.Read())
{
satır = veritablosu.NewRow();
satır[0] = okuyucu[0].ToString();
satır[1] = okuyucu[1].ToString();
satır[2] = okuyucu[2].ToString();
satır[3] = okuyucu[3].ToString();
satır[4] = okuyucu[4].ToString();
satır[5] = okuyucu[5].ToString();
satır[6] = okuyucu[6].ToString();
satır[7] = okuyucu[7].ToString();
veritablosu.Rows.Add(satır);
}
dataGridView1.DataSource = veritablosu;
baglanti.Close();
}
else if (tabControl1.SelectedIndex == 2)
{
baglanti.Open();
OleDbCommand komut = new OleDbCommand("select * from tbl_Hasta where isim Like 'E%'", baglanti);
OleDbDataReader okuyucu = komut.ExecuteReader();
DataRow satır = veritablosu.NewRow();
while (okuyucu.Read())
{
satır = veritablosu.NewRow();
satır[0] = okuyucu[0].ToString();
satır[1] = okuyucu[1].ToString();
satır[2] = okuyucu[2].ToString();
satır[3] = okuyucu[3].ToString();
satır[4] = okuyucu[4].ToString();
satır[5] = okuyucu[5].ToString();
satır[6] = okuyucu[6].ToString();
satır[7] = okuyucu[7].ToString();
veritablosu.Rows.Add(satır);
}
dataGridView1.DataSource = veritablosu;
baglanti.Close();
}
else if (tabControl1.SelectedIndex == 3)
{
baglanti.Open();
OleDbCommand komut = new OleDbCommand("select * from tbl_Hasta where isim Like 'F%' or isim Like 'G%' or isim Like 'H%'", baglanti);
OleDbDataReader okuyucu = komut.ExecuteReader();
DataRow satır = veritablosu.NewRow();
while (okuyucu.Read())
{
satır = veritablosu.NewRow();
satır[0] = okuyucu[0].ToString();
satır[1] = okuyucu[1].ToString();
satır[2] = okuyucu[2].ToString();
satır[3] = okuyucu[3].ToString();
satır[4] = okuyucu[4].ToString();
satır[5] = okuyucu[5].ToString();
satır[6] = okuyucu[6].ToString();
satır[7] = okuyucu[7].ToString();
veritablosu.Rows.Add(satır);
}
dataGridView1.DataSource = veritablosu;
baglanti.Close();
}
else if (tabControl1.SelectedIndex == 4)
{
baglanti.Open();
OleDbCommand komut = new OleDbCommand("select * from tbl_Hasta where isim Like 'I%' or isim Like 'İ%' ", baglanti);
OleDbDataReader okuyucu = komut.ExecuteReader();
DataRow satır = veritablosu.NewRow();
while (okuyucu.Read())
{
satır = veritablosu.NewRow();
satır[0] = okuyucu[0].ToString();
satır[1] = okuyucu[1].ToString();
satır[2] = okuyucu[2].ToString();
satır[3] = okuyucu[3].ToString();
satır[4] = okuyucu[4].ToString();
satır[5] = okuyucu[5].ToString();
satır[6] = okuyucu[6].ToString();
satır[7] = okuyucu[7].ToString();
veritablosu.Rows.Add(satır);
}
dataGridView1.DataSource = veritablosu;
baglanti.Close();
}
else if (tabControl1.SelectedIndex == 5)
{
baglanti.Open();
OleDbCommand komut = new OleDbCommand("select * from tbl_Hasta where isim Like 'J%' or isim Like 'K%' or isim Like 'L%' or isim Like 'M%' or isim Like 'N%'", baglanti);
OleDbDataReader okuyucu = komut.ExecuteReader();
DataRow satır = veritablosu.NewRow();
while (okuyucu.Read())
{
satır = veritablosu.NewRow();
satır[0] = okuyucu[0].ToString();
satır[1] = okuyucu[1].ToString();
satır[2] = okuyucu[2].ToString();
satır[3] = okuyucu[3].ToString();
satır[4] = okuyucu[4].ToString();
satır[5] = okuyucu[5].ToString();
satır[6] = okuyucu[6].ToString();
satır[7] = okuyucu[7].ToString();
veritablosu.Rows.Add(satır);
}
dataGridView1.DataSource = veritablosu;
baglanti.Close();
}
else if (tabControl1.SelectedIndex == 6)
{
baglanti.Open();
OleDbCommand komut = new OleDbCommand("select * from tbl_Hasta where isim Like 'O%' or isim Like 'Ö%' ", baglanti);
OleDbDataReader okuyucu = komut.ExecuteReader();
DataRow satır = veritablosu.NewRow();
while (okuyucu.Read())
{
satır = veritablosu.NewRow();
satır[0] = okuyucu[0].ToString();
satır[1] = okuyucu[1].ToString();
satır[2] = okuyucu[2].ToString();
satır[3] = okuyucu[3].ToString();
satır[4] = okuyucu[4].ToString();
satır[5] = okuyucu[5].ToString();
satır[6] = okuyucu[6].ToString();
satır[7] = okuyucu[7].ToString();
veritablosu.Rows.Add(satır);
}
dataGridView1.DataSource = veritablosu;
baglanti.Close();
}
else if (tabControl1.SelectedIndex == 7)
{
baglanti.Open();
OleDbCommand komut = new OleDbCommand("select * from tbl_Hasta where isim Like 'P%' or isim Like 'T%' or isim Like 'R%' or isim Like 'S%' ", baglanti);
OleDbDataReader okuyucu = komut.ExecuteReader();
DataRow satır = veritablosu.NewRow();
while (okuyucu.Read())
{
satır = veritablosu.NewRow();
satır[0] = okuyucu[0].ToString();
satır[1] = okuyucu[1].ToString();
satır[2] = okuyucu[2].ToString();
satır[3] = okuyucu[3].ToString();
satır[4] = okuyucu[4].ToString();
satır[5] = okuyucu[5].ToString();
satır[6] = okuyucu[6].ToString();
satır[7] = okuyucu[7].ToString();
veritablosu.Rows.Add(satır);
}
dataGridView1.DataSource = veritablosu;
baglanti.Close();
}
else if (tabControl1.SelectedIndex == 8)
{
baglanti.Open();
OleDbCommand komut = new OleDbCommand("select * from tbl_Hasta where isim Like 'U%' or isim Like 'Ü%' ", baglanti);
OleDbDataReader okuyucu = komut.ExecuteReader();
DataRow satır = veritablosu.NewRow();
while (okuyucu.Read())
{
satır = veritablosu.NewRow();
satır[0] = okuyucu[0].ToString();
satır[1] = okuyucu[1].ToString();
satır[2] = okuyucu[2].ToString();
satır[3] = okuyucu[3].ToString();
satır[4] = okuyucu[4].ToString();
satır[5] = okuyucu[5].ToString();
satır[6] = okuyucu[6].ToString();
satır[7] = okuyucu[7].ToString();
veritablosu.Rows.Add(satır);
}
dataGridView1.DataSource = veritablosu;
baglanti.Close();
}
else if (tabControl1.SelectedIndex == 9)
{
baglanti.Open();
OleDbCommand komut = new OleDbCommand("select * from tbl_Hasta where isim Like 'V%' or isim Like 'Y%' or isim Like 'Z%'", baglanti);
OleDbDataReader okuyucu = komut.ExecuteReader();
DataRow satır = veritablosu.NewRow();
while (okuyucu.Read())
{
satır = veritablosu.NewRow();
satır[0] = okuyucu[0].ToString();
satır[1] = okuyucu[1].ToString();
satır[2] = okuyucu[2].ToString();
satır[3] = okuyucu[3].ToString();
satır[4] = okuyucu[4].ToString();
satır[5] = okuyucu[5].ToString();
satır[6] = okuyucu[6].ToString();
satır[7] = okuyucu[7].ToString();
veritablosu.Rows.Add(satır);
}
dataGridView1.DataSource = veritablosu;
baglanti.Close();
}
}
private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
if (dataGridView1.CurrentRow != null)
{
int id = Convert.ToInt32(dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[0].Value);
baglanti.Open();
OleDbCommand komut = new OleDbCommand("select * from tbl_Hasta where hasta_id=" + id, baglanti);
OleDbDataReader okuyucu = komut.ExecuteReader();
while (okuyucu.Read())
{
textBox_isim.Text = okuyucu[1].ToString();
textBox_dogumtarih.Text = okuyucu[2].ToString();
comboBox_dogumyer.Text = okuyucu[3].ToString();
comboBox_kangrp.Text = okuyucu[4].ToString();
if (okuyucu[5].ToString() == "E")
{
radioButton_erkek.Checked = true;
}
else
{
radioButton_kadin.Checked = true;
}
richTextBox_adres.Text = okuyucu[6].ToString();
textBox_tel.Text = okuyucu[7].ToString();
}
dataGridView1.DataSource = veritablosu;
baglanti.Close();
}
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
不要在班级级别保持连接;忘记关闭它或遇到某些例外,这太容易了,这意味着它没有关闭,或者遇到了另一个“已经有一个与...相关的开放式读者……”,如果您要共享连接。
如果必须,请按住连接字符串(但是还有其他东西,例如设置是更好的地方)。每次您想要的时,都会使用使用
进行新连接。
将其放置将其关闭 - 少的代码行。连接很快就可以创建和相反,与您所相信的命名相反,当您致电/关闭时,它们不会打开和关闭与数据库的TCP(或其他慢速)连接 - 它们只是被租赁并从一个管理并为您回收的游泳池。通过抓住它们,您有可能消除泳池经理所做的所有好处;只需制作一个新的,如果您使用数据表,请在完成时将其扔掉open()
it,但是您可以使用,使生活变得轻松并使用DataAdapter:
这就是填充表所需的全部; DataAdapter将建立连接,打开它,运行读者,拉数据,关闭连接
。可以使用的猪)您可以使用强烈键入的数据表 - 请参阅我的答案 a>瞥见(详细介绍它将不超出SO答案的范围)
Do not hold connections at the class level; it's too easy to forget to close it, or encounter some exception that means it's not closed, or run into another "there is already an open reader associated with..." if you're sharing connections.
Hold the connection string if you must (but there are other things e.g. Settings that are better places for that). Make a new connection with
using
every time you want one.Open()
it, but you can leave the Dispose invoked byusing
to close it - one less line of code to write. Connections are fast to create and contra to what the naming might have you believe, they aren't opening and closing TCP (or some other slow) connection to the database when you call Open/Close - they're just being leased and returned from a pool that manages and recycles them for you. By holding onto them you risk undoing all the good that pool manager does; just make a new one, and throw it away when you're doneIf you're using datatables, make your life easy and use a DataAdapter:
That's all you need to fill the table; dataadapter will make the connection, open it, run the reader, pull the data, close the connection..
And then when you get tired of doing that and want some more help from VS to make life even easier (because base DataTable are largely a pig to work with) you can use strongly typed datatables - see my answer here for a glimpse (going into detail on it would be way out of scope of an SO answer) of what that looks like
问题在于存储连接而不是每个操作的打开/关闭。
Microsoft建议在使用它完成后始终关闭或处理连接,以返回到池的连接。未明确关闭的连接可能不会返回池。例如,一个已超出范围但尚未明确关闭的连接只有在达到最大池大小并且连接仍然有效的情况下才会返回连接池。
下面您可以找到一些示例:
也请不要忘记在创建实现Idisposable接口的类实例时使用使用。
The problem is with storing connection instead of open/close for each operation.
Microsoft recommends to always close or dispose of a connection when you are finished using it in order to return the connection to the pool. Connections that are not explicitly closed may not get returned to the pool. For example, a connection that has gone out of scope but that has not been explicitly closed will only be returned to the connection pool if the maximum pool size has been reached and the connection is still valid.
Microsoft article
Below you can find some example:
Also please do not forget to use using when creating an instance of classes which implements IDisposable interface.