C# 数据连接最佳实践?

2023-12-09

好吧,这是一种固执己见的话题,但根据你的知识、观点和当前的实践,设置以下场景的最佳方法是什么?

我正在构建一个广泛的数据输入应用程序,我所说的广泛是指我只完成了基本设置,其中包含整个程序的大约 15-25%,并且我有大约 15 个部分设置的表单。 (他们仍然需要工作)我使用 SQL Compact 4.0 作为我的后端数据库,我并不真正需要更广泛的数据库,因为我没有存储 MMO 的数据价值,目前这只是一个本地应用程序。

我希望能够将其设置为显示为单个窗口,该窗口仅根据菜单系统更改为各种不同的页面,但我似乎找不到关于如何完成此操作的好教程,所以如果有哪位知道的,请赐教。

然而,所讨论的场景是如何连接到数据库。我使用 2 个 SQLCE 数据库,一个存储基于服务和人员的恒定数据,第二个存储不断变化的数据或基于第一个数据库输入的新数据。我已经看到了许多不同的方法来设置它,目前我正在使用一种方法,其中我有一个所有其他表单都继承自的 BaseForm。在 BaseForm 中,我拥有许多表单通用的方法和变量,从而最大限度地减少了重复的代码量。

这包括两个数据库的连接字符串,以及打开与其中任何一个数据库的连接的 2 个方法。就像这样:

internal SqlCeConnection dataConn = new SqlCeConnection(@"Data Source = |DataDirectory|\opi_data.sdf");
internal SqlCeConnection logConn = new SqlCeConnection(@"Data Source = |DataDirectory|\opi_logs.sdf");
internal SqlCeCommand command;

