1

我正在使用带有 C# 的 Npgsql 与我的 PostgreSQL 数据库进行通信。我的数据库中使用的所有名称都是大小写混合的,因此在查询中我确保在每个名称周围使用双引号。这是我发送查询的方式:

// 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 回答