控制台应用程序中的 PetaPoco "already an open DataReader"
PetaPoco "already an open DataReader" in console app
我是第一次使用 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.
根据以下问题及给出的答案...
- There is already an open DataReader associated with this Command
- How to create a DAL using Petapoco
...建议这是对同一 database/resource 的多个请求的问题,但他们的解决方案是每个请求使用一个数据库连接,只是我不在复杂的 webapp 中,我是运行 一个 单线程控制台应用程序 ,我想一个 Web 应用程序将需要多个查询和更新以及一个请求中的所有东西(类似于我正在做的,select, loop results, update on each row
).
我已经在下面发布了相关代码,第一部分是使用泛型和反射来基本上调用 "Query" 以从 table 中获取所有数据(设计为不知道数据库结构我希望随机化的数据),然后在插入随机数据后更改每一行和 "Update" 每行的数据,就像这样...
//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);
}
}
每次操作后都应该'close'连接吗?我应该为每个 sql 操作创建一个新的 PetaPoco.Database
对象吗?这并不是 answer 提出的解决方案,它建议 1 个请求意味着 1 个连接,共享连接,这是一个单线程控制台应用程序,尚未共享任何内容。
更新: 刚试过这个...疯狂,但它有效,请有人给我一个理智的解决方案
(new PetaPoco.Database("DBConnectString")).Update(tableName, primaryKey, item);
将 Query
的用法替换为 Fetch
。这样做的原因是因为 Fetch
预先完成工作,returns 是一个完全填充的集合,而 Query
在您枚举结果集时获取结果。
错误的原因是您在获取结果时试图发出另一个数据库请求,正如错误状态,您不能这样做,因为连接有一个打开的 DataReader
。这就是您需要预先获取结果的原因。
我是第一次使用 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.
根据以下问题及给出的答案...
- There is already an open DataReader associated with this Command
- How to create a DAL using Petapoco
...建议这是对同一 database/resource 的多个请求的问题,但他们的解决方案是每个请求使用一个数据库连接,只是我不在复杂的 webapp 中,我是运行 一个 单线程控制台应用程序 ,我想一个 Web 应用程序将需要多个查询和更新以及一个请求中的所有东西(类似于我正在做的,select, loop results, update on each row
).
我已经在下面发布了相关代码,第一部分是使用泛型和反射来基本上调用 "Query" 以从 table 中获取所有数据(设计为不知道数据库结构我希望随机化的数据),然后在插入随机数据后更改每一行和 "Update" 每行的数据,就像这样...
//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);
}
}
每次操作后都应该'close'连接吗?我应该为每个 sql 操作创建一个新的 PetaPoco.Database
对象吗?这并不是 answer 提出的解决方案,它建议 1 个请求意味着 1 个连接,共享连接,这是一个单线程控制台应用程序,尚未共享任何内容。
更新: 刚试过这个...疯狂,但它有效,请有人给我一个理智的解决方案
(new PetaPoco.Database("DBConnectString")).Update(tableName, primaryKey, item);
将 Query
的用法替换为 Fetch
。这样做的原因是因为 Fetch
预先完成工作,returns 是一个完全填充的集合,而 Query
在您枚举结果集时获取结果。
错误的原因是您在获取结果时试图发出另一个数据库请求,正如错误状态,您不能这样做,因为连接有一个打开的 DataReader
。这就是您需要预先获取结果的原因。