所以我一直在开发一个连接到另一台机器上的 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?
为什么环回不起作用?
我正在尝试使用 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) 使用 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(...),但即使这样也不起作用。
有人有线索吗?谢谢。
我正在使用实体框架,所以我相信我应该捕获一个,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)。
任何帮助,将不胜感激。
在 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) 是否可以针对一个连接执行多个 NpgslqCommand?我的意思是:
conn.Open();
ExecuteCommandA(conn);
ExecuteCommandB(conn);
ExecuteCommandC(conn);
conn.Close();
Run Code Online (Sandbox Code Playgroud)
我相信,这应该是可能的,但是这里有什么问题吗?如果要执行一批命令,则可能需要更长的时间,连接可能会丢失或可能发生其他错误。
所以应该测试一下,对吗?命令也可以使连接进入某种错误状态吗?
谢谢各位的解答...
/IP/
我有一类范围
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) 我习惯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) 我正在使用 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 ?如果是这样,我该如何添加?我在这里缺少什么?
任何帮助将不胜感激,因为我一直在解决这个问题。