我从昨天开始使用 Npgsql 3.1.7,当时我通过 Nuget 将其更新到 3.1.8,但我得到了相同的异常。
我正在连接到远程 Windows Server 2012,Postgresql 9.5 也在 Debian 8 上尝试了 Postgresql 9.4,具有相同的行为。
我想做的是使用 Npgsql BeginBinaryExport 通过 COPY(select..) 命令选择数据,但几秒钟后抛出异常。每次运行都会发生这种情况。我尝试应用于Pooling=false,Keepalive=10, commandtimeout=0连接字符串但没有成功。
我越来越:
从流读取时出现异常无法从传输连接读取数据:无法建立连接。超时间隔后连接部分给出错误答案或丢失响应。
最后一部分是意大利语,我试着翻译一下,希望你能理解。
这里是堆栈跟踪:
抛出异常: Npgsql.ReadBuffer.Ensure(Int32 count, Boolean dontBreakOnTimeouts) 中的 Npgsql.NpgsqlException' 位于 Npgsql.NpgsqlConnector.DoReadMessage(DataRowLoadingMode dataRowLoadingMode, Boolean isPrepishedMessage) 中 Npgsql.NpgsqlConnector.ReadMessageWithPrepished(DataRowLoadingMode dataRowLoadingMode) 中NpgsqlConnector.ReadExpectingT 在 Npgsql.NpgsqlBinaryExporter..ctor(NpgsqlConnector 连接器,字符串 copyToCommand) 在 Npgsql.NpgsqlConnection.BeginBinaryExport(字符串 copyToCommand)
我尝试将命令从 COPY(select ...) 更改为简单的 select usingNpgsqlCommand并且它有效,但是如果我Pooling=false,Keepalive=10, commandtimeout=0从连接字符串中删除,则会返回异常。
编辑:我使用的代码是:
using (var reader = connection.BeginBinaryExport("COPY (select * from \"DTC_Det\") TO STDOUT (FORMAT BINARY)")){ ... } …Run Code Online (Sandbox Code Playgroud) 当我使用 Npgsql (.net) 从连接字符串中省略数据库时,连接到 PgSQL 时出现错误
我知道如果没有 Database 参数,Pg 将默认为 Database=User,但我不想指定数据库。有什么办法可以做到这一点吗?
否则,“postgres”数据库是否存在于每个 PgSQL 安装中,并且任何可以登录的用户都可以始终连接到它吗?
看起来 Npgsql 有一个与此相关的错误,但在 3.0.1 中已修复。我用的是3.1.8。 https://github.com/npgsql/npgsql/issues/703
谢谢。方舟
我有一类范围
public class avl_range
{
public long start { get; set; }
public long end { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如果我使用正常的FOR工作完美,但必须等待每个命令完成并且每个查询需要 8 秒,所以 10 个查询需要 80 秒。
在并行版本中,如果我只打印范围,效果很完美,但如果尝试执行命令,则说明已经在进行中。
{“操作已在进行中。”}
我该如何解决这个问题?
var numbers = new List<avl_range>();
using (var conn = new NpgsqlConnection(strConnection))
{
conn.Open();
Action<avl_range> forEachLoop = number => //Begin definition of forLoop
{
// only the console write line works ok
Console.WriteLine(number.start + " - " + number.end);
using (var cmd = new NpgsqlCommand())
{
cmd.Connection = conn; …Run Code Online (Sandbox Code Playgroud) 当我尝试使用 npgsqlcommand 对 c# 中的 postgres 执行插入查询时,程序的执行被挂起,cmd.ExecuteNonQuery();
这是我的代码
public void Insert(Mouvement mvt)
{
NpgsqlConnection conn = null;
NpgsqlCommand cmd = null;
try
{
conn = UtilDB.GetConnection();
String sql = "INSERT INTO MOUVEMENT(ID_AERONEF,ID_PF,ID_ESCALE,DATE,SENS,NVOL,PISTE,BLOC,PAXC,PAXY,PAXBB,PAXEXO," +
"TRANSITDIRECT,TRANSITRI,TRANSITRRLC,CONTINU,PN,FRETPAYANT,FRETGRATUIT,BAGAGE,POSTE,MODE,BALISAGE,OBSERVATION) "+
"VALUES (:id_aeronef,:id_pf,:id_escale,:date,:sens,:nvol,:piste,:bloc,:paxc,:paxy,:paxbb,:paxexo," +
":transitdirect,:transitri,:transitrrlc,:continu,:pn,:fretpayant,:fretgratuit,:bagage,:poste,:mode,:balisage,:observation)";
conn.Open();
cmd = new NpgsqlCommand(sql, conn);
cmd.Parameters.Add("id_aeronef", mvt.Aeronef.Id);
cmd.Parameters.Add("id_pf", mvt.Plateforme.Id);
cmd.Parameters.Add("id_escale", mvt.Escale.Id);
cmd.Parameters.Add("date", mvt.Date);
cmd.Parameters.Add("sens", mvt.Sens);
cmd.Parameters.Add("nvol", mvt.Nvol);
cmd.Parameters.Add("piste", mvt.Piste);
cmd.Parameters.Add("bloc", mvt.Bloc);
cmd.Parameters.Add("paxc", mvt.PaxC);
cmd.Parameters.Add("paxy", mvt.PaxY);
cmd.Parameters.Add("paxbb", mvt.PaxBB);
cmd.Parameters.Add("paxexo", mvt.PaxExo);
cmd.Parameters.Add("transitdirect", mvt.TransitDirect);
cmd.Parameters.Add("transitri", mvt.TransitRI);
cmd.Parameters.Add("transitrrlc", mvt.TransitRRLC);
cmd.Parameters.Add("continu", mvt.Continu);
cmd.Parameters.Add("pn", mvt.Pn); …Run Code Online (Sandbox Code Playgroud) 我的 Npgsql 版本 3.2.5 - Postgresql 9.6
我收到此错误CommandType.StoredProcedure(但CommandType.Text有效):
Npgsql.PostgresException:'42883:函数 customer_select(pEmail => 文本,密码 => 文本) 不存在'
string sql3 = @"customer_select";
NpgsqlConnection pgcon = new NpgsqlConnection(pgconnectionstring);
pgcon.Open();
NpgsqlCommand pgcom = new NpgsqlCommand(sql3, pgcon);
pgcom.CommandType = CommandType.StoredProcedure;
pgcom.Parameters.AddWithValue(":pEmail", "myemail@hotmail.com");
pgcom.Parameters.AddWithValue(":pPassword", "eikaylie78");
NpgsqlDataReader pgreader = pgcom.ExecuteReader();
while (pgreader.Read()) {
string name = pgreader.GetString(1);
string surname = pgreader.GetString(2);
}
Run Code Online (Sandbox Code Playgroud)
这是数据库中的函数:
CREATE OR REPLACE FUNCTION public.customer_select(
pemail character varying, ppassword character varying)
RETURNS SETOF "CustomerTest"
LANGUAGE 'plpgsql'
COST 100.0
AS $function$
BEGIN …Run Code Online (Sandbox Code Playgroud) 我从这个 - SemaphoreSlim 开始,以保护连接池免遭耗尽,并很快意识到我的问题是,当我处置 DbContext 时,连接不会返回到池中。
考虑到数据库的所有连接都是在 using 语句中完成的,如下所示:
using (var context = ContextFactory.GetContext<PostgreSqlDatabaseContext>(connectionString))
{
var query = $"SELECT * FROM public.\"MyTable\" WHERE \"MyId\" = '{id}'";
var result = await context.MyTable.FromSql(query).SingleOrDefaultAsync();
return result;
}
Run Code Online (Sandbox Code Playgroud)
看起来ContextFactory像这样:
internal class ContextFactory
{
public static T GetContext<T>(string sqlConnection) where T : DbContext
{
var optionsBuilder = new DbContextOptionsBuilder<PostgreSqlDatabaseContext>();
optionsBuilder.UseNpgsql(sqlConnection);
return new PostgreSqlDatabaseContext(optionsBuilder.Options) as T;
}
}
Run Code Online (Sandbox Code Playgroud)
无论我如何处理连接字符串、Enlist=true按照此处建议的设置,或者按照此处SemaphoreSlim建议的方式限制连接,我都会得到相同的结果:
连接池已耗尽,请提高 MaxPoolSize(当前为 20)或超时(当前为 15 秒)
有 …
尝试将参数传递给 DO 块时,出现错误“42883:运算符不存在:整数=@整数”Npgsql.PostgresException:
var cmd = new NpgsqlCommand();
cmd.CommandText =
@"DO $$
BEGIN
IF EXISTS (SELECT id FROM pub.table1 WHERE id = @id) THEN
UPDATE pub.table1
SET Field1 = @Field1
,Field2 = @Field2
WHERE id = @id;
ELSE
INSERT INTO pub.table1 (id, Field1, Field2)
VALUES (@id, @Field1, @Field2);
END IF;
END $$;";
cmd.Parameters.AddWithValue("@id", 1);
cmd.Parameters.AddWithValue("@Field1", "text");
cmd.Parameters.AddWithValue("@Field2", "text2");
Run Code Online (Sandbox Code Playgroud)
否则,与 postgres 的连接可以工作,并且(经典)查询在传递参数时也可以工作;例如:
cmd.CommandText = @"SELECT * FROM pub.table1 WHERE id = @id;";
Run Code Online (Sandbox Code Playgroud)
是否无法将参数传递给“DO”块,或者我遗漏了什么?
谢谢。中号
当我尝试将整数添加到 Postgresql 数据库时遇到问题。Varchars 工作正常,但是当我使用代码时:
var parameter = cmd.CreateParameter();
parameter.Value = Int32.Parse(x.Value.ToString());
Console.WriteLine(parameter.Value);
parameter.ParameterName = x.Key.ToString();
cmd.Parameters.Add(new NpgsqlParameter("confirmations",NpgsqlTypes.NpgsqlDbType.Integer));
for (int search=0; search != cmd.Parameters.Count; search++)
Run Code Online (Sandbox Code Playgroud)
执行时出错,我使用:
cmd.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)
听上去像:
数据库问题:System.InvalidCastException:无法使用处理程序类型 Int32Handler\ 写入 CLR 类型 System.String
在 lambda_method( 闭包 、 NpgsqlTypeHandler 、 对象 、 NpgsqlLengthCache& 、 NpgsqlParameter )
在 C:\projects\npgsql\src\Npgsql\NpgsqlParameter.cs 中的 Npgsql.NpgsqlParameter.ValidateAndGetLength() 处:第 553 行
在 C:\projects\npgsql\src\Npgsql\NpgsqlCommand.cs 中的 Npgsql.NpgsqlCommand.ValidateParameters() 处:第 793 行
在 C:\projects\npgsql\src\Npgsql\NpgsqlCommand.cs 中的 Npgsql.NpgsqlCommand.ExecuteDbDataReader(CommandBehavior 行为、布尔异步、CancellationToken CancellationToken):第 1141 行
在 C:\projects\npgsql\src\Npgsql\NpgsqlCommand.cs 中的 Npgsql.NpgsqlCommand.ExecuteNonQuery(Boolean async, CancellationToken CancellationToken):第 1042 行
在 C:\projects\npgsql\src\Npgsql\NpgsqlCommand.cs 中的 Npgsql.NpgsqlCommand.ExecuteNonQuery() …
Simple Preparation文档中的示例(https://www.npgsql.org/doc/prepare.html#simple-preparation )显示了在准备命令后设置参数的示例。
var cmd = new NpgsqlCommand(...);
cmd.Parameters.Add("param", NpgsqlDbType.Integer);
cmd.Prepare();
// Set parameters
cmd.ExecuteNonQuery();
// And so on
Run Code Online (Sandbox Code Playgroud)
问题
AddWithValue而不是使用指定的方法Add-文档说“不支持设置值”?AddWithValue(String, NpgsqlDbType, Object)NpgsqlDbType这个答案(/sf/answers/3728766331/)表明可以一起准备单个字符串中的多个命令,但不清楚如何创建此 CommandText 字符串。
编辑:我想我已经快到了,但我不确定如何创建和执行批量查询字符串。这是我使用 StringBuilder 构建批量查询的天真尝试。这是行不通的。我该如何正确地做到这一点?
using System;
using System.Collections.Generic;
using System.Text;
using Npgsql;
using NpgsqlTypes;
class Model
{
public int value1 { get; }
public int value2 { get; }
public Model(int value1, int value2)
{
this.value1 = value1;
this.value2 = value2;
}
} …Run Code Online (Sandbox Code Playgroud) 我们有一个表,其中一列为文本数据类型,并且只有 3 条记录。我们使用 ExecuteNonQuery() 对文本列执行更新查询,它会抛出错误“从流读取时出现异常”。错误是随机发生的,这意味着有时会执行查询,有时会抛出错误,但最大比例是错误,例如十分之九会抛出错误。我们正在使用Npgsql -Version 4.0.4 并PostgreSQL version 11.1运行在windows 2012 R2
. 另外,我们尝试将超时设置为 0,但错误会立即抛出,因此它也与超时错误无关。下面是我们的例外情况。
at Npgsql.NpgsqlReadBuffer.<>c__DisplayClass31_0.<g__EnsureLong|0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Npgsql.NpgsqlConnector.<>c__DisplayClass161_0.<g__ReadMessageLong|0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Npgsql.NpgsqlDataReader.d__46.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task …Run Code Online (Sandbox Code Playgroud)