我敢肯定这个问题已经被问过很多次了,我挖掘了一些类似的问题,但找不到一个真正像我想要的那样彻底解决它的问题。
我有一个应用程序,它使用数据库助手类来连接和检索数据库中的记录。我正在考虑重写它,并想知道最好的方法是什么。
现在大致是这样设置的(注意:这已经到位,并且有数千行这样的东西)。
private SqlConnection conn;
public DatabaseHelper()
{
// Create database connection
conn = new System.Data.SqlClient.SqlConnection();
SqlConnectionStringBuilder connection = new SqlConnectionStringBuilder();
connection.ConnectTimeout = 150; // Microsft fix for timeout error (known bug)
connection.MinPoolSize = 20; // Microsft fix for timeout error (known bug)
connection.DataSource = Properties.Settings.Default.DBString;
connection.InitialCatalog = Properties.Settings.Default.DBInitCatalog;
connection.IntegratedSecurity = true;
if (conn.State != ConnectionState.Connecting)
{
conn.ConnectionString = connection.ConnectionString;
}
}
public bool Open()
{
if (this.IsOpen()) // IsOpen is just a method that checks connectionstate.
{ return true; }
else
{
try
{
conn.Open();
return true;
}
catch (System.Data.SqlClient.SqlException ex)
{
// omitted for post
}
}
return false;
}
public bool Close()
{
if (!this.IsOpen())
{ return true; }
try
{
conn.Close();
return true;
}
catch (System.Data.SqlClient.SqlException ex)
{
// omitted for post
}
return false;
}
public List<string> GetTeamLeaders(string team)
{
List<string> leaders = new List<string>();
string query = "Select Leader FROM Teams WHERE Team = @team_vc";
try
{
using (SqlCommand cmd = new SqlCommand(query, conn))
{
cmd.Parameters.Add("@team_vc", SqlDbType.NVarChar).Value = team;
using (SqlDataReader sdr = cmd.ExecuteReader())
{
int column = sdr.GetOrdinal("Leader");
while (sdr.Read())
{
leaders.Add(sdr[column].ToString());
}
}
}
}
catch (Exception ex)
{
// omitted for post
}
return leaders;
}
private string GetTeamAbbrev(string team)
{
string abbrev= "";
string query = "SELECT Abbrev FROM Teams where Team = @team_vc";
using (SqlCommand cmd = new SqlCommand(query, conn))
{
cmd.Parameters.Add("@team_vc", SqlDbType.NVarChar).Value = team;
try
{
abbrev= Convert.ToString(cmd.ExecuteScalar());
}
catch (Exception ex)
{
// omitted for post
}
}
return (string.IsNullOrEmpty(location)) ? "None" : abbrev;
}
private DatabaseHelper dbHelper;
public MainApp()
{
InitializeComponent();
dbHelper= new DatabaseHelper(); // Instantiate database controller
}
private void someButton_Click(object sender, EventArgs e)
{
List<string> teamLeaders = new List<string>();
if (dbHelper.Open())
{
teamLeaders = dbConn.GetTeamLeaders(textboxTeam.Text);
dbHelper.Close();
}
else
{
return;
}
// all the code to use results
}
private void someOtherButton_Click(object sender, EventArgs e)
{
List abbreviation = string.Empty;
if (dbHelper.Open())
{
abbreviation = dbConn.GetTeamLeaders(textboxTeam.Text);
dbHelper.Close();
}
else
{
return;
}
// all the code to use results
}
现在我确信这是如何设置的一些非常严重的问题,但对我来说,我最大的抱怨总是不得不打开和关闭连接。
我的第一步是在DatabaseHelper 方法中移动open 和close,这样每个方法(即GetTeamLeaders)都会自己调用open 和close。但问题是,如果它确实无法打开,则很难将其反馈给主程序,主程序将尝试使用变量在创建时包含的任何值运行。我在想我几乎需要一个“out”布尔值来标记查询是否完成,并且可以检查 make 并检查任何时候我使用我需要从数据库中获取一些东西,但我确定有问题至。
这种方法的另一个大问题是,每当我想从另一个表单进行调用时,我必须在该表单上创建另一个助手实例,或者传递对主表单的引用。(目前我解决这个问题的方法是预先检索我需要的所有信息MainApp
,然后将其传递给新表单)。我不确定当我重写它时是否有一种很好的静态方法来设置它,以便我可以从任何地方调用它。
那么这里有什么值得保留的吗,还是需要将它们全部剥离并从头开始重建?