0

我制作了一些静态类以避免多次重写相同的代码并将所有与数据库相关的方法保存在同一个地方。

类看起来像这样:

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 次仍然很痛苦,有什么建议吗?

4

2 回答 2

0

不要using在您的情况下使用关键字。

它将通过调用方法在该using范围完成后处理连接。SqlConnection.Dispose

using(connection) {...}的等价物 -

try
{
    connection.Open();
    cmd.ExecuteNonQuery();
}
catch
{
    throw;
}
finally
{
    connection.Dispose();
}
于 2013-06-06T09:55:51.153 回答
0

正如@Parag Meshram 所提到的,使用关键字在完成时会在其内部处理所有内容。

我可以建议两种方法:

(1) 不要让连接成为静态方法

私有 SqlConnection 连接() { 获取 { 返回新的 SqlConnection(ConfigurationManager.ConnectionStrings[“default_connection”].ConnectionString);} }

然后像使用它

SqlConnection newConnection = connection();

使用 (newConnection) { ... }

或者

(2) 保持静态方法不变,但像这样使用它:

尝试{连接。打开();cmd.ExecuteNonQuery(); } 抓住 { 扔;}

这样,您的连接就不会被释放。

一年前我遇到了同样的问题,现在我使用方法(2)解决了它。

于 2013-06-06T11:14:40.243 回答