c# - 为什么postgresql在单引号上失败

标签 c# postgresql programmatically-created quoting

我试图在安装过程中以编程方式创建 postgresql (9.2)“pg_hba.conf”文件。

我尝试使用以下方法创建文件:
(是的,Windows 8.1 用户名有一个空格和一个撇号)

private static string[] CreatePgHbaContents()
{
    string[] configLines =
        {
            "# TYPE  DATABASE      USER      ADDRESS                   METHOD",
            string.Format("host    all           \"Mi k'e\"        127.0.0.1/32        sspi"),
            string.Format("host    all           \"Mi K'e\"        ::1/128             sspi"),
            "",
            string.Format("host    all           \"SYSTEM\"        127.0.0.1/32        sspi"),
            string.Format("host    all           \"SYSTEM\"        ::1/128             sspi"),
        };

    return configLines;
}

但是,当我尝试创建数据库时出现错误:

[PostgreConfig:878ab49a][2015-06-11T13:00:08.500-07:00][Error][5b4:1]:Npgsql.NpgsqlException:
unterminated quoted string at or near "e')::name);"
Severity: ERROR
Code: 42601

对于如何在配置文件中格式化用户名以允许使用单引号的任何建议,我们将不胜感激。

最佳答案

“e”处或附近未终止的引号字符串是由于 PostGres 看到单引号并终止语句。

在 VARCHAR 字段中输入文本时,我通常将单引号替换为反引号(` 而不是 '),这根本不会出现这种情况,但如果引号出现在用户名中,它就是一个重要字符,所以交换它会破坏身份验证。

解决方案是用另一个单引号转义单引号。

private static string[] CreatePgHbaContents()
{
    string[] configLines =
        {
            "# TYPE  DATABASE      USER      ADDRESS                   METHOD",
            "host    all           \"Mi k''e\"        127.0.0.1/32        sspi",
            "host    all           \"Mi K''e\"        ::1/128             sspi",
            "host    all           \"SYSTEM\"        127.0.0.1/32        sspi",
            "host    all           \"SYSTEM\"        ::1/128             sspi",
        };

    return configLines;
}

我有点不明白为什么你有一个 String.Format 在那里。 您实际上并未格式化字符串,因此没有必要。

如果您确实想使用 String.format...

String cleanString = cleanString.Replace("'", "''");

关于c# - 为什么postgresql在单引号上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30790617/

相关文章:

java - 显示来自 PostgreSQL 数据库 bytea 的图像

ios - 如何为数组中的每个创建一个具有唯一图像和选择器的自定义 UIButton?

ios - 以编程方式为循环加载动画的 UILabel 添加约束

c# - 如何让我的程序读取屏幕边缘以便窗口捕捉

c# - 如何在多个实体数据模型之间共享连接字符串

sql - 随机页面成本和计划

sql - 按 float 日期范围分组

c# 检查 Windows 帐户是否在特定域中被锁定

c# - Visual Studio 扩展获取所有类和接口(interface)元数据

powershell - dotnet efscaffold 无法识别的选项 '-t firstTable -t secondTable' - 传递存储在字符串中的参数