使用MySqlDataReader时出现致命错误
本文关键字:致命错误 MySqlDataReader 使用 | 更新日期: 2023-09-27 18:25:40
我的C#WinForms应用程序出现以下错误:
数据读取过程中遇到致命错误
我正在使用mysql.data V4.0.30319
。
这是我的代码:
int catCount = 1;
while (catCount < 13)
{
MySqlConnection con = new MySqlConnection("server=server;user id=user;password=password;database=db;");
con.Open();
MySqlDataReader Rd;
string query = "SELECT oc_newsletter_old_system.email FROM oc_newsletter_old_system WHERE oc_newsletter_old_system.cat_uid = " + catCount;
MySqlCommand mC = new MySqlCommand(query, con);
Rd = mC.ExecuteReader();
try
{
while (Rd.Read())
{
string email = Rd.GetString(0);
Boolean insert = true;
int realCat = 0;
switch (catCount)
{
case '1':
fileBrian += email + "'r'n";
break;
case '2':
fileDunamis += email + "'r'n";
break;
case '3':
fileFrohlich += email + "'r'n";
break;
case '4':
fileGaithers += email + "'r'n";
break;
case '5':
fileGospel7 += email + "'r'n";
break;
case '6':
fileLifeshop += email + "'r'n";
realCat = 1;
break;
case '7':
fileMeyer += email + "'r'n";
break;
case '8':
fileOpwekking += email + "'r'n";
break;
case '9':
filePelgrimKerken += email + "'r'n";
realCat = 2;
break;
case 10:
filePelgrimKlanten += email + "'r'n";
realCat = 2;
break;
case 11:
filePelgrimPers += email + "'r'n";
insert = false;
break;
case 12:
filePelgrimScholen += email + "'r'n";
insert = false;
break;
}
if (insert == true)
{
string salt = "h1bsqnp6wyxjxhf29ziuwsihg8nixe05";
byte[] asciiBytes = ASCIIEncoding.ASCII.GetBytes(salt + email);
byte[] hashedBytes = MD5CryptoServiceProvider.Create().ComputeHash(asciiBytes);
string hashedString = BitConverter.ToString(hashedBytes).Replace("-", "").ToLower();
string query2 = "INSERT IGNORE INTO `oc_ne_marketing` (`email`,`code`, `subscribed`, `store_id`) VALUES ('" + email + "', '" + hashedString + "', '1', '" + realCat + "')";
MySqlConnection connection = new MySqlConnection("server=server;user id=user;password=password;database=db;");
connection.Open();
try
{
MySqlCommand cmd1 = new MySqlCommand(query2, connection);
cmd1.CommandText = query2;
cmd1.ExecuteNonQuery();
cmd1.Dispose();
}
finally
{
connection.Close();
}
}
Application.DoEvents();
}
}
finally
{
Rd.Close();
con.Close();
}
catCount++;
progressBar1.PerformStep();
progressBar1.Refresh();
Application.DoEvents();
}
我在这一行得到错误:
while (Rd.Read())
到目前为止,我发现的唯一一件事是关闭阅读器和连接有问题,但据我所知,所有设置都是正确的。。。
你们知道怎么回事吗???
A2A,为了完整性。
从这里:
当时的解决方法是自定义net_xxx_timeout设置。对于例如,在打开连接之后和之前发出以下命令执行数据读取器:
var c = new MySqlCommand("set net_write_timeout=99999; set net_read_timeout=99999", con);
c.ExecuteNonQuery();
以下是连接类中MySql.Data
的来源:
protected override void Dispose(bool disposing)
{
if (State == ConnectionState.Open)
Close();
base.Dispose(disposing);
}
这基本上意味着处置就足以关闭它(否则就很奇怪了)。SqlConnection
也是如此。。
虽然不能直接回答您的问题,但根据您的请求,这里有一些关于using
的信息和代码示例。
将using
语句与实现IDisposable
的对象一起使用是公认的最佳实践——它本质上与try/finaly块做的事情相同。
一旦退出using语句的作用域(操作完成或抛出异常),就会对对象调用Dispose
。有关详细信息,请参阅使用语句。
下面是一个基于代码的缩写示例:
int catCount = 1;
string connectionString = "server=server;user id=user;password=password;database=db;"
string query = "SELECT email FROM oc_newsletter_old_system WHERE cat_uid=@cat_uid";
while (catCount < 13)
{
using (MySqlConnection con = new MySqlConnection(connectionString))
{
con.Open();
MySqlCommand mC = new MySqlCommand(query, con);
mC.Parameters.AddWithValue("@cat_uid", catCount);
using (MySqlDataReader Rd = mC.ExecuteReader())
{
while (Rd.Read())
{
// rest of your code here
}
}
}
}
请注意,以上内容基于.NET SqlConnection、SqlCommand和SqlDataReader类,但对于MySql应相同(或非常相似)。
我将连接字符串和查询字符串移动到它们自己的变量中(但这是个人偏好)。我还举了一个如何进行参数化查询的例子(mCParameters.AddWithValue
行-养成使用parmaeterized查询的习惯是(IMO)一件好事,尤其是当你从WinForms转向基于web的应用程序时,因为它可以防止SQL注入攻击。