我试图使用Npgsql来调用一个以CHARACTER作为参数的函数(存储过程),但它不起作用.如果我声明没有参数的相同函数,或者使用INTEGER参数,我会得到我想要的结果集.当我将参数声明为CHARACTER时,它将停止工作.怎么了?
这是我的函数的代码:
CREATE OR REPLACE FUNCTION testrefcursor1(in xxx character varying(10)) RETURNS SETOF refcursor AS
$$
DECLARE
ref1 refcursor;
ref2 refcursor;
BEGIN
OPEN ref1 FOR
SELECT * FROM accounts;
RETURN NEXT ref1;
OPEN ref2 FOR
SELECT * FROM accounts;
RETURN NEXT ref2;
RETURN;
END;
$$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的C#代码:
var connection = new Npgsql.NpgsqlConnection(connectionString.ConnectionString);
connection.Open();
var trans = connection.BeginTransaction();
var command = new Npgsql.NpgsqlCommand("testrefcursor1", connection);
command.CommandType = System.Data.CommandType.StoredProcedure;
var parameter = command.CreateParameter();
parameter.ParameterName = "xxx";
parameter.DbType = System.Data.DbType.String;
parameter.Value = "10";
command.Parameters.Add(parameter); …Run Code Online (Sandbox Code Playgroud) 我使用的是 Visual Studio 2010 PostgreSQL 9.x Npgsql
我正在尝试从 C# WinForms 应用程序上的字段插入数据。我只是不知道如何即时生成/检索下一个主键值。这是我的列名:
EpiphanyKey [PK] bigserial 交易数字许可证字符 dateOfActv 日期时间时间
我需要插入命令是“会话安全的”,因为多个人可以同时将数据输入到数据库中。
NpgsqlConnection conn = new NpgsqlConnection("Server=localhost;Port=5432;User Id=postgres;Password=password;Database=epiphany;"); // postgres 8.3 on my test system
conn.Open(); // opens the connection
NpgsqlCommand cmd = new NpgsqlCommand("INSERT INTO wsmsmrs210 (epiphanyKey,transaction,license,dateOfActv,time, conn);
NpgsqlDataReader dr = cmd.ExecuteReader();
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,NpgsqlCommand cmd = ... 语句无法正常工作,因为我不知道主键值 epiphanyKey 的下一个主键值。
在将查询发送到数据库时生成下一个主键值的任何想法或代码片段?
当我执行“更改数据源”步骤时,列表中仅显示 SQL Server 提供程序。(PostgreSQL 数据库)不显示。
我可以执行哪些故障排除步骤来找出它不显示的原因?
Win7 x32、VS2010专业版
使用 Npgsql V3.0.3.0,我将一条新记录添加到一个表中,该表在数据库中有一个 OID 类型的列,它应该映射到UInt32.Net 类型。
执行插入命令时,抛出以下异常“Npgsql 或您的 PostgreSQL 不支持此 .NET 类型:System.UInt32”。
异常中的堆栈跟踪是:
at Npgsql.TypeHandlerRegistry.get_Item(Type type)
at Npgsql.TypeHandlerRegistry.get_Item(Object value)
at Npgsql.NpgsqlParameter.ResolveHandler(TypeHandlerRegistry registry)
at Npgsql.NpgsqlParameter.Bind(TypeHandlerRegistry registry)
at Npgsql.NpgsqlCommand.ValidateAndCreateMessages(CommandBehavior behavior)
at Npgsql.NpgsqlCommand.ExecuteNonQueryInternal()
at Npgsql.NpgsqlCommand.ExecuteNonQuery
Run Code Online (Sandbox Code Playgroud)
此表中GetSchemaTablea的方法DataReader报告 OID 列的“数据类型”为UInt32。
我正在尝试在我的连接字符串中设置SSL Mode:
SSL Mode=preferred;
Run Code Online (Sandbox Code Playgroud)
ArgumentException但是当我的代码尝试连接到数据库时,我得到了:
请注意InnerException, 说:
未找到请求的值“首选”。
required查看以下文档,指定,disabled或应该有效preferred:
我使用的是 Npgsql 3.0.3,它是通过 NuGet 获得的:
这是我的appsettings.json文件
{
"ConnectionStrings": {
"DefaultConnection": "Host=localhost;Port=5432;Database=db;User ID=postgres;Password=root"
},
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我检索连接字符串的方式:
// Only works when run through visual studio not on vs code
Configuration.GetConnectionString("DefaultConnection")
Run Code Online (Sandbox Code Playgroud)
我的launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": ".NET Core Launch (web)",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceRoot}\\src\\Chlx\\bin\\Debug\\netcoreapp1.0\\Chlx.dll",
"args": [],
"cwd": "${workspaceRoot}",
"stopAtEntry": false,
"internalConsoleOptions": "openOnSessionStart",
"launchBrowser": {
"enabled": true,
"args": "${auto-detect-url}",
"windows": {
"command": "cmd.exe",
"args": "/C …Run Code Online (Sandbox Code Playgroud) connection-string npgsql visual-studio-2015 visual-studio-code asp.net-core
这让我摸不着头脑。有一个类似的问题可能与“函数不存在”有关,但我真的认为它确实存在并且PostgreSQL 函数不存在但答案似乎不是很明显。PostgreSQL 9.5。
我有一个基于 Npgsql 的成员资格查询,如下所示:
using (var conn = new NpgsqlConnection(ConnectionString))
{
conn.Open();
using (var comm = new NpgsqlCommand("get_user_by_username", conn))
{
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.Add("_user_name", NpgsqlDbType.Varchar, 250).Value = username;
comm.Parameters.Add("_application_name", NpgsqlDbType.Varchar, 250).Value = _ApplicationName;
comm.Parameters.Add("_online", NpgsqlDbType.Boolean).Value = userIsOnline;
using (var reader = comm.ExecuteReader())
{
return GetUsersFromReader(reader).OfType<MembershipUser>().FirstOrDefault();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这个函数存在于我的 postgresql 数据库中:
CREATE OR REPLACE FUNCTION public.get_user_by_username(
_user_name character varying,
_application_name character varying,
_online boolean)
RETURNS SETOF user_record AS
$BODY$begin
if _online then
return …Run Code Online (Sandbox Code Playgroud) 我的 Postgres 数据库中有一些主表(如公司)和许多从属表(如 CompanyAddresses、CompanyPaymentInfos 等):
CREATE TABLE Companies (
Id uuid NOT NULL PRIMARY KEY,
...);
CREATE TABLE CompanyAddresses(
CompanyId uuid NOT NULL PRIMARY KEY REFERENCES Companies(Id),
...);
CREATE TABLE CompanyPaymentInfos(
CompanyId uuid NOT NULL PRIMARY KEY REFERENCES Companies(Id),
...);
Run Code Online (Sandbox Code Playgroud)
我在 C# 代码中使用标准库中的事务:
private TransactionScope GeTransactionScope()
{
return new TransactionScope(
TransactionScopeOption.RequiresNew,
new TransactionOptions
{
IsolationLevel = IsolationLevel.ReadCommitted
},
TransactionScopeAsyncFlowOption.Enabled);
}
private async Task DoChange(...)
{
using (var scope = GeTransactionScope())
{
await Insert(Company);
await Task.WhenAll(
Insert(CompanyPaymentInfo),
Insert(CompanyAddress),
Insert(CompanyTags),
// so …Run Code Online (Sandbox Code Playgroud) 使用 EF-Core for PostgresSQL,我有一个具有 type 字段的实体byte,但决定将其更改为 type byte[]。但是当我进行迁移时,在应用生成的迁移文件时,它引发了以下异常:
Npgsql.PostgresException (0x80004005): 42804: 列“Logo”无法自动转换为类型 bytea
我在互联网上搜索了解决方案,但我看到的只是其他数据类型的类似问题,而不是字节数组。请帮忙。
我实际上在使用DigitalOcean 的 Postgres 集群。设法使用我拥有的凭据通过 DataGrip 连接到服务器,但我在 .NET Core 上遇到了身份验证问题。显然,您需要使用给定的凭据 + 提供的 ca 证书(DigitalOcean 提供 CA)进行身份验证。
services.AddDbContext<NozomiDbContext>(options =>
{
options.UseNpgsql(mainDb
, builder =>
{
builder.EnableRetryOnFailure();
builder.ProvideClientCertificatesCallback(certificates =>
{
var cert = new X509Certificate2("ca-certificate.crt");
certificates.Add(cert);
});
}
);
options.EnableSensitiveDataLogging(false);
options.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
}, ServiceLifetime.Transient);
Run Code Online (Sandbox Code Playgroud)
之后,运行项目的结果是:
System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?如果这还不够,真的很抱歉。
顺便说一下,我在 PG 11.4 上。
npgsql ×10
postgresql ×7
c# ×4
.net-core ×1
asp.net-core ×1
dapper ×1
database ×1
ef-core-2.1 ×1
mono ×1
sql ×1
winforms ×1