标签: npgsql

为什么我的 Web 应用程序使用 ipv6 连接到本地 postgres

所以我一直在开发一个连接到另一台机器上的 postgresql 服务器的 Web 应用程序。一切正常。

然后我将 Web 应用程序部署到运行 postgresql 服务器的同一台计算机上,并收到一条错误消息:

FATAL: 28000: no pg_hba.conf entry for host "fe80::ccee:154f:18f5:418f%11", user "myuser", database "mydb", SSL off 
Run Code Online (Sandbox Code Playgroud)

我的 pg_hba-conf 已经有这一行:

# IPv6 local connections:
host    all             all             ::1/128                 md5  
Run Code Online (Sandbox Code Playgroud)

那应该是 ipv6 的环回地址,对吗?

我可以通过添加这一行来修复它(纯粹猜测):

#host   all             all             fe80::/16               md5
Run Code Online (Sandbox Code Playgroud)

我怀疑这可以让每个人都连接起来吗?

那么问题是为什么要使用 ipv6 而不是 ipv4?

为什么环回不起作用?

postgresql ipv6 npgsql

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

Dapper 参数无法通过 npgsql 连接与 PostgreSQL 一起使用,postgres 匿名函数参数化是否支持?

我正在尝试使用 dapper 来参数化我编写的用于更新插入的 postgres 匿名函数。这是代码:

