我有以下代码:
try
{
//Create connection
SQLiteConnection conn = DBConnection.OpenDB();
//Verify user input, normally you give dbType a size, but Text is an exception
var uNavnParam = new SQLiteParameter("@uNavnParam", SqlDbType.Text) { Value = uNavn };
var bNavnParam = new SQLiteParameter("@bNavnParam", SqlDbType.Text) { Value = bNavn };
var passwdParam = new SQLiteParameter("@passwdParam", SqlDbType.Text) {Value = passwd};
var pc_idParam = new SQLiteParameter("@pc_idParam", SqlDbType.TinyInt) { Value = pc_id };
var noterParam = new SQLiteParameter("@noterParam", SqlDbType.Text) { Value = noter };
var licens_idParam = new …Run Code Online (Sandbox Code Playgroud) 添加新事务后,我突然从SQLite收到以下错误:
数据库文件被锁定数据库被锁定
有没有人见过这个?我添加了一个更新事务(在一些成功的选择/插入之后).我找不到关于这个的任何不同......
我很难找到,对于Sqlite.Net数据提供程序(System.Data.Sqlite.dll)(新开发已经在这里分叉),各种类及其方法抛出了什么异常.我知道可以抛出SqliteExceptions,但什么时候?
我已经确保我有附带的System.Data.Sqlite.xml文档文件,但它似乎没有列出每个方法抛出的异常.
我不想将不必要的代码包装到try/catch块中(或盲目地捕获到处的通用Exception).
我知道SqliteConnection派生自DbConnection,而SqliteCommand派生自DbCommand,所以如果有必要,我想我可以查看那里的文档.但是,没有一个基类会列出SqliteException,那么何时会抛出这些类型的异常?
PS - 我使用的是版本1.0.64(从2009年开始......此时无法升级).
更新:
由于缺乏响应,有没有人使用System.Data.Sqlite.dll?如果是这样,您采取什么方法来处理可能从库中可用对象抛出的异常?有没有一些标准的方法来处理这些异常,因为似乎没有关于抛出的异常和哪些类的文档?
更新2:
我确实找到了在c:\ program files\SQLite.NET\Doc \下找到的SQLite.NET文档(看起来很明显).到目前为止很棒的文档,但它没有告诉你抛出了什么异常.到目前为止,我能做的最好的事情是查看继承的基类或实现的接口,并查看抛出的异常.这仍然无助于知道何时抛出SqliteException对象.
更新3:
在获得源代码后,似乎没有类本身包含任何/// <exception cref="ExceptionType">Something went wrong!</exception>xml注释.这解释了为什么SQLite.NET帮助文件或Visual Studio Intellisense都没有列出可能引发的任何异常.我已经创建了一个请求xml注释的票证,以包含例外,如果它们的优先级列表太低,则提供自己添加它们.对于任何可能感兴趣的人,我会及时更新这个问题.
我正在尝试使用Dapper连接到现有的数据库格式,该格式具有在BIGINT列中编码为刻度的持续时间的表.TimeSpan在插入和读取数据库时,如何告诉Dapper将我的POCO的-typed属性映射到滴答?
我试着设置类型映射TimeSpan到DbType.Int64:
SqlMapper.AddTypeMap(typeof(TimeSpan), DbType.Int64);
Run Code Online (Sandbox Code Playgroud)
我也创建了一个ITypeHandler,但SetValue从未调用过该方法:
public class TimeSpanToTicksHandler : SqlMapper.TypeHandler<TimeSpan>
{
public override TimeSpan Parse(object value)
{
return new TimeSpan((long)value);
}
public override void SetValue(IDbDataParameter parameter, TimeSpan value)
{
parameter.Value = value.Ticks;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的POCO:
public class Task
{
public TimeSpan Duration { get; set; }
// etc.
}
Run Code Online (Sandbox Code Playgroud)
执行这样的简单插入语句时:
string sql = "INSERT INTO Tasks (Duration) values (@Duration);";
Run Code Online (Sandbox Code Playgroud)
并将POCO作为要插入的对象传递:
Task task = new Task { Duration = TimeSpan.FromSeconds(20) }; …Run Code Online (Sandbox Code Playgroud) 是否有一个SELECT命令可以列出所有附加的数据库,类似于sqlite3中提供的.database命令?
问题:进行单元测试时,我的DAL程序集中引用的SQLite程序集不会被复制到输出文件夹(Copy local设置为true).
我正在使用VS2008中的.Net 3.5应用程序,在我的DAL中使用NHibernate和SQLite.数据访问通过IRepository接口(存储库工厂)公开给其他层,因此不需要引用其他层中NHibernate的System.Data.SQLite程序集.
对于单元测试,有一个公共工厂方法(也在我的DAL中),它创建一个内存中的SQLite会话并创建一个新的IRepository实现.这样做也是为了避免为需要它的所有程序集提供共享的SQLite内存配置,并避免引用这些DAL内部程序集.
问题是当我运行单独项目的单元测试时 - 如果我不添加System.Data.SQLite作为单元测试项目的引用,它不会被复制到TestResults ...\Out文件夹(虽然这个项目引用了我的引用的DAL项目,System.Data.SQLite其Copy本地属性设置为true),因此在配置NHibernate时测试失败.如果我添加对我的测试项目的引用,那么它会被复制并且单元测试工作.
我究竟做错了什么?
[更新]
看来我在这里找到了答案:TFS UnitTesting在构建服务器上没有部署本地副本程序集来测试目录.如果我在DAL中的某个静态方法中添加对该类型的引用,那么当我在测试中引用DAL程序集时,它将自动复制.这似乎是一个黑客,但恕我直言是一个更清洁的解决方案,而不是单独的脚本,因为它创建一个"真正的"依赖.
看来,如果我添加了SQLite的组件作为一个额外的部署项目到我的测试运行配置(LocalTestRun.testrunconfig文件)也被复制.
谢谢你的快速解答!
我有一个系统,它在收到消息后 - 将其排队(写入表),另一个进程轮询数据库并将其出列以进行处理.在我的自动测试中,我已经在同一个过程中合并了操作,但是不能(在概念上)合并来自两个操作的NH会话.
自然 - 出现问题.
我已经阅读了关于让SQLite-InMemory-NHibernate组合在测试环境中工作的一切,但由于"没有这样的表"错误,我现在遇到了随机测试失败.为了说清楚 - "随机"意味着具有相同确切配置和代码的相同测试有时会失败.
我有以下SQLite配置:
return SQLiteConfiguration
.Standard
.ConnectionString(x => x.Is("Data Source=:memory:; Version=3; New=True; Pooling=True; Max Pool Size=1;"))
.Raw(NHibernate.Cfg.Environment.ReleaseConnections, "on_close");
Run Code Online (Sandbox Code Playgroud)
在我的测试开始时(每次测试),我获取"静态"会话提供程序,并请它刷新现有的数据库清理,并重新创建模式:
public void PurgeDatabaseOrCreateNew()
{
using (var session = GetNewSession())
using (var tx = session.BeginTransaction())
{
PurgeDatabaseOrCreateNew(session);
tx.Commit();
}
}
private void PurgeDatabaseOrCreateNew(ISession session)
{
//http://ayende.com/Blog/archive/2009/04/28/nhibernate-unit-testing.aspx
new SchemaExport(_Configuration)
.Execute(false, true, false, session.Connection, null);
}
Run Code Online (Sandbox Code Playgroud)
所以是的,它是在不同的会话上,但是连接是在SQLite上汇集的,所以我创建的下一个会话将看到生成的模式.然而,虽然大多数时候它都有效 - 但有时后来的"入队"操作会失败,因为它无法看到我传入消息的表格.此外 - 每个测试套件运行似乎最多发生一次或两次; 并非所有的测试都失败了,只是第一个(有时是另一个.不太确定它是否是第二个).
最糟糕的是随机性,自然而然.我告诉自己我现在已经修好了几次,只是因为它只是"停止了失败".随意.
这种情况发生在FW4.0,System.Data.SQLite x86版本,Win7 64b和2008R2(总共三台不同的机器),NH2.1.2,配置了FNH,在TestDriven.NET 32b precesses和NUnit控制台32b进程上.
救命?
我在SQLite查询中使用SQLiteParameters和LIKE运算符时遇到问题.这是一段代码,如果我这里没有足够的代码,我会道歉.如果是这种情况,我可以轻松发布更多内容.
表现不佳:
using (OdysseyDataContext entities = new OdysseyDataContext())
{
var results = entities.SearchResults.SqlQuery(
"SELECT * FROM SearchResults WHERE ContactName LIKE @ContactName",
new SQLiteParameter("@ContactName", "test")
);
}
Run Code Online (Sandbox Code Playgroud)
很好的表现;很好的绩效:
using (OdysseyDataContext entities = new OdysseyDataContext())
{
var results = entities.SearchResults.SqlQuery(
string.Format(
"SELECT * FROM SearchResults WHERE ContactName LIKE '{0}'",
"test"
)
);
}
Run Code Online (Sandbox Code Playgroud)
其他重要代码:
public class OdysseyDataContext : DbContext
{
public DbSet<SearchResult> SearchResults { get; set; }
}
public class SearchResult
{
[Key]
public Guid Id { get; set; }
public string …Run Code Online (Sandbox Code Playgroud) 我有一个引用System.Data.SQLite(来自nuget)的C#类库.这是构建后我的bin文件夹的结构:
- MyProject.dll
- System.Data.SQLite.dll
- 86/SQLite.Interop.dll
- X64/SQLite.Interop.dll
System.Data.SQLite需要SQLite.Interop运行并在运行时找到正确的dll.但是,当我使用包含项目主输出的InstallShield生成安装程序时,不会复制x86和x64文件夹,并且我的应用程序无法运行.
有什么方法可以强制Visual Studio在主输出中包含x86和x64文件夹?
有没有办法在InstallShield中手动包含文件夹和相对路径?
我的环境:
- Visual Studio 2012专业版
- 安装Shield 2013限量版(免费)
- System.Data.SQLite 1.0.96
dll installshield system.data.sqlite visual-studio-2012 installshield-le
我正在使用Sqlite数据库和System.Data.SQLite 1.0.92 这里有2个表:
表人:
PERSONID
PERSONNAME
表学生:
学生卡
PersonId(参考表人FK)
StudentNo
现在每次我在EF5中获得Persons Collection:
using (var ctx = new myEntities)
{
AllPersons = ctx.Persons.ToList();
}
Run Code Online (Sandbox Code Playgroud)
还有AllPersons.student集合将包含在结果中;
但我不需要它.当然这只是一个例子,有很多大表有这么多的引用,因此它总是存在性能问题.
所以我试图不让它出现在我的结果中.所以我改变它:
using (var ctx = new myEntities)
{
ctx.Configuration.ProxyCreationEnabled = false;
ctx.Configuration.LazyLoadingEnabled = false;
AllPersons= ctx.Persons.ToList();
}
Run Code Online (Sandbox Code Playgroud)
现在很好,因为AllPersons.student收集将永远null
但现在我发现:如果我和同学一起学习:
using (var ctx = new myEntities)
{
ctx.Configuration.ProxyCreationEnabled = false;
ctx.Configuration.LazyLoadingEnabled = false;
AllPersons= ctx.Persons.ToList();
AllStudents = ctx.Student.ToList();
}
Run Code Online (Sandbox Code Playgroud)
现在参考仍然包括在内.
那么在这种情况下,有没有让参考包含在任何时间?谢谢.
更新 …
c# ×6
sqlite ×5
.net ×2
nhibernate ×2
.net-4.0 ×1
dapper ×1
dll ×1
exception ×1
in-memory ×1
orm ×1
parameters ×1
testing ×1
unit-testing ×1