标签: system.data.sqlite

sqlite:获取所有行的最快方法(连续磁盘访问)

我想使用system.data.sqlite读取表中的所有行.由于我有一个非常大的表(> 450GB,行超过60亿),我想确保sqlite将使用连续的磁盘访问.您可能知道随机访问硬盘很慢.由于内存不足,我无法一次加载所有数据.所以最好的方法是如果sqlite读取几百MB(连续),那么我使用这些数据,sqlite读取下一个.

我怎么能确定sqlite会以这种方式进行磁盘访问而不是从硬盘上的一个位置跳转到另一个位置?

我知道的事情(我认为这些建议会出现):

  • 使用其他DBMS可能更好.但我希望/需要解决这个问题.
  • 我知道当我处理数据时,操作系统会将磁盘头定位在其他数据上.这没关系.只是连续阅读一些hundret MB.
  • 我不想/可以将数据库文件拆分成更小的部分

我找到了这篇文章,但它没有正确解决我的问题:
哪种方法可以检索SQLite中的所有项目?

sqlite system.data.sqlite

4
推荐指数
1
解决办法
2167
查看次数

使用 System.Data.SQLite 支持长 unicode 文件路径

我正在开发一个需要能够在用户定义的路径中创建和操作 SQLite 数据库的应用程序。我遇到了一个我不太明白的问题。我正在针对一些非常粗略的样本数据测试我的东西,这些样本数据具有巨大的笨拙的 unicode 路径,对于它们中的大多数来说都没有问题,但对于其中一个有问题。

工作连接字符串的示例是:

Data Source="c:\test6\??????????????????????????????\11???????????????????????????\test.db";Version=3;
Run Code Online (Sandbox Code Playgroud)

虽然失败的是

Data Source="c:\test6\??????????????????????????????\22??PC??????????????????????????????????????????????\test.db";Version=3;
Run Code Online (Sandbox Code Playgroud)

由于我无法控制的原因,我正在使用 System.Data.SQLite v1.0.66.0,但我很快用最新的 v1.0.77.0 进行了测试,并遇到了同样的问题。

无论是在尝试新创建 test.db 文件时还是在我手动将一个文件放在那里并尝试打开时,SQLiteConnection.Open 都会抛出一个异常,只说“无法打开数据库文件”,堆栈跟踪显示它实际上是 System .Data.SQLite.SQLite3.Open 正在抛出。

有什么办法可以让 System.Data.SQLite 很好地处理这些路径吗?解决方法可能是在临时位置创建和操作我的数据库,然后将它们移动到实际位置进行存储,因为否则我可以正常创建和操作文件。不过,这是最后的手段。

谢谢你。

sqlite unicode system.data.sqlite

4
推荐指数
1
解决办法
766
查看次数

SQLite外键未激活

我正在使用实体框架工作,并且休息是我的创建上下文方法,我已经在调用时启用了外键,但令我惊讶的是,值变量始终为0

private static DataBaseEntity CreateContext()
{
    var context = new DataBaseEntity("name=DataBaseEntity");
    context.ExecuteStoreCommand("PRAGMA foreign_keys = ON");

    var value = context.ExecuteStoreCommand("PRAGMA foreign_keys");
    return context;
}
Run Code Online (Sandbox Code Playgroud)

我想在删除功能上有级联,但我无法得到它,因为外键约束没有设置

我正在使用SQLite 3.6.23.1与ado.net提供程序

.net c# sqlite system.data.sqlite entity-framework-4

4
推荐指数
1
解决办法
1798
查看次数

SQLite .NET Insert ExecuteNonQuery返回1

SQL:

CREATE TABLE main.LogRecord (
Id INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL ,
TimeStamp DATETIME NOT NULL ,
Type TEXT NOT NULL ,
Severity TEXT NOT NULL ,
Message TEXT NOT NULL ,
Origin TEXT NOT NULL)

INSERT INTO LogRecord
(TimeStamp, Type, Severity, Message, Origins) VALUES
(@timestamp, @type, @severity, @message, @origin)
Run Code Online (Sandbox Code Playgroud)

C#Pseudo-ish代码:

SQLiteCommand command = new SQLiteCommand(INSERT_COMMAND_TEXT);
command.Parameters.AddWithValue("@paramName", object.value);
command.Connect = connectVar;
command.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

ExecuteNonQuery()运行时,值1,其根据SqliteOrg装置返回:

SQL错误或缺少数据库

除外,不会抛出任何异常并且数据插入正确.

有没有办法获得LAST_ERROR_MESSAGE使用System.Data.SQLite?我只是遇到了获取非.net API的最后一条错误消息的方法.

当我错误地插入到不存在的列时,将返回相同的错误代码(1)但是这次抛出了最后一条错误消息的异常.

因此,如果插入工作正常,为什么返回1?任何帮助是极大的赞赏.

编辑:我也尝试不发送TimeStamp …

.net c# sql sqlite system.data.sqlite

4
推荐指数
2
解决办法
9733
查看次数

Sqlite数据库无法删除对象,失败并显示消息"无法存储类型:<type>"

我正在尝试删除我存储在Sqlite数据库中的类型的记录.它失败了以下消息:

"Cannot store type: MyNamespace.PanelLog"
Run Code Online (Sandbox Code Playgroud)

我有以下方法来删除记录:

    public static int DeletePanelLog(int id)
    {
        return me.db.DeleteItem<PanelLog>(id);
    }
Run Code Online (Sandbox Code Playgroud)

其中DeleteItem定义为:

    public int DeleteItem<T>(int id) where T : IBusinessEntity, new()
    {
        lock (locker) {
#if NETFX_CORE
            return Delete(new T() { ID = id });
#else
            return Delete<T> (new T () { ID = id });
#endif
        }
    }
