我正在使用带有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以这种方式处理我的查询,我该如何解决这个问题呢?我的查询是否以错误的方式构建?
答案 0 :(得分:5)
使用单引号引用字符串。双引号用于表示列名。
答案 1 :(得分: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的参数,它会为你处理这个,包括所有那些讨厌的边缘情况,我们的单元测试充满了:)