我有一个ASP.NET MVC应用程序,通过实体框架使用SQLite数据库.一切都适用于VS 2008的本地开发网络服务器.
但是,将Web应用程序部署到我的服务提供商会导致此错误:
[ArgumentException: Unable to find the requested .Net Framework Data Provider. It may not be installed.]
System.Data.Common.DbProviderFactories.GetFactory(String providerInvariantName) +1308959
System.Data.EntityClient.EntityConnection.GetFactory(String providerString) +35
Run Code Online (Sandbox Code Playgroud)
服务提供商评论说他们不支持SQLite.我曾经认为SQLite独立于服务提供商的设置,因为它可以部署App_Data.
有没有成功实体框架+ SQLite部署的经验?
干杯,-pom-
我正在使用System.Data.SQLite.dllSQLite内存数据库.程序完成后,我想将内存数据库转储到.db3文件中以供下次使用.我怎样才能在C#中实现这一目标?
我在 sqlite 表中有一个带有 \0 字符和文本字段的 UTF 字符串。
当我尝试将字符串插入表文本字段然后从数据库中读取它时,我注意到字符串值在 \0 字符后被截断。
问题:是否有可能在 sqlite 中保存/恢复这样的字符串而不会在\0之后丢失数据?
代码片段:
public static void IssueWith0Character()
{
const string sql = "DROP TABLE IF EXISTS SomeTable;" +
"CREATE TABLE SomeTable (SomeField TEXT not null);"
+ "INSERT INTO SomeTable (SomeField) Values ( :value )";
var csb = new SQLiteConnectionStringBuilder
{DataSource = "stringWithNull.db", Version = 3};
// string with '0' character
const string stringWithNull = "beforeNull\0afterNull";
using (var c = new SQLiteConnection(csb.ConnectionString))
{
c.Open();
using (var cmd …Run Code Online (Sandbox Code Playgroud) 可重现的例子:
sqlite db test3.s3db 有一张名为“MathRec”的表:
name score
Bill 2
Mary 3
John 3
Run Code Online (Sandbox Code Playgroud)
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SQLite;
namespace ConsoleApplication7
{
class Program
{
static void Main(string[] args)
{
string fullPath = "C:\\Users\\Desktop\\dataset\\test3.s3db";
SQLiteConnection conread = new SQLiteConnection("Data Source=" + fullPath);
conread.Open();
string selectSQL = "SELECT * FROM MathRec";
SQLiteCommand selectCommand = new SQLiteCommand(selectSQL, conread);
SQLiteDataReader dataReader = selectCommand.ExecuteReader();
DataSet ds = new DataSet();
DataTable dt = new DataTable("MathRec");
dt.Load(dataReader); …Run Code Online (Sandbox Code Playgroud) 我想我的问题暂时解决了......我将我的服务和测试应用程序更改为SYSTEM帐户而不是NetworkService帐户.更改用户帐户的好处是否会持续存在,或者只是暂时性的,还有待观察.
我注意到我的小型224kB SQLite数据库在我的C#应用程序中打开非常慢,从一些小的ms到1.5秒或更长时间.下面是我的代码,以及我今天下午添加的所有额外调试语句.我把它缩小到调用,cnn.Open();如下面的日志所示:
2014-03-27 15:05:39,864 DEBUG - Creating SQLiteConnection...
2014-03-27 15:05:39,927 DEBUG - SQLiteConnection Created!
2014-03-27 15:05:39,927 DEBUG - SQLiteConnection Opening...
2014-03-27 15:05:41,627 DEBUG - SQLiteConnection Opened!
2014-03-27 15:05:41,627 DEBUG - SQLiteCommand Creating...
2014-03-27 15:05:41,627 DEBUG - SQLiteCommand Created!
2014-03-27 15:05:41,627 DEBUG - SQLiteCommand executing reader...
2014-03-27 15:05:41,658 DEBUG - SQLiteCommand executed reader!
2014-03-27 15:05:41,658 DEBUG - DataTable Loading...
2014-03-27 15:05:41,767 DEBUG - DataTable Loaded!
Run Code Online (Sandbox Code Playgroud)
如您所见,在这种情况下,打开连接需要1.7秒.我试过重复这个,无法预测后续连接是否会立即打开,或者像这样延迟.
我考虑过使用某种形式的连接池,但是对于单实例单线程应用程序来说,这是值得的吗?现在,我正在创建一个SQLiteDatabase类的实例,并为每个查询调用以下函数.
public DataTable GetDataTable(string sql)
{ …Run Code Online (Sandbox Code Playgroud) 鉴于我已经阅读了Xamarin关于本地数据库的文档,我只是对此感到好奇。
它sqlite-net-pcl是专为与XAMARIN?一起使用而设计的。我的意思是,如果他们都运行SQLite数据库引擎,那么假设我也可以使用System.Data.SQLiteNuGet 包是否安全?
SQLITE-NET-PCL NuGet Package
SYSTEM.DATA.SQLITE NuGet Package
会不会造成伤害?还是真的,而且只推荐使用这个sqlite-net-pcl插件?
希望有人能用这个来澄清我。
另外,我正在考虑Dapper ORM在我的Xamarin.Android项目中实现SQLite Database Engine. 我已经使这种方法适用于标准WinForm Apps. 所以也可以使用Xamarin.Android?
sqlite system.data.sqlite xamarin.android xamarin sqlite-net
我们在应用程序中使用 SQLite 作为共享数据库。(我知道这不是最好的解决方案,但服务器/客户端架构是不可能的)只有几个用户,一个非常小的数据库和很少的写入。
该应用程序是用 C# 编写的,我们使用System.Data.SQLite.dll,但问题也会发生,例如SQLiteDatabaseBrowser
只要只有一个用户连接到数据库并查询一些结果,速度就非常快。只需几毫秒。一个用户可以建立多个连接并并行执行 select 语句。这对性能也没有影响。
但是,一旦来自不同机器的另一个用户连接到数据库,每个连接的用户的性能就会变得非常差。只要所有连接/应用程序都关闭,性能就会一直很差。之后,第一个用户连接即可恢复良好的性能,直到下一个用户连接为止。
我尝试了很多事情:
之后,我编写了一个小应用程序,用于打开连接、查询一些结果并显示经过的时间。这一切都在无限循环中。
这是这个简单应用程序的代码:
static void Main(string[] args)
{
SQLiteConnectionStringBuilder conBuilder = new SQLiteConnectionStringBuilder();
conBuilder.DataSource = args[0];
conBuilder.Pooling = false;
conBuilder.ReadOnly = true;
string connectionString = conBuilder.ConnectionString;
while (true)
{
RunQueryInNewConnection(connectionString);
System.Threading.Thread.Sleep(500);
}
}
static void RunQuery(SQLiteConnection con)
{
using (SQLiteCommand cmd = con.CreateCommand())
{
cmd.CommandText = "select * from …Run Code Online (Sandbox Code Playgroud) 我正在使用 System.Data.SQLite 在 WPF 项目中创建加密的 SQLite 数据库。加密是通过在连接字符串中提供密码来完成的,如下所示:
new SQLiteConnection("Data Source=database.sqlite;Password=123456;Version=3;New=false;Compress=True;);
Run Code Online (Sandbox Code Playgroud)
这很有效,但由于数据库现在已加密,我无法再使用 DB Browser for SQLite 或 SQLiteStudio 等工具打开它。SQLite Studio 提供了打开 SQLCipher 类型的数据库的可能性,但我正在努力为要打开的数据库提供正确的设置。
有谁知道如何打开加密的 SQLite 数据库,以便我可以检查其中的数据?
我正在使用 C# 应用程序尝试连接到 SQLite 数据库。该应用程序使用库 System.Data.Sqlite,版本 108。在 Visual Studio 2017 中,我的解决方案配置是调试,我的解决方案平台是任何 CPU。每当我构建并运行应用程序时,我都会收到以下运行时异常:
异常未处理,应用程序终止。
当然,我的 bin\Debug 目录中有一个 SQLite.Interop.dll 文件。(如果没有,例外情况会有所不同。)具体来说,有两个,每个都位于各自名为 x64 和 x86 的子目录中。我的假设是正在使用 x86 目录中的文件,因为解决方案平台设置为任何 CPU。SQLite.Interop.dll 程序集的版本与 System.Data.SQLite.dll 的版本匹配,为 1.0.108.0。
当我使用以下命令询问程序集时:
dumpbin /exports SQLite.Interop.dll
Run Code Online (Sandbox Code Playgroud)
我确实在 x64 版本的程序集的输出中找到了以下行:
175 AE 00040750 sqlite3_open_interop
Run Code Online (Sandbox Code Playgroud)
但在 x86 版本的输出中我没有。相反,我找到了这一行:
175 26 00037F10 _sqlite3_open_interop@20
Run Code Online (Sandbox Code Playgroud)
很接近,但不匹配。所以程序集确实没有暴露sqlite3_open_interop这样的方法。
我尝试了将解决方案平台更改为 x64 的明显解决方案,但该更改导致了另一个异常 (BadImageFormatException),我不太想应对它。
我尝试删除对 System.Data.SQLite 的引用并使用 Nuget 添加最新版本 1.0.111.0,然后清理并重建解决方案,但都没有效果。同样的问题再次出现。
有人能建议解决这个问题吗?我相信 SQLite 被广泛使用,所以我必须认为有一种方法可以解决它。
*Edit1:我在我的家用计算机上尝试了这个项目,并观察到两个 SQLite.Interop.dll 文件之间存在相同的差异。x64 版本有一个 sqlite3_open_interop,而 x86 版本有一个 _sqlite3_open_interop@20。然而问题并没有出现在那里。所以显然这个被破坏的名字“问题”是一个转移注意力的话题。我仍然对解决这个问题非常感兴趣,并且感谢从事 System.Data.Sqlite 工作的人的帮助!
我正在使用连接字符串创建System.Data.SQLite内存数据库
"Data Source=:memory:",
Run Code Online (Sandbox Code Playgroud)
并希望在多线程之间访问该数据库。
现在,我要做的就是克隆SQLiteConnection对象并将副本传递给工作线程。
但是我发现,不同的线程实际上获得内存数据库的单个实例,而不是共享的。如何在线程之间共享一个内存数据库?
谢谢!
sqlite ×9
c# ×5
asp.net-mvc ×1
file-io ×1
performance ×1
sqlite-net ×1
sqlitestudio ×1
xamarin ×1