2015-06-11 33 views
0

我試圖以編程方式在我們的安裝過程中創建postgresql(9.2)「pg_hba.conf」文件。爲什麼postgresql在單引號失敗

我曾嘗試使用創建文件如下:
(是的,在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 

任何建議,如何在用戶名可以在配置文件中進行格式化,使單引號將不勝感激。

回答

5

達到或接近「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("'", "''"); 
+0

該代碼是從爲UPN輪詢DNS服務器的區域拉出來的,然後使用UPN格式化字符串...我忘記從示例代碼中刪除string.format。 :-) – user3174075

0

最有可能是逃逸字符的問題。我建議使用@「」以避免任何逃逸不一致。

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"), 
     }; 
+1

在這裏使用@會直接將字符串傳遞給PostGres,但格式問題仍然存在。問題在於單引號不會在PostGres中轉義,而不會在C#中被轉義。線索出現在錯誤中。 PostGres提到了一個未終止的字符串。當它讀取用戶名時,它會看到單引號並假定它是字符串的結尾。因此,單引號之後的所有內容都不會被視爲字符串,因此PostGres會嘗試將其解析爲命令。 – Alex