在我的程序中,我將重複使用SELECT命令(MySQL的)。每一次,我都必須建立連接和東西。我正在考慮製作一個方法,它接收一個SELECT命令字符串並返回該參數的等效DataReader。我認爲這會幫助我減少每次產生的大量代碼。C#和MySQL - 返回DataReader(或其內容)的方法
我想以這樣的方式來使用它的是:
MySqlDataReader myReader = myObj.loadDataToReader("SELECT * FROM tblSample");
然後,我可以操縱myReader
像一個普通的了MySqlDataReader。然而,我擔心在使用數據讀取器時連接必須打開,當然,需要關閉連接(閱讀器和連接)以及所有(傳統的安全措施,我相信)。我一直在看互聯網上的東西,我似乎無法找到如何做到這一點的暗示。
我想,我有下面的代碼行:
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 */ }
但是,我收到一條消息,提示「讀取器關閉時無效嘗試讀取!」 我該如何糾正這種情況並使之發揮作用?或者說,是否有更合適的方法來做到這一點?我怎樣才能確保我的連接/閱讀器在使用後關閉?
改爲使用DataTable。將讀取器載入數據表,即'var dt = new DataTable(); dt.Load(myReader);'然後將DataTable返回給調用者做它的東西。 – adaam 2014-09-04 17:43:13
'DataSet'或'DataTable'通常是比'DataReader'更好的選擇。你也應該參數化你的SQL語句,而不是連接它們:http://en.wikipedia.org/wiki/SQL_injection – 2014-09-04 17:43:29
謝謝你的想法。我將使用DataTable來代替。 – Jill 2014-09-04 18:29:22