【发布时间】:2019-05-29 09:21:15
【问题描述】:
我正在将应用程序从 firebird 移植到 postgres,并且有一堆嵌套的 sql 命令。第一个命令是运行第二个命令所必需的,有些函数有 5 或 6 个嵌套命令,它们都使用相同的连接。我只是想知道是否有一种方法可以在一个连接上完成所有这些操作,而无需重写整个事情。
static void NestedCommandsOnOneConnection()
{
using (NpgsqlConnection connection = new NpgsqlConnection(ConnectionString))
{
using (NpgsqlCommand command = new NpgsqlCommand("SELECT * FROM tableA", connection))
{
using (NpgsqlDataReader reader = command.ExecuteReader())
{
using (NpgsqlCommand command2 = new NpgsqlCommand("SELECT * FROM tableB where column1 = @column1", connection))
{
command2.Parameters.AddWithValue("@column1", reader["column1"]);
using (NpgsqlDataReader reader2 = command2.ExecuteReader())
{
while (reader2.Read())
{
//Do things
}
}
}
}
}
}
}
//编辑:如果我这样做会更好吗?
static void NestedCommandsOnOneConnection()
{
using (NpgsqlConnection connection = new NpgsqlConnection(ConnectionString))
{
var column1 = "";
using (NpgsqlCommand command = new NpgsqlCommand("SELECT * FROM tableA LIMIT 1", connection))
{
using (NpgsqlDataReader reader = command.ExecuteReader())
{
while(reader.Read())
{
column1 = reader["column1"].ToString();
}
}
}
using (NpgsqlCommand command2 = new NpgsqlCommand("SELECT * FROM tableB where column1 = @column1", connection))
{
command2.Parameters.AddWithValue("@column1", column1);
using (NpgsqlDataReader reader2 = command2.ExecuteReader())
{
while (reader2.Read())
{
//Do things
}
}
}
}
}
当第二个命令被执行时,我收到错误消息“命令已经在进行中:SELECT * FROM tableA”那么有什么方法可以做到这一点而不必为每个命令建立连接?
【问题讨论】:
-
那些不是嵌套命令。 ADO.NET 没有这样的东西。没有什么能阻止您使用同一连接执行多个命令。您的代码正在尝试从多个开放阅读器中读取。即使在支持这个的数据库中(带有 MARS 的 SQL Server),这也需要特殊处理
-
你想做什么?编写一个 single 查询将多个表连接在一起并仅返回您需要的结果会更快 很多
-
此代码可以替换为执行
SELECT * from TableB where column1 in (SELECT column1 from TableA)的单个 命令。性能可能会比缓慢的客户端循环好几倍 -
sn-p 代码只是一个例子,不要只发布我正在使用的代码,因为这会让你们感到困惑。我只是想知道是否可以使用一个连接来做类似剪辑的事情
-
此代码显示了错误的数据访问模式。 为什么你想让两个阅读器同时打开?那些应该是只向前的firehose(即快速)阅读器,而不是循环。不管是什么原因,代码都应该修改,这样就不需要了
标签: c# postgresql npgsql