Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从C安装/运行PostgreSQL#_C#_.net_Postgresql_Localization_Process - Fatal编程技术网

C# 从C安装/运行PostgreSQL#

C# 从C安装/运行PostgreSQL#,c#,.net,postgresql,localization,process,C#,.net,Postgresql,Localization,Process,我的要求如下: 一旦应用程序启动,应用程序将启动PostgreSQL服务 一旦应用程序关闭,PostgreSQL服务将被应用程序关闭 。。。因此,我将负责PostgreSQL的设置、运行脚本和启动服务等 我目前的做法是: 当我在新进程中启动PostgreSQL时,我正在重定向RedirectStandardError和RedirectStandardOutput,这是一个静默启动,用户无法看到命令窗口等 问题是,, 当我编写此代码时,我查找消息字符串,并且只支持英语。换句话说,我以前在Redi

我的要求如下:

  • 一旦应用程序启动,应用程序将启动PostgreSQL服务
  • 一旦应用程序关闭,PostgreSQL服务将被应用程序关闭
  • 。。。因此,我将负责PostgreSQL的设置、运行脚本和启动服务等
  • 我目前的做法是:

  • 当我在新进程中启动PostgreSQL时,我正在重定向
    RedirectStandardError
    RedirectStandardOutput
    ,这是一个静默启动,用户无法看到命令窗口等
  • 问题是,,
    • 当我编写此代码时,我查找消息字符串,并且只支持英语。换句话说,我以前在
      RedirectStandardOutput
      中查找字符串
      success
      ,但现在我们支持多种语言,因此比较失败
    是否有任何方法可以确定PostgreSQL设置是否已成功启动,PostgreSQL服务是否正在运行


    我通过在单独的进程中调用pg_ctl.exe来启动PostgreSQL。

    启动数据库连接,如果它工作,PostgreSQL正在运行。如果没有,则出现问题。

    使用类启动/停止服务。

    (我们正在做类似的事情) 您可以使用此批处理文件启动
    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.exe
    是安装
    PostgreSQL
    的位置,您可以从

        HKEY_LOCAL_MACHINE\SOFTWARE\PostgreSQL\Installations\postgresql-9.0
    
    现在运行批处理文件检查服务是否确实在运行,您可以使用 此代码来自 检查postgres.exe是否正在运行

    也是1。 2.


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

    您正在尝试使用PostgreSQL作为嵌入式数据库,以便在用户完全看不见的情况下与应用程序绑定

    这只是不太管用。PostgreSQL的设计目的不是这样,它表明:

    • 邮局主管希望作为pg_ctl生成的服务或守护进程运行,而不是其他进程的子进程。它的设计目的是在父进程终止后继续生存,这不是嵌入时需要的

    • 当然,没有办法在可执行文件中嵌入PostgreSQL或将其作为库加载

    • 邮政局长没有带外管理界面;所有管理都是通过SQL级别的连接或配置文件和日志完成的。也许这是一个缺陷;如果有一个简单的管理API,它可以使用简单的进程间通信(比如Pg的共享内存)来查询邮局主管的状态,而不需要TCP连接和数据库引擎。现在,没有类似的东西存在,对于PostgreSQL的预期用例,没有强有力的理由创建它,因为如果PostgreSQL不启动安装它的管理员,应该修复它

    • 在Windows上,PostgreSQL只支持通过TCP/IP进行通信,为此,它需要一个在主机范围内唯一的端口。如果您的程序可能同时运行多个实例,并且希望它们是独立的,那么这种方法就不能很好地工作

    做你想做的是可能的,只是烦人和困难,因为PostgreSQL不是为用作嵌入式数据库而设计的

    我真的很想看到PostgreSQL的低级诊断/状态客户端,它可以使用共享内存消息传递给邮政局长,要求邮政局长提供一个简单的状态报告。这对于诊断安装问题非常有用,尤其是在所有坏掉的Windows机器上


    也许你会考虑用PGSQL黑客团队讨论他们需要的特性,然后提交一个补丁到提交文件中。PostgreSQL是开源的,因此,如果您愿意实现这些功能,并且能够说服其他人将其包括在内,您就有可能获得您需要添加的功能。

    您将怎么做:1)如果用户(或多个用户)将启动您的应用程序的多个实例?2) 如果用户没有足够的访问权限来启动/停止服务?另外,当您提到stderr和stdout重定向时,您所说的启动服务的方式是什么?所有关于1)用户是否将启动应用程序的多个实例的详细信息?2) 如果用户没有足够的访问权限来启动/停止服务?他们都很小心。我通过在单独的进程中调用pg_ctl.exe来启动postgre您是使用PostgreSQL的安装程序来安装,还是只是将可执行文件的zip文件与程序捆绑在一起?考虑到你想要完全控制的方式,我会选择后者——我会捆绑PostgreSQL可执行文件,并完全避免创建
    postgres
    用户、服务帐户等。你可以通过检查
    pg_ctl.exe
    的返回码来查看PostgreSQL postmaster是否成功启动。如果存在允许邮局主管启动但无法正常运行的故障(可能是端口冲突、数据目录权限等),pg_ctl将不知道,您需要检查PostgreSQL日志。我正在使用zip,我没有在客户端安装postgre sql:),我还想知道原因。。其他方面,我无法为最终用户做任何事情或提供任何解决方案。。!!如果pg_ctl成功,但无法连接到数据库,请检查PostgreSQL和/或安装程序(C:\Temp)@raghundangangHagarvale中的日志文件,检查服务器日志。日志将根据用户的不同而变化本地化设置不能取决于字符串语句您所说的是正确的,但现在我只能解决所述问题,可能在将来的版本中,他们可以恢复。是的,此过程检查听起来很好,可以检查服务器是否已启动解决我的问题
      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;
    }