Tag: system.data.sqlite

获取最后插入的ID

我目前正在使用下面的方法来获取最后插入的行的ID。 Database.ExecuteNonQuery(query, parameters); //if another client/connection inserts a record at this time, //could the line below return the incorrect row ID? int fileid = Convert.ToInt32(Database.Scalar(“SELECT last_insert_rowid()”)); return fileid; 到目前为止,这种方法一直很好,但我不确定它是否完全可靠。 假设有两个客户端应用程序,每个应用程序都有自己独立的数据库连接,它们在同一时间调用上面的服务器端方法。 请记住,客户端线程并行运行,并且SQLite一次只能运行一个操作(或者我听说过),一个客户端实例是否可以返回由插入的记录的行ID另一个例子? 最后,是否有更好的方法来获取最后插入的行ID?

SQLite:.Net比本机慢得多?

这是我的查询: SELECT * FROM [GeoName] WHERE ((-26.3665122100029-Lat)*(-26.3665122100029-Lat))+((27.5978928658078-Long)*(27.5978928658078-Long)) < 0.005 ORDER BY ((-26.3665122100029-Lat)*(-26.3665122100029-Lat))+((27.5978928658078-Long)*(27.5978928658078-Long)) LIMIT 20 这将返回20个最近点。 在本机sqlite中运行它会在78ms内返回一个结果,但是在.Net sqlite环境中,它需要将近1400ms。 有什么建议? 我在我的ORM结构中使用参数化值进行此查询。 还尝试过将其作为原生文本查询。 运行查询的代码(在我的ORM层中): private static IDataReader CallSqlReader(string SqlStatement, Dictionary parameters) { ConnectionCheck(); try { var cmd = conn.CreateCommand(); cmd.CommandText = SqlStatement; cmd.CommandType = CommandType.Text; foreach (var item in parameters) { cmd.Parameters.AddWithValue(item.Key, item.Value); } return cmd.ExecuteReader(); } catch […]

使用C#SQLite DataReader和附加数据库迭代结果的性能问题

我在我的C#项目中使用System.Data.SQLite和SQLiteDataReader 。 在使用附加数据库获取查询结果时,我遇到了性能问题。 以下是将文本搜索到两个数据库的查询示例: ATTACH “db2.db” as db2; SELECT MainRecord.RecordID, ((LENGTH(MainRecord.Value) – LENGTH(REPLACE(UPPER(MainRecord.Value), UPPER(“FirstValueToSearch”), “”))) / 18) AS “FirstResultNumber”, ((LENGTH(DB2Record.Value) – LENGTH(REPLACE(UPPER(DB2Record.Value), UPPER(“SecondValueToSearch”), “”))) / 19) AS “SecondResultNumber” FROM main.Record MainRecord JOIN db2.Record DB2Record ON DB2Record.RecordID BETWEEN (MainRecord.PositionMin) AND (MainRecord.PositionMax) WHERE FirstResultNumber > 0 AND SecondResultNumber > 0; DETACH db2; 使用SQLiteStudio或SQLiteAdmin执行此查询时,此工作正常,我在几秒钟内得到结果(记录表可以包含数十万条记录,查询返回36000条记录)。 在我的C#项目中执行此查询时,执行也需要几秒钟,但运行所有结果需要几个小时。 这是我的代码: // Attach […]

System.Data.SQLite不支持多个事务

所以我在System.Data.SQLite和使用多个事务时遇到了一个有趣的问题。 基本上我有以下代码失败: using (IDbConnection connection1 = new SQLiteConnection(“connectionstring”), connection2 = new SQLiteConnection(“connectionstring”)) { connection1.Open(); connection2.Open(); IDbTransaction transaction1 = connection1.BeginTransaction(); IDbTransaction transaction2 = connection2.BeginTransaction(); // Fails! using(IDbCommand command = new SQLiteCommand()) { command.Text = “CREATE TABLE artist(artistid int, artistname text);”; command.CommandType = CommandType.Text; command.Connection = connection1; command.ExecuteNonQuery(); } using (IDbCommand command = new SQLiteCommand()) { command.Text […]

使用System.Data.SQLite.SQLIteDataReader.GetBlob检索BLOB字段时出错

由于我无法控制的原因,我正在创建一个.NET 2.0程序集,在其中我加载一个SQLite数据库并从中检索一些二进制数据。 具体来说,是PDF文档。 System.Data.SQLite.SQLiteDataReader.GetBlob(int i,bool ReadOnly)的文档说:(强调我的) 将列检索为System.Data.SQLite.SQLiteBlob对象。 如果查询不包含“rowid”列或其中一个别名-OR-,如果未使用System.Data.CommandBehavior创建System.Data.SQLiteDataReader,则这对于使用ROWID -OR-创建的表不起作用.KeyInfo标志。 这是我的SQLiteCommand: using (SQLiteCommand getBooklet = new SQLiteCommand($”SELECT \”rowid\”, File_Name FROM Booklets WHERE Id = {int.Parse(key)}”, dbConnection)) 我像这样实例化了我的SQLiteDataReader: using (SQLiteDataReader currentCustomerReader = getBooklet.ExecuteReader(System.Data.CommandBehavior.KeyInfo & System.Data.CommandBehavior.SequentialAccess)) 我调用GetBlob(int i,bool ReadOnly)函数如下: currentCustomerPdf = currentCustomerReader.GetBlob(1, true); 我对此表示欢迎: System.InvalidOperationException: No RowId is available at System.Data.SQLite.SQLiteBlob.Create(SQLiteDataReader dataReader, Int32 i, Boolean readOnly) at System.Data.SQLite.SQLiteDataReader.GetBlob(Int32 […]

System.Data.SQLite BackupDatabase()抛出“不是错误”

我正在使用System.Data.SQLite(版本1.0.85.0)来连接我的SQLite数据库。 我想使用SQLiteConnection.BackupDatabase()方法创建数据库的备份,但它抛出SQLiteException并显示消息:“not an error”(重复两次)。 这是一些代码: SQLiteConnection cnnIn = new SQLiteConnection(“Data Source=test.db;foreign keys=True”); SQLiteConnection cnnOut = new SQLiteConnection(“Data Source=backup.db;foreign keys=True”); cnnIn.Open(); cnnOut.Open(); cnnIn.BackupDatabase(cnnOut, “backup”, “test”, -1, null, -1); cnnIn.Close(); cnnOut.Close(); 该错误来自System.Data.SQLite.SQLite3.InitializeBackup(SQLiteConnection destCnn, String destName, String sourceName) 有谁知道什么可能是错的? PS。 我必须说错误信息有点误导:)

使用LINQ访问表中的第一个元素时出现SQLite错误

使用LINQ访问SQLite数据库时遇到以下问题。 Abreviated代码如下所示: … using System.Linq using System.Data.Linq using System.Data.Linq.Mapping using System.Data.SQLite … DataContext sqltContext= new DataContext(sqltConnection); featureTable = sqltContext.GetTable(); count= featureTable.Count(); // count == 1 以下行失败并显示错误:“SQL逻辑错误或缺少数据库\ r \ nnunknown错误” //currentFeature = featureTable.First(); 但迭代器工作正常: foreach (var feature in featureTable) { currentFeature = feature; break; } 在这两种情况下,我在调试输出中收到以下错误: SQLite error (1): near “.”: syntax error 什么会导致这个错误? 我希望有人之前已经看过这个问题,并且可以指出我正确的方向。 但我可能最终会在调试器中逐步调试System.Data.SQLite代码。 […]

正确包含x32或x64 System.Data.SQLite.dll文件

我在互联网上搜索它,但我不确定该怎么做。 我发现我需要在Program.csproj文件中包含一些代码。 当我打开Program.csproj时,它说 ShowAllFiles 这是我需要包含的代码: False library\sqlite\x32\System.Data.SQLite.dll False False library\sqlite\x64\System.Data.SQLite.DLL 但是我不太确定这是否正确,因为我的程序从它的根目录而不是“library \ sqlite \”中获取所有dll。有人可以帮我正确地执行吗? 我无法做对

难以在C#中的SQLite数据库上运行并发INSERTS

我正在运行许multithreading,每个线程都尝试对一个SQLite数据库执行INSERTS。 每个线程都创建自己与DB的连接。 它们每个都创建一个命令,打开一个Transaction执行一些INSERTS然后关闭事务。 似乎第二个尝试任何东西的线程得到以下SQLiteException:数据库文件被锁定。 我尝试从事务中解包INSERTS以及缩小每个提交中包含的INSERTS的范围而没有实际效果; 后续访问db文件会引发相同的exception。 有什么想法吗? 我很难过,我不知道下一步该往下看……

SQLite Entity Framework 6提供程序如何处理Guids?

我将我们产品的数据库从另一个支持Guids的产品移植到SQLite。 众所周知,SQLite不支持Guids。 我已经从我的数据库(数据库优先)创建了一个entity framework6模型,我需要从C#构建一个查询,将Guid与从代码传递的Guid进行比较。 问题是我找不到任何关于SQLiteentity framework提供程序如何处理Guids的文档。 网络搜索也找不到对我有用的东西。 关于在SQLite中使用Entity Framework的问题。 任何人都可以指向我的文档,或者告诉我如何通过EF6模型在SQLite数据库中使用Guids?