Вместо того, чтобы говорить вам использовать ORM, я собираюсь показать вам, как я это делаю (набрано из памяти) (и я собираюсь быть утерянным и взволнованным и кто знает, что еще):
Я вижу, ты делаешь то, что я делаю, а именно:
SqlDataReader myReader = null;
SqlCommand SQLcmd = new SqlCommand();
SqlConnection SQLConn = new SqlConnection();
String SQLStatement = "Select this 'nd That";
SQLConn.ConnectionString = SQLConnectionString;
SQLConn.Open();
SQLcmd.Connection = SQLConn;
SQLcmd.CommandText = SQLStatement;
myReader = SQLcmd.ExecuteReader();
while (myReader.Read())
{
//Do some awesome
}
SQLConn.Close();
}
И поэтому я делаю нечто подобное. Обратите внимание, что вы создаете новую SqlCommand, новую SqlConnection, и вы используете общую SqlConnectionString (которую вам нужно иметь возможность перезагрузить из центрального места, да?), Поэтому я делаю это:
public class Global{
public string ConnectionString {get;set;}
public Global(){
ConnectionString = //load from wherever, this allows me to reload it later, via API? ;)
}
public SqlCommandFactory(string sprocName, SqlConnection con){
return new SqlCommand{
CommandText = sprocName,
Connection = con,
CommandTimeout = 0,
ConnectionTimeout = 0,
CommandType = StoredProcedure
};
}
}
//in my other class that uses this code:
public List<string> /* for simplicity sake, strigns */ GetListOfStringsFromDatabase(){
List<string> returnValue = new List<string>();
// use of using ensures that I don't forget to clean something up here!!!!
using ( SqlConnection con = new SqlConnection(Global.ConnectionString) ) {
SqlCommand cmd = Global.SqlCommandFactory("mysproc", con);
cmd.Parameters.Add( "@param1", SqlDbType.VarChar ).Value = "somestring";
con.Open();
using ( SqlDataReader reader = cmd.ExecuteReader() ) {
while (reader.Read()) {
returnResult.Add( reader[0].ToString() );
}
}
}
return returnValue;
}
Но ORM, вероятно, будет лучше. Просто не то, что мы чувствуем, работает хорошо для нашей ситуации.