SQLite v3.7.5
有没有一种方法,使SQLite的外键与cascade delete默认启用?给出以下示例:
CREATE TABLE [Parent] (
[ParentId] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
[Name] VARCHAR(50) UNIQUE NOT NULL
);
CREATE TABLE [Child] (
[ChildId] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
[ParentId] INTEGER NOT NULL,
[Name] VARCHAR(50) NOT NULL,
FOREIGN KEY(ChildId) REFERENCES Child(ParentId) ON DELETE CASCADE
);
Run Code Online (Sandbox Code Playgroud)
我能够启用级联删除的唯一方法是PRAGMA foreign_keys = true在事务之前执行命令:
using( var conn = new SQLiteConnection( _conn ) )
{
conn.Open();
var pragma = new SQLiteCommand( "PRAGMA foreign_keys = true;", conn ); …Run Code Online (Sandbox Code Playgroud) 我有一个表"Customer",它在实体框架中是相应的ORMapping Entity Customer,我想找到一个对应于给定主键的对象.有点像customerobject.getbjectByID()lambda表达式或查询.
正如我可以从SQLite FAQ中读到的,它支持多个进程读取(SELECT),并且在任何时刻都只支持一个进程写入(INSERT,UPDATE,DELETE)数据库:
SQLite使用读取器/写入器锁来控制对数据库的访问.当任何进程想要写入时,它必须在更新期间锁定整个数据库文件.但这通常只需要几毫秒.其他流程只是等待作者完成然后继续他们的业务
我通过c#使用System.Data.SQLite适配器.
有人可以告诉我PLZ,这个过程到底是怎么回事?
这个过程是否会自动运行,编写SQLiteCommand只会等待另一个SQLiteCommand已经在同一个数据库上执行?
或者它可能会抛出异常?什么样的?
抱歉,但我没有找到有关此机制的信息:)
谢谢.
更新:
我发现帖子说异常会引发一个特定的错误代码
这句话是否正确?
我已经SQLLite在我的应用程序中生成了我的模型,但是当我尝试调用DBContextCall时它会抛出异常.
System.IO.FileLoadException发生 了类型的异常,mscorlib.dll但未在用户代码中处理附加信息:无法加载文件或程序集'System.Data.SQLite.EF6,Version = 1.0.93.0,Culture = neutral,PublicKeyToken = db937bc2d44ff139'或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)
请帮我.
我希望能够在使用 SQLite 和 SqlServer 作为 ASP.NET Core 应用程序中实体框架的数据库提供程序之间进行切换。
DbContext将 a与数据库提供程序关联的通常模式是通过ConfigureServices方法中的代码:
services.AddDbContext<FeedbackDbContext>(options => options.UseSqlite(Configuration.GetConnectionString("Feedback")));
Run Code Online (Sandbox Code Playgroud)
EF Core 的每个数据库提供程序都添加了自己的扩展方法,如Use<Provider>.
令我惊讶的是,我找不到在配置中为连接字符串指定数据库提供程序的方法
sql-server system.data.sqlite entity-framework-core asp.net-core
我问的是.Net实现 - System.Data.SQLite.是否有以线程安全方式使用它的准则?
我知道SQLite本身可以在有或没有线程安全的情况下编译- 但System.Data.SQLite是如何编译的?
我编写了一个使用sqlite的应用程序,它在大多数系统上运行良好.它是用C#编写的,唯一的非框架程序集是sqlite,它包含在System.Data.SQLite.dll中.
我在所有机器上以相同的方式部署它(复制粘贴exe文件,数据库文件和System.Data.SQLite文件).它适用于我所有的PC以及我尝试过的大多数PC.
但后来我得到报告说,对某些人来说,它会抛出以下异常:
无法加载文件或程序集'System.Data.SQLite,Version = 1.0.65.0,Culture = neutral,PublicKeyToken = db937bc2d44ff139'或其依赖项之一.尝试加载格式不正确的程序.
现在我已确保dll文件与应用程序exe文件位于同一文件夹中.它是相同的dll,具有与上面的异常消息中所述相同的版本.
我真的对此感到困惑,所以我创建了一个新的虚拟机,在其上安装了Windows 7专业版,并且只是复制粘贴文件,并且事情有效.因此,如果它在一个新窗口上工作,我无法想象其他PC可能会丢失什么...
注意:项目抛出异常的其中两台机器也运行Windows 7 proffesional.
我真的很感激这方面的任何帮助,因为我是新鲜的想法......
我监听数据流并将数据作为插入语句存储在a中,ConcurrentQueue并使用System.Threading.Timer间隔为1000的大量插入插入数据.整个场景在静态类上运行.这是代码:
static void timer_Elapsed(object sender, ElapsedEventArgs e)
{
if (queryQueue.IsEmpty)
return;
string text = "";
//bulkBuilder is StringBuilder.
//queryQueue is ConcurrentQueue
bulkBuilder.AppendLine("PRAGMA synchronous = 0;PRAGMA count_changes = FALSE;PRAGMA journal_mode=OFF;Begin;");
while (queryQueue.TryDequeue(out text))
{
bulkBuilder.Append(text);
bulkBuilder.AppendLine(";");
}
bulkBuilder.AppendLine("Commit;");
try
{
sqlCommand.CommandText = bulkBuilder.ToString();
sqlCommand.ExecuteNonQuery();
}
catch (System.Exception ex)
{
Console.WriteLine("Error while inserting Data : " + ex.Message);
}
finally
{
bulkBuilder.Clear();
}
}
Run Code Online (Sandbox Code Playgroud)
有趣的是,sqlCommand仅用于插入,仅用ExecuteNonQuery()于此计时器.并且不时会收到错误消息"无法在datareader处于活动状态时设置commandtext".这完全是无稽之谈,因为这个代码无关与内心SQLiteDataReader的sqlCommand.
我怎样才能摆脱这个错误?
我通过System.Data.Sqlite用Sqlite检查Dapper的v1.25.如果我运行此查询:
var rowCount = dbc.Query<int>("SELECT COUNT(*) AS RowCount FROM Data").Single();
Run Code Online (Sandbox Code Playgroud)
我收到以下错误: System.InvalidCastException: Specified cast is not valid
这是因为Sqlite将上述值作为Int64返回,我可以使用以下代码进行验证.这将抛出"Int64":
var row = dbc.Query("SELECT COUNT(*) AS RowCount FROM Data").Single();
Type t = row.RowCount.GetType();
throw new System.Exception(t.FullName);
Run Code Online (Sandbox Code Playgroud)
现在,以下代码实际上将处理从Int64到Int32的向下转换:
public class QuerySummary
{
public int RecordCount { get; set; }
}
var qs = dbc.Query<QuerySummary>("SELECT COUNT(*) AS RecordCount FROM Data").Single();
rowCount = qs.RecordCount;
throw new System.Exception(rowCount.ToString());
Run Code Online (Sandbox Code Playgroud)
当我抛出此异常时,它会给我实际的行数,表明Dapper为我处理了转换.
我的问题是,为什么dbc.Query<int>不以类似的方式处理向下转换dbc.Query<QuerySummary>?这是预期的行为吗?
我正在努力寻找有关System.Data.SQLite关于各种.NET数据类型的行为的文档。
例如,System.Data.SQLite如何在SQLite数据库中存储.NET布尔值?有几种可能的方法:
反之亦然–如何从SQLite中解析布尔值?System.Data.SQLite是否期望某种格式?那是什么格式?
缺少有关此问题的文档令人沮丧。也许我找的地方不对?
注意:这不是专门关于布尔值的问题。我正在寻找说明所有.NET数据类型行为的文档。
sqlite ×8
.net ×5
c# ×5
asp.net-core ×1
dapper ×1
database ×1
deployment ×1
foreign-keys ×1
locking ×1
sql-server ×1