SQL Anywhere 12 ODBC带过滤查询返回零行,.NET C#程序异常求助
解决.NET C# ODBC连接SQL Anywhere 12查询返回空的问题
我之前也碰到过类似的SQL Anywhere ODBC查询坑,你遇到的这种「代码里查不到但工具里能查到」的情况,大概率是驱动处理逻辑或者查询写法的问题,咱们一个个排查:
优先用参数化查询替代硬编码值
直接把字符串值嵌到SQL语句里,ODBC驱动可能会对引号或者字符串编码做特殊处理,导致匹配不到数据。换成参数化写法试试,这不仅能解决当前问题,还能避免SQL注入:using (var connection = new OdbcConnection(conStrMonitor)) { connection.Open(); var cmd = new OdbcCommand("Select art_artnr, art_ben from monitor.ARTIKEL WHERE art_artnr = ?", connection); // 添加参数,指定类型和值 cmd.Parameters.Add("@artnr", OdbcType.VarChar).Value = "VSV203798"; using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { // 读取数据逻辑 Console.WriteLine($"{reader["art_artnr"]} - {reader["art_ben"]}"); } } }检查大小写敏感性
SQL Anywhere的排序规则可能区分大小写,而Sybase Center默认可能做了不区分大小写的匹配。你可以试试把查询改成大小写无关的形式验证:Select art_artnr, art_ben from monitor.ARTIKEL WHERE UPPER(art_artnr) = UPPER('VSV203798')如果这样能查到数据,说明是大小写匹配的问题,要么调整查询写法,要么检查数据库的排序规则设置。
确认数据库上下文和权限一致
虽然你指定了monitor.ARTIKEL,但要确保代码里的连接字符串对应的数据库、用户权限和你在Sybase Center里用的完全一致。比如可以先在代码里执行不带过滤的SELECT TOP 10 * FROM monitor.ARTIKEL,看看能不能读到数据,确认连接的是正确的数据库实例。验证ODBC驱动版本
老版本的SQL Anywhere ODBC驱动可能存在查询解析的bug,建议你检查当前使用的驱动版本是否和SQL Anywhere 12兼容,最好下载官方对应版本的驱动重新安装测试。
内容的提问来源于stack exchange,提问作者Mattias
相关产品推荐
相关产品推荐