Run Code Online (Sandbox Code Playgroud)

PanelLog定义为:

public class PanelLog : IBusinessEntity
{
    public PanelLog(){}

    [PrimaryKey, AutoIncrement]
    public int ID { get; set; }

    public uint Sequence { get; set; }
    public DateTime …
Run Code Online (Sandbox Code Playgroud)

sqlite system.data.sqlite xamarin android-sqlite

4
推荐指数
2
解决办法
3462
查看次数

一个NuGet包(SQLite Core)导致TFS构建失败

我的解决方案配置为"恢复包",但其中一个项目未能构建: -

3> C:\ Builds\1\xxxxx\xxxx.csproj(223,5):错误:此项目引用此计算机上缺少的NuGet包.启用NuGet Package Restore以下载它们.有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkID=322105.丢失的文件是..\packages\System.Data.SQLite.Core.1.0.97.0\build \net45\System.Data.SQLite.Core.targets.

它可能是一个红鲱鱼,但上面的错误出现在包恢复之前的日志中,即

2> RestorePackages:

恢复NuGet包......

在违规项目的.csproj文件的末尾附近是这一<Target>部分,似乎产生了上述错误: -

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
<Import Project="..\packages\System.Data.SQLite.Core.1.0.97.0\build\net45\System.Data.SQLite.Core.targets" Condition="Exists('..\packages\System.Data.SQLite.Core.1.0.97.0\build\net45\System.Data.SQLite.Core.targets')" />

<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
  <PropertyGroup>
    <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
  </PropertyGroup>
  <Error Condition="!Exists('..\packages\System.Data.SQLite.Core.1.0.97.0\build\net45\System.Data.SQLite.Core.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\System.Data.SQLite.Core.1.0.97.0\build\net45\System.Data.SQLite.Core.targets'))" />
</Target>
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?我是否正确地假设这个检查是在解决方案的包甚至已经恢复之前发生的(因此它失败了)?我该如何解决?

解决方案中的其他项目(那些没有引用SQLite核心包的项目)可以很好地恢复它们的包,并且可以成功构建.

system.data.sqlite tfsbuild nuget sqlite-net nuget-package-restore

4
推荐指数
1
解决办法
1379
查看次数

将详细日志记录添加到 System.Data.SQLite

是否可以向 System.Data.SQLite 添加详细日志记录?我想记录所有数据库操作,例如连接打开/关闭以及所有 sql 命令

sqlite ado.net system.data.sqlite

4
推荐指数
1
解决办法
1746
查看次数

SQLite:没有这样的模块:与System.Data.SQLite.dll 1.0.101.0的fts5错误

我正在使用System.Data.SQLite.dll 1.0.101.0并且在执行命令"CREATE VIRTUAL TABLE tbl_fts USING fts5(fld1,fld2)"时出现此错误.

错误:没有这样的模块:fts5

在本页我们可以看到:1.0.99.0 - 2015年12月9日

•为原生json1和fts5扩展添加实验支持

https://system.data.sqlite.org/index.html/doc/trunk/www/news.wiki

那么问题是什么,如何重新启动System.Data.SQLite.dll?如何启用fts5?我怎样才能做到这一点?

谢谢..

.net sqlite full-text-search system.data.sqlite fts5

4
推荐指数
1
解决办法
2320
查看次数

System.Data.Sqlite - 无法安装Microsoft Visual C++运行时

我正在尝试安装System.Data.Sqlite的设计时组件 - 我希望能够从Visual Studio中连接到SQLite数据库,执行查询和检索数据.

根据System.Data.Sqlite下载页面上的说明,我下载了针对.NET 4.6的32位Windows安装包.

当我尝试安装时,我收到以下错误:

无法安装Microsoft Visual C++运行时:vcredist_x86_2015_VSU2.exe,已安装此产品的另一个版本.此版本的安装无法继续.要配置或删除此产品的现有版本,请使用"控制面板"上的"添加/删除程序"

我正在运行Visual Studio 2015 Community Edition Update 3,其中包含累积修补程序,可在此处获得 ; 在Windows 10 64位上.我尝试卸载Microsoft Visual C++ 2015 Redistributable(x86)并重新运行VS 2015 Community Edition修补程序安装程序以重新安装它,然后重新运行SQLite安装程序,但仍然出现相同的错误.

我该如何解决这个问题?

sqlite system.data.sqlite visual-studio visual-studio-2015

4
推荐指数
1
解决办法
1550
查看次数

如何离线存储大量数据,然后批量更新为SQLite数据库?

目前,我正在尝试使用此方法用数万个文本数据填充SQLite数据库:

SQLiteConnection = new SQLiteConnection(cntnStr);
connection.Open();

foreach(Page p in pages)
{
     using (SQLiteCommand command = new SQLiteCommand(String.Format("Insert Into Pages (ID, Data, Name) Values ({0}, '{1}', '{2}')", id, p.Data, p.Name), connection))
         command.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud)

但是,我怀疑这样做大约每秒10次可能会减慢整个过程.有没有办法可以整理内存中的数据,然后批量将每5000条记录添加到数据库中(所以它更快)?

编辑:超级重要:确保在一个内部执行所有SQL命令DbTransaction- 在这种情况下SQLiteTransaction:

SQLiteTransaction trans = connection.BeginTransaction();

// SQL centric code - repeated inserts/changes

trans.Commit(); // adds your changes
Run Code Online (Sandbox Code Playgroud)

它将性能提高了1000倍.

.net c# database sqlite system.data.sqlite

3
推荐指数
1
解决办法
670
查看次数