当前位置: 首页 > 知识库问答 >
问题:

通过system.data.SQLite和C#对单个SQLite数据库文件的多次访问

戚正业
2023-03-14

正如我从SQLite FAQ中读到的那样,它支持多个进程读取(SELECT),并且在任何时刻只支持一个进程写入(INSERT、UPDATE、DELETE)数据库:

如果已经在同一个数据库上执行了另一个写入SQLiteCommand的操作,那么这个过程是否会自动工作,并且写入SQLiteCommand只需等待?

又或者它会抛出异常?什么样的?

对不起,我没有找到关于这个机制的信息:)

我发现有帖子说异常将用特定的错误代码引发

那个说法正确吗?

共有1个答案

穆正祥
2023-03-14

我自己调查过:

我创建了一个示例SQLite数据库C:\123.db,其中有一个表categories,该表包含两个字段:id(uniqueidentifier)和name(nvarchar)。

然后,我编写了一些多线程代码来模拟对数据库的多次写访问(如果使用此代码,请不要忘记向项目添加system.data.sqlite引用):

using System;
using System.Data.SQLite;
using System.Threading.Tasks;

namespace SQLiteTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var tasks = new Task[100];

            for (int i = 0; i < 100; i++)
            {
                tasks[i] = new Task(new Program().WriteToDB);
                tasks[i].Start();
            }

            foreach (var task in tasks)
                task.Wait();
        }

        public void WriteToDB()
        {
            try
            {
                using (SQLiteConnection myconnection = new SQLiteConnection(@"Data Source=c:\123.db"))
                {
                    myconnection.Open();
                    using (SQLiteTransaction mytransaction = myconnection.BeginTransaction())
                    {
                        using (SQLiteCommand mycommand = new SQLiteCommand(myconnection))
                        {
                            Guid id = Guid.NewGuid();

                            mycommand.CommandText = "INSERT INTO Categories(ID, Name) VALUES ('" + id.ToString() + "', '111')";
                            mycommand.ExecuteNonQuery();

                            mycommand.CommandText = "UPDATE Categories SET Name='222' WHERE ID='" + id.ToString() + "'";
                            mycommand.ExecuteNonQuery();

                            mycommand.CommandText = "DELETE FROM Categories WHERE ID='" + id.ToString() + "'";
                            mycommand.ExecuteNonQuery();
                        }
                        mytransaction.Commit();
                    }
                }
            }
            catch (SQLiteException ex)
            {
                if (ex.ReturnCode == SQLiteErrorCode.Busy)
                    Console.WriteLine("Database is locked by another process!");
            }
        }
    }
}

请注意,不需要为SQLiteException检索整数ErrorCode-您可以使用一个特殊的枚举returncode字段。这里描述了所有代码。

希望这些信息能对某人有所帮助。

 类似资料:
  • 问题内容: 我想通过可手动运行以更新数据的PHP脚本将表格从CSV文件导入SQLite DB。 以下是我要实现的目标的列表: 将旧表(称为“ produkte”)重命名为product-currentdate(或删除表) 然后从CSV文件导入文件(分隔并使用ISO 8859-1字符集/ CSV文件的第一行包含表标题) 将日期保存在表“产品”中 我发现了一个由于某种原因无法运行的脚本: 我希望有人知

  • 问题内容: 我是PHP和SQL领域的一名新开发人员。到目前为止,我只完成了Objective- C编程。但是,我的一个项目要求我拥有一个在线数据库,我需要从我的应用程序访问该数据库。我打算使用该框架来远程访问数据库,如下所示: 但这是行不通的,因为我联系了我的托管服务提供商,并且他们已经对其进行了设置,因此我无法从外部主机访问我的数据库(出于安全性考虑)。因此,我将不得不寻找替代方案。我唯一想到的

  • 问题内容: 我正在寻找一种使用Swift代码在我的应用程序中访问SQLite数据库的方法。 我知道我可以在Objective C中使用SQLite包装器并使用桥接头,但是我希望能够完全在Swift中完成此项目。如果可以的话,有没有办法做到这一点,有人可以将我指向一个引用,该引用显示了如何提交查询,检索行等。 问题答案: 虽然您可能应该使用许多SQLite包装器之一,但如果您想知道如何自己调用SQL

  • 本文向大家介绍C#中嵌入SQLite数据库的简单方法,包括了C#中嵌入SQLite数据库的简单方法的使用技巧和注意事项,需要的朋友参考一下 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要

  • 我正在尝试从承载在MLab上的MongoDB访问该文档,但在访问带有_id的文档时出现以下错误。以下是供您参考的代码 但在尝试访问URL时出现以下错误:http://localhost:3000/api/v1/todo/5870f7f1f36d2872530d26f1 TypeError:hex不是函数处的函数。从(本机)at函数。from(本机)位于C:\Kamlesh\Angular2\mea

  • WeX5.Baas服务详解 视频地址:http://pan.baidu.com/s/1jHB5XMA baas.net 版:Bass for .NET 1      概述 本案例实现了对takeout_order(外卖订单表)表的分页查询、关键字检索和修改保存的能力,数据库表结构参见WeX5自带的mysql数据库。 案例代码分为服务端和客户端两部分:     服务端包含一个servlet(com.