标签: npgsql

从流读取时出现 Npgsql 异常

我从昨天开始使用 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)

c# sql postgresql npgsql

5
推荐指数
1
解决办法
1万
查看次数

没有数据库的 PostgreSQL 连接字符串 - 使用 NPgSQL 时出错

当我使用 Npgsql (.net) 从连接字符串中省略数据库时,连接到 PgSQL 时出现错误

  • 错误:{“3D000:数据库\“j.smith\”不存在”}
  • 连接字符串失败:服务器={0};端口={1};用户ID={2};密码={3};
  • 工作连接字符串:服务器={0};端口={1};用户ID={2};密码={3};数据库=postgres

我知道如果没有 Database 参数,Pg 将默认为 Database=User,但我不想指定数据库。有什么办法可以做到这一点吗?

否则,“postgres”数据库是否存在于每个 PgSQL 安装中,并且任何可以登录的用户都可以始终连接到它吗?

看起来 Npgsql 有一个与此相关的错误,但在 3.0.1 中已修复。我用的是3.1.8。 https://github.com/npgsql/npgsql/issues/703

谢谢。方舟

postgresql npgsql

5
推荐指数
0
解决办法
1240
查看次数

我可以将 Parallel.For 与 sql 命令一起使用吗?

我有一类范围

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)

c# sql postgresql npgsql parallel.for

5
推荐指数
1
解决办法
2813
查看次数

使用 npgsql 在 C# 中插入

当我尝试使用 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)

c# postgresql npgsql

5
推荐指数
1
解决办法
8909
查看次数

postgresql 执行带有参数的存储过程

我的 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)

c# postgresql stored-functions npgsql

5
推荐指数
1
解决办法
3万
查看次数

Npgsql,连接池已耗尽

我从这个 - 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 秒)

有 …

.net c# postgresql entity-framework npgsql

5
推荐指数
0
解决办法
9369
查看次数

C# 将参数传递给 Postgres Npgsqlcommand DO 块

尝试将参数传递给 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”块,或者我遗漏了什么?

谢谢。中号

c# postgresql sqlcommand npgsql

5
推荐指数
0
解决办法
1731
查看次数

使用 Npgsql 的 C# - 无法使用处理程序类型 Int32Handler 编写 CLR 类型 System.String

当我尝试将整数添加到 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() …

c# postgresql npgsql

5
推荐指数
1
解决办法
3万
查看次数

在 npgsql 中准备语句和批处理

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)

问题

  1. 参数如何设置?
  2. 是否可以使用AddWithValue而不是使用指定的方法Add-文档说“不支持设置值”?AddWithValue(String, NpgsqlDbType, Object)NpgsqlDbType
  3. 如果同一命令中存在多个语句,这将如何工作?

这个答案(/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)

npgsql

5
推荐指数
1
解决办法
6377
查看次数

从 npgsql 中的流读取时出现异常

我们有一个表,其中一列为文本数据类型,并且只有 3 条记录。我们使用 ExecuteNonQuery() 对文本列执行更新查询,它会抛出错误“从流读取时出现异常”。错误是随机发生的,这意味着有时会执行查询,有时会抛出错误,但最大比例是错误,例如十分之九会抛出错误。我们正在使用Npgsql -Version 4.0.4PostgreSQL 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)

postgresql npgsql

5
推荐指数
1
解决办法
1万
查看次数