【发布时间】:2014-09-04 17:36:04
【问题描述】:
在整个程序中,我将重复使用(MySQL 的)SELECT 命令。每次,我都必须建立连接和东西。我正在考虑制作一个接收 SELECT 命令字符串并返回参数的等效 DataReader 的方法。我认为这将帮助我减少每次必须生成的大量代码。
我想以这样的方式使用它:
MySqlDataReader myReader = myObj.loadDataToReader("SELECT * FROM tblSample");
然后,我可以像普通的 MySqlDataReader 一样操作myReader。但是,我担心使用数据读取器时必须打开连接这一事实,当然,需要关闭它(读取器和连接)以及所有(传统的安全措施,我相信)。我一直在互联网上查看东西,但似乎无法找到有关如何执行此操作的提示。
我正在尝试,我有以下代码行:
public MySqlDataReader loadDataToReader(string selectCommand)
{
MySqlDataReader myReader = null;
string myConnectionString = "Data Source = " + server + "; User = " + user + "; Port = 3306; Password = " + password + ";";
string useDataBaseCommand = "USE " + dbName + ";";
using (MySqlConnection myConnection = new MySqlConnection(myConnectionString))
{
using (MySqlCommand myCommand = new MySqlCommand(useDataBaseCommand + selectCommand, myConnection))
{
try
{
myConnection.Open();
myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (Exception ex)
{
myConnection.Close();
MessageBox.Show(ex.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
return myReader;
}
}
}
在另一个类的方法中,我创建了一个能够使用上面定义的方法的对象,它看起来像这样:
string selectTableCommand = "SELECT * FROM tblusers WHERE Username = \'" + txtID.Text + "\' AND Password = \'" + txtPassword.Text + "\';";
MySQLOperations objSQLOperations = new MySQLOperations("localhost", "root", "mypass", "mydatabase");
MySqlDataReader myDataReader = objSQLOperations.loadDataToReader(selectTableCommand);
if (myDataReader.Read() && txtPassword.Text.Equals(myDataReader["Password"].ToString()))
{ /* do something */ }
else
{ /* do something */ }
但是,我收到一条消息,提示“阅读器关闭时尝试阅读无效!” 我怎样才能纠正这个问题并让它发挥作用?或者更确切地说,有没有更合适的方法来做到这一点?以及如何确保我的连接/阅读器在使用后关闭?
【问题讨论】:
-
改用数据表。将阅读器加载到数据表中,即
var dt = new DataTable(); dt.Load(myReader);,然后将数据表返回给调用者以对其进行处理。 -
DataSet或DataTable通常是比DataReader更好的选择。此外,您应该参数化您的 SQL 语句,而不是连接它们:en.wikipedia.org/wiki/SQL_injection -
感谢您的想法。我将改用 DataTable。
标签: c# mysql methods datareader