private static int UpsertProductPrice(
        IDbConnection connection,
        Data.ProductPrice price,
        List<Data.ProductPriceTier> priceTiers)
    {
        string postgres = @"DO $$
        BEGIN 
        UPDATE product_price 
            SET start_date = @StartDate, end_date = @EndDate, price_tier_type = @PriceTierType
            WHERE product_price_external_id = @Id;
        IF found THEN
            RETURN;
        END IF;
        BEGIN
            INSERT INTO product_price(product_price_external_id, start_date, end_date, price_tier_type) 
            VALUES (@Id, @StartDate, @EndDate, @PriceTierType);
            RETURN;
        EXCEPTION WHEN unique_violation THEN END; END$$;";

        int productPriceId = connection.Execute(
            postgres,
            new { Id = price.product_price_external_id, StartDate = price.start_date, EndDate = price.end_date, PriceTierType …
Run Code Online (Sandbox Code Playgroud)

c# postgresql npgsql dapper

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

从 F# 访问显式转换运算符

使用 npgsql 从 postgresql 读取日期值时出现以下错误:

This expression was expected to have type
    DateTime    
but here has type
    NpgsqlTypes.NpgsqlDate  
Run Code Online (Sandbox Code Playgroud)

现在 npgsql 文档引用了正在定义的显式运算符:

[C#]
public static explicit operator DateTime(
    NpgsqlDate date
);
Run Code Online (Sandbox Code Playgroud)

但我不知道如何从 F# 访问它。

有几种笨拙的、简单的方法可以实现我所需要的,但我感到失望和沮丧,因为我无法找到访问内置演员的方法。

我尝试了旧的 Convert.ToDateTime(...),但即使这样也不起作用。

有人有线索吗?谢谢。

f# npgsql

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

当无法找到请求的 PostgreSQL 表时如何捕获异常并使用错误代码?

我正在使用实体框架,所以我相信我应该捕获一个,NpgsqlException因为它是 PostgreSQL 的 .NET 数据提供程序。假设我对上下文进行查询。如果PostgreSQL数据库中不存在该表,我想捕获抛出的异常,然后手动创建它。下面的代码是如何插入实体的示例,如果需要,我尝试使用错误处理来创建表:

try
{
    return _context.Set(entityType).Add(entity);
}
catch (NpgsqlException)
{
    CreateEntityTable(entity); //a private method I made
    return _context.Set(entityType).Add(entity);
}
Run Code Online (Sandbox Code Playgroud)

问题是:

  • 我不是 100% 确定我应该捕获 NpgsqlException

  • 我想确保如果抛出异常,那是因为该表不存在。我查阅了错误代码的 PostgreSQL 文档,错误代码 42P01 是未定义的表。我相信我想用它,但是怎么用呢?我查找了NpgsqlException 类的成员,找到了 ErrorCode。然而,这是一个 int 类型。如果我可以将上面的代码更改为如下所示,那就太好了

    try
    {
        return _context.Set(entityType).Add(entity);
    }
    catch (NpgsqlException ex)
    {
        if (ex.ErrorCode.Equals(42P01))
        {
            CreateEntityTable(entity); //a private method I made
            return _context.Set(entityType).Add(entity);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

但我不确定这是否有意义(我什至不确定 42P01 如何成为一个 int)。

任何帮助,将不胜感激。

c# postgresql error-handling entity-framework npgsql

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

具有多个语句的 Npgsql 命令

在 Npgsql V2 中,我可以使用以下代码来更新记录,并使用单个 Npgsql 命令返回更新的记录值。

command.CommandText属性包含 UPDATE 语句和 SELECT 语句。这个想法是,当command.ExecuteReader调用时,两个命令都会运行,但 SELECT 命令的结果将被返回(因为它是最后一个命令)。

升级到 Npgsql 版本 3.0.3.0 后,数据读取器中的值(来自 SELECT 语句)仍然是原始值,而不是更新后的值(Return dr("action")代码中的行)。我尝试了每个不同的 IsolationLevel,它们都给出了相同的结果(就好像 SELECT 语句没有看到 INSERT 语句中的更新值一样)。该值在数据库中正确更新(如果我重新查询记录,它具有更新的值)。

我可以将其拆分并使用两个单独的 NpgsqlCommand(一个用于 INSERT,第二个用于 SELECT),但我不想创建到服务器的第二次往返。

这是一个简化的函数,真正函数的目的是更新数据库服务器上的记录,然后使用服务器更新的任何其他字段(例如更新的“last_updated”时间戳字段)更新应用程序中的对象每次更新记录时在服务器上)。

有没有办法让它与 Npgsql V3.0.3.0 一起工作?

Public Function UpdateRecordExample(id As Guid, newAction As String) As String
        Using conn As New NpgsqlConnection("Connection String Here")
            Using trans = conn.BeginTransaction(IsolationLevel.ReadUncommitted)
                Dim command = conn.CreateCommand
                command.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord
                command.CommandText = "Update pm.action_item SET action=@action WHERE id=@id; SELECT * FROM …
Run Code Online (Sandbox Code Playgroud)

.net postgresql npgsql

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

Npgsql:一个连接,多个命令

是否可以针对一个连接执行多个 NpgslqCommand?我的意思是:

conn.Open();
ExecuteCommandA(conn);
ExecuteCommandB(conn);
ExecuteCommandC(conn);
conn.Close();
Run Code Online (Sandbox Code Playgroud)

我相信,这应该是可能的,但是这里有什么问题吗?如果要执行一批命令,则可能需要更长的时间,连接可能会丢失或可能发生其他错误。

所以应该测试一下,对吗?命令也可以使连接进入某种错误状态吗?

谢谢各位的解答...

/IP/

.net c# npgsql

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

我可以将 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
查看次数

如何设置Npgsql的超时值?

我习惯CommandTimeout=5设置超时,但不行。

这是我的代码:

Dim con As New NpgsqlConnection
        Dim cmd As New NpgsqlCommand
        Dim conStr As String
        Try
            Dim sql = "Select * from dat_extract_text a join dat_replace_text b on a.tm_id=b.tm_id 
join dat_base_text_dt c on c.tm_id=a.tm_id
join dat_base_text_dt_font d on d.tm_id=c.tm_id
limit 250000"
            conStr = "Server=192.168.1.10;Port=5434;UserId=testuser;Password=1234;Database=testdb;CommandTimeout=5;"
            con.ConnectionString = conStr
            con.Open()

            cmd.Connection = con
            cmd.CommandText = sql

            Dim st = DateTime.Now
            Dim rs = cmd.ExecuteNonQuery
            Dim et = DateTime.Now
            Dim t = (et - st).TotalSeconds           
        Catch ex As Exception
        End …
Run Code Online (Sandbox Code Playgroud)

vb.net postgresql npgsql

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

Npgsql与.net core web api中的ssl证书连接

我正在使用 NpgSqlConnection for .net core Web api 项目。当前的 PostgreSQL 服务器已移动到另一台服务器,需要使用客户端证书进行连接。我们提供了 3 个证书文件,分别名为 client-cert.pem、client-key.pem 和 server-ca.pem。我能够通过浏览器中的 pgAdmin 使用客户端证书和密钥文件连接到服务器。但是,我无法从我的代码进行连接。尝试了网上的几种方法,但仍然出现以下错误。

{“28000:连接需要有效的客户端证书”}

我正在尝试的代码片段如下所示。

var connectionString = "User ID=" + _dOptions.Value.AuthenticationCredentials.UserName
               + ";Password=" + _dOptions.Value.AuthenticationCredentials.PassWord
               + ";Server=" + _dOptions.Value.Server
               + ";Port=" + _dOptions.Value.Port.ToString()
               + ";Database=" + _dOptions.Value.Database
               + ";Integrated Security=true;Pooling=true;SSL Mode=Require;Trust Server Certificate=true";

_con = new NpgsqlConnection(connectionString);
_con.ProvideClientCertificatesCallback += new ProvideClientCertificatesCallback(MyClientCertificates);
Run Code Online (Sandbox Code Playgroud)
private void MyClientCertificates(X509CertificateCollection certificates)
{
      var cert = new X509Certificate("C:\\Users\\c-Anish\\Documents\\cloud_sql_replica_certs\\DEV\\client-cert.pem");
      certificates.Add(cert);
}
Run Code Online (Sandbox Code Playgroud)

另外,这里我们仅使用名为 client-cert.pem 的客户端证书,但是,我认为我们可能需要使用 client-key.pem ?如果是这样,我该如何添加?我在这里缺少什么?

任何帮助将不胜感激,因为我一直在解决这个问题。

c# postgresql ssl-certificate npgsql .net-core

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