.net 从C#设置/运行PostgreSQL

toe95027  于 2023-01-03  发布在  .NET
关注(0)|答案(6)|浏览(118)

我的要求如下:
1.应用程序启动后,PostgreSQL服务将由应用程序启动
1.应用程序关闭后,PostgreSQL服务将被应用程序关闭
1....所以我将负责PostgreSQL的设置和运行脚本和启动服务等
目前我是这样做的:
1.当我在一个新进程中启动PostgreSQL时,我重定向了RedirectStandardErrorRedirectStandardOutput,这是一个静默启动,用户看不到命令窗口等

问题是

  • 当我编写这个代码时,我查找消息字符串,但只支持英语。换句话说,我过去在RedirectStandardOutput中查找字符串success,但现在我们支持多种语言,所以比较失败。

有什么方法可以知道PostgreSQL设置是否成功启动,PostgreSQL服务是否正在运行?
我通过在单独的进程中调用pg_ctl. exe来启动PostgreSQL。

vjhs03f7

vjhs03f71#

(we正在执行类似的操作)您使用此批处理文件星星Postgres服务

"C:\Program Files\PostgreSQL\9.0\bin\pg_ctl.exe"  -D "C:\Program Files\PostgreSQL\9.0\data" start

和[停止]服务

"C:\Program Files\PostgreSQL\9.0\bin\pg_ctl.exe"  -D "C:\Program Files\PostgreSQL\9.0\data" stop

其中C:\Program Files\PostgreSQL\9.0\bin\pg_ctl.exePostgreSQl的安装位置,您可以从

HKEY_LOCAL_MACHINE\SOFTWARE\PostgreSQL\Installations\postgresql-9.0

现在运行批处理文件来检查服务是否确实在运行,您可以使用Process running中的此代码检查postgres.exe是否正在运行。
也可以是1. checking-if-windows-application-is-running 2. how-can-i-know-if-a-process-is-running

public bool IsProcessOpen(string name)
    {
 //here we're going to get a list of all running processes on
 //the computer
 foreach (Process clsProcess in Process.GetProcesses()) {
    //now we're going to see if any of the running processes
    //match the currently running processes. Be sure to not
    //add the .exe to the name you provide, i.e: NOTEPAD,
    //not NOTEPAD.EXE or false is always returned even if
    //notepad is running.
    //Remember, if you have the process running more than once, 
    //say IE open 4 times the loop thr way it is now will close all 4,
    //if you want it to just close the first one it finds
    //then add a return; after the Kill
    if (clsProcess.ProcessName.Contains(name))
    {
        //if the process is found to be running then we
        //return a true
        return true;
    }
}
//otherwise we return a false
return false;
}
cx6n0qe3

cx6n0qe32#

启动一个数据库连接,如果它工作,PostgreSQL正在运行。如果没有,出错了。

ldfqzlk8

ldfqzlk83#

您正在尝试将PostgreSQL用作嵌入式数据库,以便与用户完全不可见的应用程序绑定。
这样做效果并不好。PostgreSQL的设计不是这样的,它显示了:

  • postmaster希望作为pg_ctl派生的服务或守护进程运行,而不是作为其他进程的子进程运行,它被设计成在父进程终止后仍然存在,这不是嵌入时所希望的。
  • 当然,没有办法将PostgreSQL嵌入到可执行文件中或将其作为库加载。
  • 邮局主管没有带外管理接口;所有的管理都是通过SQL级别的连接或者通过配置文件和日志来完成的。如果有一个简单的管理API,使用简单的进程间通信(比如说Pg的共享内存)来查询邮局管理员状态,而不需要工作的TCP连接和数据库引擎,这可能会很好。目前,没有类似的东西存在,对于PostgreSQL的预期用例来说,没有强有力的理由创建它,因为如果PostgreSQL没有启动安装它的管理员应该修复它。
  • 在Windows上,PostgreSQL只支持TCP/IP上的通信,因此它需要一个主机范围内唯一的端口。如果你同时运行多个程序示例,并希望它们是独立的,那么这就不太好用了。

做你想做的事情是可能的,只是烦人和困难,因为PostgreSQL不是为嵌入式数据库而设计的。
我真的很想看到一个低级别的PostgreSQL诊断/状态客户端,它可以使用共享内存消息传递来向邮局局长请求一个简单的状态报告。这将是诊断安装问题的好方法,特别是在所有坏掉的Windows机器上。
也许你可以考虑在与pgsql黑客团队讨论后,将你需要的功能原型化,并向commitfest提交一个补丁?PostgreSQL是开源的,所以如果你愿意实现它们,并且你能够说服其他人应该包含它们,你就有可能得到你需要添加的功能。

vxf3dgd4

vxf3dgd44#

使用ServiceController类启动/停止服务。

30byixjq

30byixjq5#

Link这会对你有帮助。在此之前检查你的数据库连接。或者启动/停止IIS服务器(如果正在运行)

byqmnocz

byqmnocz6#

我建议评估这个库:https://github.com/mysticmind/mysticmind-postgresembed
它主要用于测试场景,但也可以满足其他需要。

var instance = Guid.Parse("de6b862e-7ba2-4648-904b-a5b3db1c6d8e");
using var server = new PgServer("10.7.1", dbDir: @"x:\", instanceId: instance, port: 5500);
await server.StartAsync();

var connectionString = $"Server=localhost;Port={server.PgPort};User Id=postgres;Password=ignored;Database=postgres";
await using var connection = new NpgsqlConnection(connectionString);
await using var batch = new NpgsqlBatch(connection)
{
    BatchCommands =
    {
        new("drop table if exists SomeTable"),
        new("create table SomeTable(Id int primary key, Name varchar(50))"),
        new("insert into SomeTable values (1, 'Ronnie')"),
        new("insert into SomeTable values (2, 'Not Ronnie')"),
        new("select * from SomeTable")
    }
};

connection.Open();
await using var reader = await batch.ExecuteReaderAsync();
using var table = new DataTable();
table.Load(reader);

相关问题