我无法在程序启动时可靠地检查 NET/Npgsql 中数据库是否存在。
这是代码:
Public Function dbExists(ByVal _dbName As String) As Boolean
Dim retval As Boolean = False
Using mCon As New NpgsqlConnection(String.Format( _
"Server={0};Port={1};User Id={2};Password={3};", _
dbserver, dbport, "postgres", dbpass))
Try
mCon.Open()
Using nCom = New NpgsqlCommand("SELECT 1 FROM pg_database WHERE datname='" + _dbName + "'", mCon)
retval = CBool(nCom.ExecuteScalar())
End Using
Catch ex As Exception
retval = False
End Try
End Using
Return retval
End Function
Run Code Online (Sandbox Code Playgroud)
无论数据库存在与否,该函数都返回True。我还尝试对 ExecuteScalar 进行 null 检查,获取 Count(*) 以及所有我能做的,但没有更好的结果。
该怎么做才能让它发挥作用?
是否可以将参数与 NpgsqlDataAdapter 一起使用,就像我可以使用 NpgsqlCommand 一样:
string sql = "SELECT * FROM tbl_student WHERE name = @val";
NpgsqlCommand command = new NpgsqlCommand(sql, conn);
command.Parameters.AddWithValue("@val", name);
Run Code Online (Sandbox Code Playgroud)
我有这段代码,它显示有关学生的信息 ia gridview:
string sql = "SELECT * FROM tbl_student WHERE studentname = '" + name + "'";
DataSet ds = new DataSet();
DataTable dt = new DataTable();
NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
ds.Reset();
da.Fill(ds); // filling DataSet with result from NpgsqlDataAdapter
dt = ds.Tables[0]; // select select first column
GridView1.DataSource = dt; //connect grid …Run Code Online (Sandbox Code Playgroud) 我正在尝试替换字符串中的参数以在 Npgsql 查询中执行。
问题是,当它用字符串中的值替换参数时,它会添加不必要的括号,因此查询会返回错误。
NAME_SCHEMA_DB和NAME_ADMIN_DB是字符串常量,
ExecuteCommand只需接受NpgsqlCommand并执行它。
这是我的代码:
String qdropSchema = @"DROP SCHEMA IF EXISTS @name_schem CASCADE";
String qCreateSchema = @"CREATE SCHEMA @name_schem AUTHORIZATION @name_admin";
DbCommand commandeDrop = new NpgsqlCommand(qdropSchema);
commandDrop.Parameters.Add(new NpgsqlParameter("@name_schem", NAME_SCHEMA_DB));
DbCommand commandCreate = new NpgsqlCommand(qCreateSchema);
commandCreate.Parameters.Add(new NpgsqlParameter("@name_schem", NAME_SCHEMA_DB));
commandCreate.Parameters.Add(new NpgsqlParameter("@name_admin", NAME_ADMIN_DB));
ExecuteCommand(commandDrop);
ExecuteCommand(commandCreate);
Run Code Online (Sandbox Code Playgroud)
这是它在到达时尝试运行的 SQL 查询ExecuteCommand(commandDrop)
DROP SCHEMA IF EXISTS (('test_schemaName')) CASCADE;
我不确定为什么它添加额外的括号和单引号。通常,我希望它运行的查询是
如果存在则删除架构 test_schemaName CASCADE;
来自 NuGet,我正在使用
...\packages\Npgsql.2.2.5\lib\net45\Npgsql.dll
...\packages\Dapper.1.42\lib\net45\Dapper.dll
在 PostgreSQL 中调用存储过程时,我需要将过程名称的大小写保留为
var x = cnn.Query<icd9>("GetDxLibrary", commandType: CommandType.StoredProcedure);
Run Code Online (Sandbox Code Playgroud)
我收到运行时错误:
Npgsql.dll 中发生“Npgsql.NpgsqlException”类型的未处理异常
附加信息:错误:42883:函数 getdxlibrary() 不存在。
如果 PostgreSQL 中的函数重命名为getdxlibrary(),一切顺利。
如何在 Dapper 中调用大小写混合名称的过程?
TIA
我有一个在 Postgresql 上运行的项目。我使用实体框架来执行将返回一些值(长)的存储过程。
public override long GetHostSequenceNumber(byte hostId, byte srvId)
{
var hId = new Npgsql.NpgsqlParameter("@host_id", hostId);
var sId = new Npgsql.NpgsqlParameter("@srv_id", srvId);
var res = this.Database.SqlQuery<long>("select * from dbo.bs_p_get_host_seqno( @host_id,@srv_id)", hId, sId).SingleOrDefault();
return res;
}
Run Code Online (Sandbox Code Playgroud)
简而言之,假设此过程在某些表中搜索某些特定值。
它工作得很好。但是现在我切换到 Core 2.0,我找不到做同样事情的方法。我读过一些文章,他们说要使用 FromSql,但我不能使用它,因为我没有要添加到 DbContext 的任何实体。我也尝试使用 ADO 并执行 SQL 命令,但我总是在结果中得到 -1。
public override long GetHostSequenceNumber(byte hostId, byte srvId)
{
var hId = new Npgsql.NpgsqlParameter("@host_id", hostId);
var sId = new Npgsql.NpgsqlParameter("@srv_id", srvId);
var res = this.Database.ExecuteSqlCommand("select * from bs_p_get_host_seqno(@host_id,@srv_id)", hId,sId);
return res;
}
Run Code Online (Sandbox Code Playgroud)
但是 …
据我了解,您可以在 Postgresql 中使用准备好的语句或连接池(使用 pgPool/pgBouncer 等工具),但同时只能从其中之一中受益(至少使用 .NET 的 Npgsql 驱动程序,加上库作者建议关闭客户端)使用 PgBouncer 时的侧连接池)。我对吗?
如果是这样 - 对于其他运行时和语言(例如 Java、Python、Go)也是如此吗?或者这是一个特定于实施的问题?
postgresql connection-pooling prepared-statement npgsql pgbouncer
数据库:Postgresql
ORM:带有 Npgsql.EntityFrameworkCore.PostgreSQL 的实体框架核心
尝试调用以下函数将产品列表作为 json 传递
dbContext.product.FromSqlRaw("SELECT pa.usp_set_product({0})", productjson).ToList();
Run Code Online (Sandbox Code Playgroud)
返回错误为:“42883:函数 pa.usp_set_product(text) 不存在”
然后尝试下面
dbContext.product.FromSqlRaw(@"SELECT pa.usp_set_product('" + productjson+ "')").ToList();
Run Code Online (Sandbox Code Playgroud)
返回错误:“输入字符串的格式不正确”
然后尝试下面效果很好
using (var cmd = new NpgsqlCommand(@"SELECT pa.usp_set_product(@productjson)", conn))
{
cmd.Parameters.Add(new NpgsqlParameter("productjson", NpgsqlDbType.Json) { Value = productjson});
cmd.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud)
任何想法,请-
谢谢,
@保罗
我在 postgresql13 中使用 npgsql,但是在尝试连接时出现以下错误:
目前仅支持认证明文密码和认证md5密码。收到 10
我的连接行是: NpgsqlConnection conn = new NpgsqlConnection("服务器= xxxx;端口= xxxx;用户ID = xxxx;密码= xxx;数据库=数据库;")
在 postgresql 9.6 中一切正常,但它迁移到版本 13 并产生了这个问题
鉴于以下Postgresql例程:
CREATE OR REPLACE FUNCTION checkemailexists (emailaddress text) RETURNS boolean
LANGUAGE plpgsql
AS $$
#print_strict_params on
DECLARE
existsCount int;
BEGIN
SELECT count(*) INTO STRICT existsCount
FROM usercontacts WHERE usercontacts.contactaddress = emailAddress;
IF existsCount > 0 THEN RETURN TRUE;
ELSE RETURN FALSE;
END IF;
END
$$
Run Code Online (Sandbox Code Playgroud)
以下.NET(Npgsql)块:
public bool EmailExists(string email)
{
using (var conn = Connection)
{
conn.Open();
using(var tran = conn.BeginTransaction())
using (var cmd = new NpgsqlCommand("checkemailexists", conn))
{
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@emailAddress",NpgsqlTypes.NpgsqlDbType.Text ,"my@email.com");
var ret = (bool)cmd.ExecuteScalar();
return …Run Code Online (Sandbox Code Playgroud) 我想将大象数据库与实体框架(无论哪个版本)一起使用。我在网上找到了有关npgsql的教程,可以帮助我连接这两项技术。
我做了一个对象,它将表示来自DB的对象:
[Table("typychorob", Schema = "public")]
public class TypChoroby
{
public TypChoroby()
{
}
[Key, Column("id"), DatabaseGenerated(DatabaseGeneratedOption.Identity), Required]
public int ID { get; set; }
[Column("nazwa"), MaxLength(50)]
public string Nazwa { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我创建了代表dBContext的类。Uzytkownik与TypChoroby几乎相同。
public class PrzychodniaContext : DbContext
{
public DbSet<Uzytkownik> Uzytkownicy { get; set; }
public DbSet<TypChoroby> TypyChorob { get; set; }
public PrzychodniaContext() : base()
{
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试以以下方式使用这些东西:
using (var context = new PrzychodniaContext())
{
context.Database.Log = post;
var chorobska = context.TypyChorob.ToList();
}
Run Code Online (Sandbox Code Playgroud)
这总是会产生这样的错误: …