この質問は何度も聞かれていると確信しており、似たような質問をいくつか調べましたが、私が望んでいたほど本当にそれを洗い流すものを見つけることができませんでした.
データベース ヘルパー クラスを使用して接続し、データベースからレコードを取得するアプリケーションがあります。私はそれを書き直すことを検討していて、それを行う最善の方法が何であるかを知りたいと思っていました.
これが現在の設定の大まかな方法です(注:これはすでに配置されており、このようなものは何千行もあります)。
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
}
今、これがどのようにセットアップされているかについていくつかの非常に深刻な問題があると確信していますが、私にとっての最大の不満は、常に接続を開いたり閉じたりする必要があることです.
私の最初の動きは、open と close を DatabaseHelper メソッド内に移動することでした。そのため、各メソッド (つまり、GetTeamLeaders) はそれ自体で open と close を呼び出します。しかし、問題は、実際に開くことができなかった場合、それをメイン プログラムにフィードバックするのが非常に困難なことでした。メイン プログラムは、変数が作成されたときに含まれていた値を使用して実行しようとしました。クエリが完了したかどうかを確認するためにタグを付け、データベースから何かを取得する必要があるときはいつでもmakeをチェックしてチェックできる「out」ブールがほとんど必要になると思っていましたが、問題があると確信していますに。
このアプローチのもう 1 つの大きな問題は、別のフォームから呼び出したいときはいつでも、そのフォームでヘルパーの別のインスタンスを作成するか、メインのヘルパーへの参照を渡す必要があることです。(現在、これを回避する方法は、事前に必要なすべての情報を取得してMainApp
から、それを新しいフォームに渡すことです)。これを書き直すときに、どこからでも呼び出すことができるように設定する良い静的な方法があるかどうかはわかりません。
それで、ここに保持する価値のあるものはありますか、それともすべてを取り除いて最初から作り直す必要がありますか?