2

ファイルへのパスを含むレコードを作成しようとしています。挿入は、ドライバーPostgresを使用して、UTF8が有効になっているデータベースに行われます。NpqSQL

私のテーブル定義:

CREATE TABLE images
(
    id serial,
    file_location character varying NOT NULL
)

それを実行するコードを含む私のSQLステートメント(最小限に要約):

string sqlStatement = "INSERT INTO images (file_location) VALUES ('\\2010')";

NpgsqlConnection dbConnection = new NpgsqlConnection(connectionString);
dbConnection.Open();
NpgsqlCommand dbCommand = new NpgsqlCommand(sqlStatement , dbConnection);
int result = dbCommand.ExecuteNonQuery();
dbConnection.Close();    

pgAdminを使用して上記のステートメントを挿入すると、正常に機能します。Visual Studio C#を介してNpgSQLドライバーを使用すると、次の例外で失敗します。

"ERROR: 22021: invalid byte sequence for encoding \"UTF8\": 0x81"

Milenが正確に説明しているように、Postgresはステートメントを数値として解釈します(octal\ o201 == 0x81)。

マイレンも説明しているように、E道の前は役に立ちません。

簡単に要約すると、NpqSQLが挿入を停止するのはなぜ\\2010ですか?

4

2 に答える 2

3

(私のコメントは答えのように見えるので、それに応じて変換しました。)

あなたは実際のコードを示していないので、インタプリタ/コンパイラは二重の円記号をエスケープされた円記号として解釈し、Postgresは1つの円記号とそれに続くいくつかの数字だけを見ると思います。これは、8進数のバイト値(8進数の201 = 16進数の81)として解釈されます。

「エスケープ」文字列定数(「E」で始まる文字列)について-あなたの場合、それらは完全に不要です。標準のSQLでは、円記号には特別な意味はありません。

マニュアル( http://www.postgresql.org/docs/current/static/sql-syntax-lexical)の「4.1.2.1。文字列定数」および「4.1.2.2。Cスタイルのエスケープを使用した文字列定数」をお読みください。詳細については、 html#SQL-SYNTAX-CONSTANTS)を参照してください。

于 2010-03-23T16:50:27.000 に答える
1

マイレンは私を答えに導いてくれたことは称賛に値します-ありがとう!

どうやらNpgSQLは私のSQLステートメントをPostgresに挿入する前に1回のエスケープ反復を実行します。したがって、問題を解決するために、バックスラッシュのすべての出現箇所を代わりに2つのバックスラッシュに置き換えました。

string path = ... my path ...
path = path.Replace("\\", "\\\\");
sqlStatement = "INSERT INTO images (file_location) VALUES ('" + path + "')";
于 2010-03-25T14:36:07.690 に答える