1

PostgreSQLデータベースと通信するためにC#でNpgsqlを使用しています。データベースで使用されている名前はすべて大文字と小文字が混在しているため、クエリでは各名前を二重引用符で囲んでいます。クエリの送信方法は次のとおりです。

// construct an insert query
string insertQuery = "insert into \"Update\" (\"Vehicle\",\"Property\",\"Value\") " + 
                     "values (" + vehicleNum.ToString() + ",\"" + propertyName + 
                     "\",\"" + propertyValue + "\")";

// execute the query
NpgsqlCommand insertCommand = new NpgsqlCommand(insertQuery, conn);
insertCommand.ExecuteScalar();

insertQueryブレークポイントを挿入してチェックすることにより、文字列が送信される前に次のように見えることを確認しました。

insert into "Update" ("Vehicle","Property","Value") values (12345,"EngineSpeed","50")

このクエリを送信すると、PostgreSQLからエラーが発生します。このエラーは、次のようなNpgsql例外にラップされています。ERROR: 42703: column "EngineSpeed" does not exist

EngineSpeed私のクエリから、それは列ではなく、列の値であることが明らかであるはずですProperty。したがって、当然、その名前の列は存在しない可能性があります。では、なぜPostgreSQLがクエリをこのように処理するのでしょうか。また、この問題をどのように解決できますか?クエリが間違った方法で作成されていませんか?

4

2 に答える 2

6

文字列を引用するには一重引用符を使用します。二重引用符は、列名を示すために使用されます。

于 2011-12-12T23:06:36.310 に答える
2

いいえ、あなたが示したクエリから、EngineSpeedはそのようにエスケープされているため、列であることが明らかです。

また、渡された値がエスケープされていることを確認するように注意していませんでした。これは重大なセキュリティ問題になる可能性があります。

あなたが欲しいinsert into "Update" ("Vehicle","Property","Value") values (12345,'EngineSpeed','50')

安全に提供できるもの:

string insertQuery = "insert into \"Update\" (\"Vehicle\",\"Property\",\"Value\") " + 
                     "values (" + vehicleNum.ToString() + ",'" + propertyName.Replace("'", "''") + 
                     "','" + propertyValue.Replace("'", "''") + "')";

NPGSQLでパラメータを使用する方が良いですが、これは、これらの厄介なエッジケースのすべてを含め、これを処理します。ユニットテストはいっぱいです:)

于 2011-12-12T23:09:43.213 に答える