internal void openDataConnection() // Opens a connection to the data tables 
        {
            try
            {
                if(dataConn.State == ConnectionState.Closed)
                    dataConn.Open();
            }
            catch(SqlCeException ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        internal void openLogConnection() // Opens a connection to the log tables
        {
            try
            {
                if(logConn.State == ConnectionState.Closed)
                    logConn.Open();
            }
            catch (SqlCeException ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

然后,每当我需要打开连接时,我只需调用与我需要访问的数据库相对应的打开连接方法,然后在finally语句中将其关闭。通过这种方式,连接永远不会在需要时打开很长时间。当然,这意味着有很多对打开连接方法的调用。那么这是实现这种场景的最佳方法,还是有更好的方法?

表单加载后立即打开连接,然后在表单关闭时关闭连接是否更好?我有这样的情况,一次打开多个表单,每个表单可能都需要与数据库的开放连接,因此如果一个表单关闭,那么其他表单就会被搞砸,对吗?或者我应该在应用程序启动时打开与两个数据库的连接?任何意见将不胜感激。谢谢。


连接由 .NET 汇集,因此重新创建它们通常并不是一个昂贵的操作。然而,长时间保持连接打开可能会导致问题。

大多数“最佳实践”告诉我们尽可能晚地打开连接(就在执行任何 SQL 之前)并尽快关闭它们(就在提取最后一位数据之后)。

自动执行此操作的有效方法是using声明:

using (SqlConnection conn = new SqlConnection(...))
{
    using(SqlCommand cmd = new SqlCommand(..., conn))
    {
        conn.Open();
        using(DataReader dr = cmd.ExecuteReader())  // or load a DataTable, ExecuteScalar, etc.    
        {
             ...
        {
    }
}

这样,即使抛出异常,资源也会被关闭和处置。

简而言之,在应用程序打开或每个表单打开时打开连接可能不是最好的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 数据连接最佳实践? 的相关文章

随机推荐

  • 以下用于添加到内存引用的字节说明符在 NASM 汇编器中起什么作用?

    下面的代码 section data Snippet db KANGAROO section text global start start mov ebx Snippet add byte ebx 32 将 BX 中的内存地址所指的数字加
  • Swift 字符串文字赋值给 C 变量

    在 Swift 中 当调用 C 函数时 Swift 字符串作为参数传递时会自动强制转换为 CString 但是 在填写 C 结构体或全局变量时 我没有得到相同的行为 strlen swiftString Works CGlobalStruc
  • Asp.net mvc 多对多关系视图

    大家好 我创建了几个实现多对多关系的模型 现在我在正确格式化 设计 创建和编辑 视图时遇到问题 这是我的模型 学生模型 namespace HMS Models Table Students Schema Admission public
  • 使用 Cognito 用户池,而不使用 Cognito 联合身份(身份池)

    我只想使用 Cognito 用户池 因此我想将身份联合与 Cognito 用户池一起使用 而不使用 Cognito 联合身份 身份池 我已按照文档进行操作 但无法成功 http docs aws amazon com cognito lat
  • 如何使用 canvas 和 Kinetic.js 裁剪图像

    我的函数绘制一个图像 并使用 Kinetic js 在另一层上绘制另一个图像 但我想裁剪名为 smsTopBg image 的第二个图像 window onload function INITIALISATION var stage new
  • Android Google Drive API 异常:403 禁止

    我正在开发一个可以访问 Google Drive 上用户的 appdata 文件夹的应用程序 当我处于调试模式时 该应用程序运行良好 当我发布应用程序并尝试连接到 Google Drive 时 在选择要连接的帐户后 它会出现此错误 com
  • 如何从TSQL调用Web服务? (SQL 服务器 2000)

    我想从 SQL Server 2000 中的 TSQL 调用 Web 服务 我尝试使用以下代码 Declare Object as Int Declare ResponseText as Varchar 8000 Exec sp OACre
  • 在 Javascript 中打印 div 标签的内容而不使用弹出窗口

    我正在努力打印 div 标签的内容而不弹出窗口 我的代码现在看起来像这样 var DocumentContainer document getElementById print var WindowObject window open Co
  • 折叠 git 存储库的历史记录

    我们有一个有着悠久历史的 git 项目 具体来说 在项目早期 项目中有相当多的二进制资源文件 这些文件现在已被删除 因为它们实际上是外部资源 然而 由于之前已提交这些文件 我们的存储库的大小 gt 200MB 当前总签出约为20MB 我们想
  • Prolog 递归计算列表中的数字

    我需要一个程序来计算列表中的所有数字 无论它们嵌套得有多深 我能够在数字不在另一个列表内的情况下对数字进行计数 但通过深度嵌套元素进行递归是行不通的 到目前为止我有这个 count 0 count H Tail N count Tail N
  • 使用 Python 搜索 PDF 中的文本? [复制]

    这个问题在这里已经有答案了 Problem我试图通过搜索文本来确定文档的类型 例如诉状 信件 传票等 最好使用 python 所有 PDF 都是可搜索的 但我还没有找到使用 python 解析它并应用脚本来搜索它的解决方案 不需要先将其转换
  • 调整 nginx worker_process 以获得每分钟 10 万次点击

    我们有一台服务于一个 html 文件的服务器 现在服务器有 2 个 CPU 和 2GB 内存 从 blitz io 来看 我们每分钟获得约 12k 个连接 在 60 秒内有 200 个超时 每秒有 250 个并发连接 worker proc
  • unicodedata.digit 和 unicodedata.numeric 之间有什么区别?

    From 统一码数据 doc unicodedata digit chr default 返回分配给的数字值 字符 chr 作为整数 如果没有定义这样的值 则默认为 返回 或者 如果未给出 则引发 ValueError unicodedat
  • 从Python执行页面上的JS代码

    我的任务是使用 Python 从任何网页获取命名函数的列表 我有一个使用 JavaScript 编写的脚本 它满足我的需要 加载页面后 我可以从 JS 控制台运行脚本 例如 从 GoogleChrome 中的开发工具 我得到了函数名称数组作
  • 上传错误#2038

    每当我使用此脚本进行测试时 它在上传尝试时都会不断失败并给出错误 IO 2038我可以肯定地说的是它甚至永远不会到达 Upload ashx 的后端脚本 这告诉我脚本有问题 现在我正在我的测试机器上使用 localhost 执行此操作 ht
  • 使用 Swing 在窗格中选择文件

    我正在 Swing 中编写一个 GUI 我想在主窗口中创建一个文件选择器 如下图所示 虽然似乎有很多关于如何编写弹出文件选择器的教程 但我没有看到太多关于如何在 swing 中完成这种类型的选择器的信息 也很抱歉 如果之前有人问过这个问题
  • 如何延迟推送通知权限弹出窗口 Swift

    我正在开发一个带有推送通知的应用程序 我想延迟推送通知权限弹出的出现 直到用户第三次进入我的应用程序之后 所以他应该对我的应用程序感兴趣 然后我想征求他的许可 我有办法做到这一点吗 我搜索了很多方法 就像这里 重置应用程序的推送通知设置但我
  • AngularJS 路由有什么意义?

    我正在创建一个网站 我选择在 AJ 中进行 我有两个文件夹 网关 gt 一些从 mysql 数据库检索数据并将数据作为 json 回显的 php 文件 Views gt 部分 html 文件 基本上是每个页面的模板 例如用户 项目等 然后我
  • 将参数括在括号中时,Ruby Kernel.raise 方法会引发错误

    我喜欢用括号括起来的方法参数 这是对 Pascal 的怀念 在清理代码时 如果我发现没有它的方法参数 我会立即将它们括起来 今天 它导致我的工作代码抛出错误 尽管根据文档我的语法看起来没问题 Kernel raise 的文档具有以下格式 O
  • C# 数据连接最佳实践?

    好吧 这是一种固执己见的话题 但根据你的知识 观点和当前的实践 设置以下场景的最佳方法是什么 我正在构建一个广泛的数据输入应用程序 我所说的广泛是指我只完成了基本设置 其中包含整个程序的大约 15 25 并且我有大约 15 个部分设置的表单