这是一个相对简单的问题,但我想确保以正确的方式做到这一点。
连接数据库的最佳做法是什么?这就是我目前正在做的事情,我想确保这或多或少遵循最佳实践。
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))
{}
谢谢!
答案 0 :(得分:4)
SQLHelper当然可以给你一些好主意,但它是专门为MS Sql Server编写的,而不是你似乎使用的SqlLite。他们有几十种方法可以做你想做的事情,我认为这在很大程度上取决于具体情况。
1)考虑多线程。如果您没有使用它,那么您可以忽略它,但另外要确保每个线程都使用自己的连接。您可能还想确保只有一个线程可以一次调用您的SQLiteConnection。而不是使用类级别的静态conn,每次都返回一个新的conn。
2)使用连接池。这将有助于减少每次调用获得新连接的开销。
3)考虑缓存不经常更改(或不经常更改)但经常使用的信息。
4)尝试捕获一些更具体的异常类型,以便您可以立即采取纠正措施。用户/通行证无效吗?这是一个安全例外吗?你没有足够的资源吗?
5)你应该重新抛出你的错误,或者根据错误(innerexception)抛出一个新错误,以便调用函数知道它失败了。
6)考虑使用一些通用类来帮助您编写上述内容 - 它可以更轻松地切换引擎或重用代码用于备用引擎(Db类或IDb接口)
7)你正在使用单身人士,一般我建议人们避开他们,除非他们有充分的理由。我看到很多人滥用它们。
希望这可以让你按照自己想要的方式走上正确的道路。如果没有,请回来请求澄清或进一步帮助/.
答案 1 :(得分:4)
有很多方法可以连接到.NET中的数据库。你当然找到了其中一个,它会正常工作。
我有三种主要的思想流派,我亲眼目睹并且在.NET数据连接方面经验丰富:
第一种是更“灵巧”的编码方法,包括向表单添加连接对象,然后使用表绑定等将表单“向导”提交。这在客户端计算机上通常是高效的,因为如果通过其绑定和向导功能完成,.NET会对其进行预优化。但是,根据您的操作,它可能会引入更多的网络流量。此外,有时向导并不能完全按照你的意愿行事,依靠向导有时会引入数小时的谷歌搜索,以找出向导没有按照你的意愿行事的原因。
第二种(也是我首选的方法)是编写后端代码来下载数据集,然后在软件中显示它们。这是我相信你发布的代码正在做什么。我相信它可以为您提供最佳的数据灵活性,同时仍允许您进行一些绑定和向导编码。这通常在客户端上的效率低于选项1,因为DataSets有时可以在事故中通过VAL传递,并且不能像巫术方法那样进行预先优化。它通常意味着更少的网络流量,因为您的查询将更加不足,理论上应该更少地调用,因为您可以调用数据,存储它,并在其他地方重用它。此外,还有一些关于以这种方式编码的速度。如果你不太了解SQL字符串格式等等,我也会发现它更容易(这可能就是为什么我们在办公室里为其他一些人使用它)。此外,数据集需要进行处理,以便将其从内存中删除。
我见过的第三种数据连接方法是围绕从datareader对象读取数据行的整个类。在对datareaders vs dataConnections and datasets进行一些研究之后,我发现datareader方法可以比数据流连接快10倍,并且它们使用的内存和资源要少得多。如果你已经获得了足够的数据或者找到了你所追求的东西(无论如何应该使用“TOP”或“WHERE”子句),你也可以选择截断你的结果集,而不是读取更多的行。但是,缺点如下:
这些只是我的观察。在选择其中一种之前,我会研究任何方法。另外,不要忘记缓存等事情,以防止尽可能多次往返服务器,但请确保不要缓存程序运行时会发生变化的任何内容(来自外部源)。不要忘记多线程和连接池等。对于任何数据访问类,它们都是非常重要的功能。
答案 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。