我想执行我的阅读器Npgsql查询,但有一个错误声明如下:
'NpgsqlBatchCommand' does not contain a definition for 'Connection' and no accessible extension method 'Connection' accepting a first argument of type 'NpgsqlBatchCommand' could be found (are you missing a using directive or an assembly reference?) [Assembly-CSharp]
和
'NpgsqlBatchCommand' does not contain a definition for 'ExecuteReader' and no accessible extension method 'ExecuteReader' accepting a first argument of type 'NpgsqlBatchCommand' could be found (are you missing a using directive or an assembly reference?) [Assembly-CSharp]
有人知道为什么吗?或者它有一个新的功能,或者在6.0.5版本中被删除了?
下面是我的代码:
using Npgsql;
void Start()
{
using(NpgsqlConnection conn = new NpgsqlConnection())
{
conn.ConnectionString = "Server = localhost; Port = 5433; Database =
Postgres2; User Id = postgres; Password = admin";
try
{
NpgsqlBatchCommand cmd = new NpgsqlBatchCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT id FROM m_pasukan";
cmd.Connection = conn;
conn.Open();
Debug.Log("Connection Open!");
NpgsqlBatchCommand sdr = cmd.ExecuteReader();
while(sdr.Read())
{
int id = (int)sdr["id"];
Debug.Log(id);
}
}
catch(Exception ex)
{
Debug.Log("Cannot Open Connection!!");
}
}
}
他们没有走。使用了错误的类。代码使用NpgsqlBatchCommand而不是NpgsqlCommand。派生自ADO的类。. NET的DbCommand基类并实现IDbCommand接口是NpgsqlCommand,而不是NpgsqlBatchCommand。
你的代码应该是:
var cmd = new NpgsqlCommand();
或偶数
using(var cmd=new NpgsqlCommand())
{
...
}
或
using(var cmd=new NpgsqlCommand(sql,conn))
{
...
}
ExecuteReader返回一个DbDataReader,它也需要被处理掉。DbDataReader是消耗客户端和服务器资源的查询结果上的快进游标:
using(var sdr = cmd.ExecuteReader())
{
...
}
如果您想要执行单个SQL语句(SELECT id FROM m_pasukan
),那么您确实应该使用NpgsqlCommand。
NpgsqlBatchCommand是新ADO的一部分。. NET批处理API,当您想要执行多个命令时,它是NpgsqlCommand的替代方案:以下是相关的Npgsql文档。
NpgsqlCommand在这种情况下的问题是,您包含多个以分号分隔的语句,迫使数据库驱动程序解析SQL并将语句拆分为不同的有线协议消息。
要使用新的批处理API,请创建NpgsqlBatch并添加NpgsqlBatchCommands。然后,执行NpgsqlBatch命令,而不是NpgsqlBatchCommands。
await using var batch = new NpgsqlBatch(conn)
{
BatchCommands =
{
new("INSERT INTO table (col1) VALUES ('foo')"),
new("SELECT * FROM table")
}
};
await using var reader = await cmd.ExecuteReaderAsync();
额外阅读:
- Npgsql文档
- 博客文章提供了为什么需要批处理API的背景信息