Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 连接到数据库_C#_Database_Sqlite_Database Connection - Fatal编程技术网

C# 连接到数据库

C# 连接到数据库,c#,database,sqlite,database-connection,C#,Database,Sqlite,Database Connection,这是一个相对简单的问题,但我想确保我的做法是正确的 连接到数据库的最佳实践是什么?这就是我目前的做法,我想确保这或多或少符合最佳实践 private static SQLiteConnection conn; public static SQLiteConnection Conn { get { try { if (conn == null)

这是一个相对简单的问题,但我想确保我的做法是正确的

连接到数据库的最佳实践是什么?这就是我目前的做法,我想确保这或多或少符合最佳实践

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))
        {}

谢谢

查看Microsoft的SQLHelper类。可用于最佳做法数据库访问的It代码:


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

您应该重新抛出错误。否则,当您在代码中的任何地方使用Conn时,都会出现nullReference异常。在我看来,其他方面都没问题。

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

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

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

3)考虑不改变(或不经常改变)但经常使用的缓存信息。 4) 尝试捕获一些更具体的异常类型,以便可以立即采取纠正措施。用户/通行证是否无效?这是安全例外吗?你没有足够的资源吗

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

6)考虑使用一些泛型类来帮助您编写上面的代码-它将更容易切换引擎或重用代码替代引擎(DB类或IDB接口)

7) 你使用的是单身汉,通常我建议人们避免他们,除非他们有充分的理由。我看到很多人滥用它们


希望这能让你走上你想要的正确道路。如果没有,请回来寻求澄清或进一步帮助/

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

关于.NET数据连接,我亲眼看到并亲身体验过三种主要的思想流派:

  • 第一种是一种更为“向导式”的编码方法,它涉及到向表单添加连接对象,然后使用表绑定等将表单“向导式”提交。这在客户机上通常是有效的,因为如果通过其绑定和向导功能完成,则.NET会预先优化很多。然而,根据您正在做的事情,它可能会引入更多的网络流量。此外,有时向导并不能完全按照您的要求执行操作,依赖向导有时会引入数小时的谷歌搜索,以找出向导为什么没有按照您的要求执行操作

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

  • 我见过的第三种数据连接方法是一个围绕从datareader对象读入数据行构建的完整类。在对进行了一些研究之后,我发现datareader方法比datarow连接快10倍,并且它们使用的内存和资源要少得多。如果您已经获得了足够的数据或找到了所需的内容,您还可以选择通过不读取更多行来截断结果集(无论如何都应该使用“TOP”或“WHERE”子句来完成)。但是,缺点如下:

    • 由于您将拥有数据行数组而不是整洁的数据集,因此编写代码更加困难
    • 大多数情况下无法使用向导(某些向导仍与datarow阵列兼容)
    • 我认为可以肯定地说,大多数刚开始编写代码的人都会看到它并说“wtf发生在这里?”
    • 更多的网络流量
    • 仅限顺序访问
  • 这些只是我的观察。在选择这些方法之前,我会研究其中任何一种方法。另外,不要忘记缓存之类的事情,以尽可能避免往返服务器,但请确保在程序运行时(从外部源)不要缓存任何将要更改的内容。不要忘记多线程和连接池等。对于任何数据访问类来说,它们都是非常重要的特性。

    1)使用好的ORM。SQLite受到NHibernate和EntityFramework的良好支持(它有第一个非microsoft实体框架的生产实现)。还有一个项目是为许多其他支持SQLite的数据库创建LinqToSql克隆

    2) 如果你