我正在针对我无法控制的Postgres DB编写C#UI(并使用Npgsql 4.0.6来实现); DB是使用驼峰对象名称创建的,因此有必要使用双引号将其转义。在其他编程语言中,甚至甚至在VS GUI中定义DataSet对象时,这都是小菜一碟。
但是,当我手动将CommandText分配给NpgsqlCommand并基于该命令执行类似NpgsqlDataAdapter的操作时,列名周围的任何双引号都会被忽略,并且列会自动切换为小写(在这种情况下,查询失败)。为了增加侮辱性伤害,结果异常中的提示会询问我是否要使用正确大写的列名,我当然这样做了。我已经确认我正在运行的命令的实际CommandText属性在所有列周围都包含正确转义的双引号-但是驱动程序似乎在实际将其传递给数据库之前重写或进一步转换了该值。
NpgSQL github页面建议将此类问题发布到Slack Overflow以获得最快的响应,因此我希望人们之前遇到过这种问题,并且所采用的解决方法不涉及重命名其中的所有对象。数据库。
我尝试以不同的方式转义双引号,包括完整的表名,使用表别名等。在所有情况下,每当我将SelectCommand传递给NpgsqlDataAdapter时,在解析时,CommandText中的任何双引号都将被忽略。由驾驶员。如果我在Designer中设置了DataAdapter对象,则不会发生这种情况,但是显然,这种方法并不总是必要的。
string strCommand = @"SELECT * FROM fs.""AppUsers"" WHERE ""UserID"" = @UserID;";
string strTable = "SelectedUserInfo";
using (NpgsqlConnection conn = new NpgsqlConnection(Properties.Settings.Default.PostgresConnectionString))
{
using (NpgsqlCommand cmd = new NpgsqlCommand(strCommand, conn))
{
cmd.CommandTimeout = 3000;
cmd.Parameters.Add("@UserID", NpgsqlTypes.NpgsqlDbType.Integer);
cmd.Parameters["@UserID"].Value = _UserID;
using (NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd))
{
da.Fill(ds, strTable);
DataTable dt = ds.Tables[0];
}
}
}
结果:
cmd.CommandText = "SELECT * FROM fs.\"AppUsers\" WHERE \"AppUsers\".\"UserID\" = @UserID;"
ex.Message: 42703: "column \"userid\" does not exist"
ex.Hint: "Perhaps you meant to reference the column \"AppUsers.UserID\"."