我制作了一些静态类以避免多次重写相同的代码并将所有与数据库相关的方法保存在同一个地方。
类看起来像这样:
public static class Database_dbSurvey
{
public static DataSet GetQuestionari()
{
SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["default_connection"].ConnectionString);
string query = "[admin].[SRV_Categorie_Lista]";
SqlCommand cmd = new SqlCommand(query, connection);
cmd.CommandType = CommandType.StoredProcedure;
//GetDataSet use the SqlDataAdapter.fill() method
return Utils.GetDataSet(cmd);
}
etc.... (others similar methods)
}
我想减少代码,我想让它更“面向对象”,所以我首先为 SqlConnection 创建一个属性(对于这个类的每个方法都是相同的)。
private static SqlConnection connection
{
get { return new SqlConnection(ConfigurationManager.ConnectionStrings["default_connection"].ConnectionString); }
}
问题是它与 SqlDataAdapter.fill() 完美配合,直到我使用这样的方法:
using (connection)
{
connection.Open();
cmd.ExecuteNonQuery();
}
现在,连接的下一次使用将抛出“not istanziated”异常,我不明白为什么。
定义连接属性的正确方法是什么?
ps如果您对改进代码有其他建议,我们将不胜感激
编辑: 我仍然不明白为什么“new”关键字在我每次调用它时都不会创建 SQLConnection 的另一个实例。但是我进行了一些更改以使代码更安全:
private static string connection_string
{
get { return ConfigurationManager.ConnectionStrings["Connection_dbPrysmianSurvey"].ConnectionString; }
}
public static DataSet GetQuestionari(string username)
{
string query = "[dbo].[SRV_Test_Lista]";
using (SqlConnection connection = new SqlConnection(connection_string))
using (SqlCommand cmd = new SqlCommand(query, connection))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@username", username);
return Utils.GetDataSet(cmd);
}
}
public static int CreaTest(string ID_questionario, string username)
{
string query = "[dbo].[srv_test_genera]";
using (SqlConnection connection = new SqlConnection(connection_string))
using (SqlCommand cmd = new SqlCommand(query, connection))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@ID_categoria", ID_questionario);
cmd.Parameters.AddWithValue("@ID_utente", username);
connection.Open();
return (int)cmd.ExecuteScalar();
}
}
但是考虑到我有 40-50 种方法这一事实,将相同的行重写 40-50 次仍然很痛苦,有什么建议吗?