我第一次使用 PetaPoco,并收到此错误:
An unhandled exception of type 'System.InvalidOperationException' occurred in Anonymiser.exe. Additional information: There is already an open DataReader associated with this Command which must be closed first.
Run Code Online (Sandbox Code Playgroud)
根据以下问题和给出的答案...
...建议这是对同一数据库/资源的多个请求的问题,但他们的解决方案是每个请求使用一个数据库连接,只是我不在复杂的 web 应用程序中,我正在运行单线程控制台应用程序,我想一个 Web 应用程序需要在一个请求中进行多次查询和更新以及所有内容(类似于我正在做的事情,select, loop results, update on each row)。
我已经在下面发布了相关代码,第一位是使用泛型和反射基本上调用“查询”来从表中获取所有数据(旨在不知道我希望随机化的数据的数据库结构),然后我插入随机数据后更改每一行中的数据并“更新”每一行,就像这样......
//select all data in a table
// non-generic version :: db.query<db_table>("select * from db_tableName");
var typedMethod = queryMethodInfo.MakeGenericMethod(t);
var allRows = typedMethod.Invoke(db, new Object[] { "select * from " + tableName, null });
//then loop through the data
foreach (var item in (allRows as IEnumerable))
{
string primaryKey;
if (findPrimaryKey(item, out primaryKey)) // no primary key no update
{
// randomize the data here
DataRandomizer.ProcessObject(item);
// push data back to the database
db.Update(tableName, primaryKey, item);
}
}
Run Code Online (Sandbox Code Playgroud)
我应该在每次操作后“关闭”连接吗?我应该PetaPoco.Database为每个 sql 操作创建一个新对象吗?这并不是答案提出的解决方案,它建议 1 个请求意味着 1 个连接,连接共享,这是一个单线程控制台应用程序,它尚未共享任何内容。
更新:刚刚试过这个......疯狂,但它有效,有人请给我一个理智的解决方案
(new PetaPoco.Database("DBConnectString")).Update(tableName, primaryKey, item);
Run Code Online (Sandbox Code Playgroud)
交换Queryto的用法Fetch。这样做的原因是因为Fetch预先进行工作并返回一个完全填充的集合,而Query在枚举结果集时获取结果。
错误的原因是您正在尝试在获取结果时发出另一个数据库请求,正如错误所述,您不能这样做,因为连接有一个 open DataReader。这就是为什么您需要预先获取结果。
| 归档时间: |
|
| 查看次数: |
822 次 |
| 最近记录: |