连接到数据库

时间:2009-11-23 16:24:37

标签: c# database sqlite database-connection

这是一个相对简单的问题,但我想确保以正确的方式做到这一点。

连接数据库的最佳做法是什么?这就是我目前正在做的事情,我想确保这或多或少遵循最佳实践。

private static SQLiteConnection conn;

    public static SQLiteConnection Conn
    {
        get 
        {
            try
            { 
                if (conn == null)
                    conn = new SQLiteConnection(fullName);

                if (conn.State != ConnectionState.Open)
                {
                    conn.ConnectionString = connectionString;
                    conn.Open();
                }
            }
            catch (Exception Excp)
            {
                DataErrorLogger.WriteError(Excp, "");
            }

            return conn;
        }

    }

当我实际使用连接时,我正在这样做。

 using (SQLiteConnection conn = new SQLiteConnection(SQLiteConn.Conn))
        {}

谢谢!

5 个答案:

答案 0 :(得分:4)

SQLHelper当然可以给你一些好主意,但它是专门为MS Sql Server编写的,而不是你似乎使用的SqlLite。他们有几十种方法可以做你想做的事情,我认为这在很大程度上取决于具体情况。

1)考虑多线程。如果您没有使用它,那么您可以忽略它,但另外要确保每个线程都使用自己的连接。您可能还想确保只有一个线程可以一次调用您的SQLiteConnection。而不是使用类级别的静态conn,每次都返回一个新的conn。

2)使用连接池。这将有助于减少每次调用获得新连接的开销。

3)考虑缓存不经常更改(或不经常更改)但经常使用的信息。

4)尝试捕获一些更具体的异常类型,以便您可以立即采取纠正措施。用户/通行证无效吗?这是一个安全例外吗?你没有足够的资源吗?

5)你应该重新抛出你的错误,或者根据错误(innerexception)抛出一个新错误,以便调用函数知道它失败了。

6)考虑使用一些通用类来帮助您编写上述内容 - 它可以更轻松地切换引擎或重用代码用于备用引擎(Db类或IDb接口)

7)你正在使用单身人士,一般我建议人们避开他们,除非他们有充分的理由。我看到很多人滥用它们。

希望这可以让你按照自己想要的方式走上正确的道路。如果没有,请回来请求澄清或进一步帮助/.

答案 1 :(得分:4)

有很多方法可以连接到.NET中的数据库。你当然找到了其中一个,它会正常工作。

我有三种主要的思想流派,我亲眼目睹并且在.NET数据连接方面经验丰富:

  1. 第一种是更“灵巧”的编码方法,包括向表单添加连接对象,然后使用表绑定等将表单“向导”提交。这在客户端计算机上通常是高效的,因为如果通过其绑定和向导功能完成,.NET会对其进行预优化。但是,根据您的操作,它可能会引入更多的网络流量。此外,有时向导并不能完全按照你的意愿行事,依靠向导有时会引入数小时的谷歌搜索,以找出向导没有按照你的意愿行事的原因。

  2. 第二种(也是我首选的方法)是编写后端代码来下载数据集,然后在软件中显示它们。这是我相信你发布的代码正在做什么。我相信它可以为您提供最佳的数据灵活性,同时仍允许您进行一些绑定和向导编码。这通常在客户端上的效率低于选项1,因为DataSets有时可以在事故中通过VAL传递,并且不能像巫术方法那样进行预先优化。它通常意味着更少的网络流量,因为您的查询将更加不足,理论上应该更少地调用,因为您可以调用数据,存储它,并在其他地方重用它。此外,还有一些关于以这种方式编码的速度。如果你不太了解SQL字符串格式等等,我也会发现它更容易(这可能就是为什么我们在办公室里为其他一些人使用它)。此外,数据集需要进行处理,以便将其从内存中删除。

  3. 我见过的第三种数据连接方法是围绕从datareader对象读取数据行的整个类。在对datareaders vs dataConnections and datasets进行一些研究之后,我发现datareader方法可以比数据流连接快10倍,并且它们使用的内存和资源要少得多。如果你已经获得了足够的数据或者找到了你所追求的东西(无论如何应该使用“TOP”或“WHERE”子句),你也可以选择截断你的结果集,而不是读取更多的行。但是,缺点如下:

    • 更难编码,因为您将拥有数据行数组而不是整齐的数据集
    • 大多数情况下都不能使用向导(有些仍与数据行阵列兼容)
    • 我认为大多数初级编码员都会看到并说“wtf发生在这里?”这是安全的。
    • 更多网络流量。
    • 仅限顺序访问。
  4. 这些只是我的观察。在选择其中一种之前,我会研究任何方法。另外,不要忘记缓存等事情,以防止尽可能多次往返服务器,但请确保不要缓存程序运行时会发生变化的任何内容(来自外部源)。不要忘记多线程和连接池等。对于任何数据访问类,它们都是非常重要的功能。

答案 2 :(得分:3)

查看Microsoft的SQLHelper类。它可以用于最佳实践数据库访问的代码: http://www.sharpdeveloper.net/source/SqlHelper-Source-Code-cs.html

它处理所有连接,并有许多方法可以返回不同的数据对象。我们发现它非常有用。

答案 3 :(得分:3)

你应该重新抛出你的错误。否则,当您在代码中的任何地方使用Conn时,您将获得nullReference异常。否则看起来不错。

答案 4 :(得分:2)

1)使用好的ORM。 NHITE和EntityFramework都支持SQLite 非常(它有第一个生产非微软实体框架实现)。还有一个项目可以为许多支持SQLite的其他dbs创建LinqToSql克隆。

2)如果你不想使用ORM。给自己写一个好帮手班。我个人偏爱将我的sql存储在嵌入式xml资源中,其中包含有关其参数的名称和元数据,然后使用包装类来简化命令。

注意:

跨线程共享连接是个坏主意。使用sqlite连接相对便宜,并且如何跨线程共享它们有一些special rules