gpt4 book ai didi

c# - 是否可以使用 ExecuteReader() 两次?

转载 作者:行者123 更新时间:2023-11-29 04:30:02 24 4
gpt4 key购买 nike

我正在为名为 OTServer 的游戏服务器编写数据库管理器,但我第二次使用 executereader() 时遇到问题。这是代码:

    private void button1_Click(object sender, EventArgs e)
{
Form1 f = new Form1();
MySqlConnection conn = new MySqlConnection();
conn.ConnectionString = "Server=" + f.GetText1().Text + ";Username=" + f.GetText2().Text + ";Pwd=" + f.GetText3().Text + ";Database=" + f.GetText4().Text + ";";
conn.Open();
MySqlCommand cmd = new MySqlCommand("SELECT * FROM `players` WHERE name = @Name", conn);
cmd.Parameters.AddWithValue("@Name", textBox1.Text);

MySqlDataReader Reader = cmd.ExecuteReader(CommandBehavior.SingleRow);
while (Reader.Read())
{
label7.Text = (string)Reader[1];
label7.Show();
label8.Text = Reader[5].ToString();
label8.Show();
if ((int)Reader[6] == 1)
{
label9.Text = "Sorcerer (1)";
}
if ((int)Reader[6] == 2)
{
label9.Text = "Druid (2)";
}
if ((int)Reader[6] == 3)
{
label9.Text = "Paladin (3)";
}
if ((int)Reader[6] == 4)
{
label9.Text = "Knight (4)";
}

if ((int)Reader[6] == 0)
{
label9.Text = "None (0)";
}
label9.Show();

if ((int)Reader[3] == 1)
{
label10.Text = "Player";
}

if ((int)Reader[3] == 2)
{
label10.Text = "Tutor";
}

if ((int)Reader[3] == 3)
{
label10.Text = "Senior Tutor";
}

if ((int)Reader[3] == 4)
{
label10.Text = "Gamemaster";
}

if ((int)Reader[3] == 5)
{
label10.Text = "Community Manager";
}

if ((int)Reader[3] == 6)
{
label10.Text = "God";
}

if ((int)Reader[3] < 1 || (int)Reader[3] > 6)
{
label10.Text = "Unknown";
}

label10.Show();

label13.Text = "Account: " + Reader[4].ToString();
label13.Show();
}
Reader.Close();

cmd = new MySqlCommand("SELECT * FROM accounts WHERE id = @Account_ID", conn);
cmd.Parameters.AddWithValue("@Account_ID", label13.Text);
Reader = cmd.ExecuteReader(CommandBehavior.SingleRow);

while (Reader.Read())
{
label11.Text = (string)Reader[0];
label11.Show();
}
Reader.Close();
}

最佳答案

建议的解决方案:尝试在您的DataReader 周围放置一个using block ,或对其调用Dispose:

using (DataReader Reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
{
// ...do something with your data reader... then finish by:
Reader.Close();
} // <-- Reader.Dispose() called automatically at the end of using block.

// ...prepare second command...

// the same again for the second command:
using (DataReader Reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
{
// ...
Reader.Close();
}

问题的假定原因:数据库连接对象可能会进行一些内部簿记以跟踪数据读取器。我发现在类似的情况下,您一次只能使用一个 DataReader。所以我相信你的代码的问题在于,当你Close Reader时,你没有明确地Disposed,所以连接当您执行第二个数据读取器时,对象认为第一个数据读取器仍在使用中。


此外...为什么不简化这段代码:

        if ((int)Reader[6] == 1)
{
label9.Text = "Sorcerer (1)";
}
if ((int)Reader[6] == 2)
{
label9.Text = "Druid (2)";
}
...

switch 语句?:

        int x = (int)(Reader[6]);
string label9Text = string.Empty;

switch (x)
{
case 1: label9Text = "Sorcerer (1)"; break;
case 2: label9Text = "Druid (2)"; break;
...
}

label9.Text = label9Text;

(这样可以避免大量重复输入。)

关于c# - 是否可以使用 ExecuteReader() 两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4238084/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com