【问题标题】:C# Database static or notC# 数据库是否静态
【发布时间】:2014-09-17 12:20:32
【问题描述】:

我正在开发一个从 MSSQL 数据库中获取一些信息的工具。有自己的数据库 访问的用户。我知道静态是如何工作的以及何时应该使用它们,但在这种情况下我不确定。

我有一个自己的数据库类:

    class Database
    {
        private const String connString = "the connection string";
        private const String query1 = "";

        public Database()
        {
            // some initialization
        }

        // some different methods which calls CreateCommand and a queryString and
        // returns the result

        private static void CreateCommand(string queryString, string connectionString)
        {
            using (SqlConnection sqlConnection = new SqlConnection(connectionString))
            {
                sqlConnection.Open();
                using (SqlCommand command = new SqlCommand(queryString, sqlConnection)) 
                {
                    using (SqlDataReader dataReader = command.ExecuteReader()) 
                    {
                        if (dataReader != null)
                        {
                            while (dataReader.Read())
                            {

                            }
                        }
                    }
                }
            }
        }
    }

只有选择查询,我从服务器获取数据。一个自己的线程将调用一些数据库方法,例如每小时显示结果。 我应该为此使用静态类和静态方法,还是只使用 createCommand 方法静态或没有静态方法的普通类?

亲切的问候

【问题讨论】:

  • 你对你的项目进行单元测试吗?如果是,请不要使用静态方法。它们使测试变得困难。
  • 这是为了教育目的吗?如果没有,我建议您使用许多现有 ORM 之一:Entity FrameworkNHibernateDapper、...
  • @Belogix 那你有什么建议?你知道连接池吗?
  • @Belogix,这不是真的。但默认 ADO.NET 将使用相同的连接字符串汇集连接,保持和重用现有连接,而不是为每个查询设置和拆除。 msdn.microsoft.com/en-us/library/8xx3tyca(v=vs.110).aspx
  • 好的,谢谢,我让它不是静态的,因为我完全同意你的观点。 @Belogix 在我找到使用解决方案之前,我的想法是创建数据库类,在该类中我在构造函数中创建 sqlconnection 的实例,然后为语句创建方法和一种用于打开连接的方法用于关闭。有了这个,我必须在我的线程类中创建一个数据库类的实例,然后打开连接,进行不同的查询,然后关闭。我认为使用多个命令的 SqlTransactions 是可能的吗?只是一个问题,我的项目中不需要事务。

标签: c# sql .net sql-server static


【解决方案1】:

除非在特定情况下,应避免使用静态方法,因为它们会降低可测试性并导致您的设计变得紧密耦合。完整的讨论超出了本网站的范围,但这里有几个地方可以开始:

http://objcsharp.wordpress.com/2013/07/08/why-static-code-is-bad/ http://misko.hevery.com/2008/12/15/static-methods-are-death-to-testability/

但是,在您的情况下,您的静态方法是私有的,正如 BG100 所指出的,这在您的实例化类的上下文中似乎没有意义。为什么不将其声明为实例(非静态)方法,并通过在构造函数中传递连接字符串来保持代码的灵活性:

class Database
{
    private string connString;

    public Database(string connString)
    {
        this.connString = connString;
    }

    private void CreateCommand(string queryString)
    {  
        using (SqlConnection sqlConnection = new SqlConnection(this.connString))
        {
            // etc.
        }
    }
}

但是现在您的 CreateCommand 正在返回 void 的问题。从阅读器读取数据后,如何将其返回给调用方法?也许你应该看看使用 DataSet 来代替:

https://stackoverflow.com/a/4099694/289319

【讨论】:

  • 谢谢好答案,我现在知道如何使用它了。对不起,我只是在没有 using 和 static 方法的情况下测试了错误的代码。我创建了新代码并询问,因为在这种情况下使用静态是否更好,我只使用您几乎知道我的意思的代码。如果项目非常小,我也总是尝试编写好的代码,比如这种情况=)
【解决方案2】:

我可以想到描述静态方法的最简单方法,是说,如果将CreateCommand方法声明为静态,那么它将阻止您从该方法中访问成员变量(Connstring和Query1)。 ......所以当你清楚地需要访问这些时,你无法将方法声明为静态。

所以答案是否定的,不要将其声明为静态,因为您的方法将不再工作。

还有一些其他调整可能应该解决,如某些CMET中所述,但这超出了这个问题的范围。 sub>

【讨论】:

  • 哦是你的右图所以我的错,你可以看到我不经常使用或需要静态 span>
猜你喜欢
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
  • 2011-11-01
  • 2016-05-03
  • 1970-01-01
相关资源
最近更新 更多