我从表中检索以下sql语句,然后使用绑定变量替换值。运行语句时出现语法错误。它似乎是由于lower()函数而发生的,但我相信我正确使用它。我已经尝试通过psql手动运行语句,它可以正常使用我提供的值。有没有人对这个有任何想法?我试过切换'for $$但这没有效果。
语句
SELECT column_name
FROM information_schema.columns
WHERE table_name=lower(':1')
and column_name=lower(':2')
具有替代值的预期基本陈述
SELECT column_name
FROM information_schema.columns
WHERE table_name=lower('MyTableName')
and column_name=lower('MyColumnName')
由postgresql运行的语句
SELECT column_name
FROM information_schema.columns
WHERE table_name=lower('((E'RWOL_TMA_ROADWORKS'))')
and column_name=lower('((E'TPHS_CWAY_RESTRICT_TYPE'))')
C#中的错误
ERROR: 42601: syntax error at or near \"MyTableName\"
PostgreSQL日志文件中的错误
2012-04-16 11:36:15 BST ERROR: syntax error at or near "RWOL_TMA_ROADWORKS" at character 80
2012-04-16 11:36:15 BST STATEMENT: SELECT column_name FROM information_schema.columns WHERE table_name=lower('((E'RWOL_TMA_ROADWORKS'))') and column_name=lower('((E'TPHS_CWAY_RESTRICT_TYPE'))')
编辑:检索和实现代码是用C#编写的。我使用数据库连接基类和npgsql提供程序工厂来建立连接,运行查询和检索数据。此方法适用于使用此绑定变量等方法的所有其他查询,除此之外我尝试使用lower()函数。
编辑:我已经尝试完全删除引号,让绑定代理处理引用值,这提供了相同的语法错误。
编辑:现在已启用日志记录并添加了postgresql正在运行的实际语句。
答案 0 :(得分:1)
也许您不应该使用:1
和:2
周围的引号。大多数支持绑定变量的API都会为您正确引用该值。
答案 1 :(得分:1)
我认为它不是lower()
函数'问题,而是绑定变量处理问题。
正如@Adrian建议的那样,尽量不要在绑定变量周围使用引号。 你还应该查阅你的数据库日志,你会看到有关正在发生的事情的更多信息。
编辑:使用:
SHOW data_directory;
SHOW log_directory;
SQL
语句,用于查找DATA目录的位置和日志位置,如果日志路径是相对的,那么它将相对于DATA目录。
去那里找到最近修改过的文件,检查内容。您应该看到带有默认PostgreSQL配置的错误消息。
在中间件/工厂级别启用调试也很有用。
答案 2 :(得分:1)
我认为vyegorov正走在正确的道路上 - 你的占位符会有一些有趣的东西。
我不认为您的第二个示例是替换后的实际查询,因为它不包含任何错误。它来自哪里,为什么不提供实际查询 - 你是否在PostgreSQL中打开了语句记录?
另外,我怀疑语法错误 - 转义双引号会发生什么?它们实际上是双引号而不是单引号吗?
您确定占位符周围需要单引号吗?通常司机会为您管理。
您确定不会在任何地方重复引用这些值吗?
获取实际的SQL并查看引用,我怀疑问题会很明显。
更新:现在有SQL
以下是发布声明中的错误:
lower('((E'RWOL_TMA_ROADWORKS'))')
这里有两个级别的引号。删除你添加的那些,我们应该得到类似的东西:
lower((E'RWOL_TMA_ROADWORKS'))
忽略有效的重复括号(E'...'是c样式转义字符串的语法 - 围绕standard_conforming_strings进行google)。