SQL Anywhere 12 ODBC returns 在查询中使用过滤器时零行

SQL Anywhere 12 ODBC returns zero rows when using filters in query

我正在构建一个连接到我的 SQL Anywhere 12 数据库以使用 ODBC 驱动程序获取数据的 .NET c# 应用程序,但我有一个奇怪的问题,每当我在查询中使用过滤器时,我都会得到reader 中没有任何内容,但如果我在 Sybase Center 中执行相同的查询,我会得到预期的结果..

这是我的代码示例

 connection = new OdbcConnection(conStrMonitor);
 connection.Open();

var cmd = new OdbcCommand("Select art_artnr, art_ben from monitor.ARTIKEL WHERE art_artnr='VSV203798'", connection);


        var sdr = cmd.ExecuteReader();

        while (sdr.Read())
        {
            SearchArticleNr article = new SearchArticleNr();
            article.Article = sdr["art_artnr"].ToString();
            article.Ben = sdr["art_ben"].ToString();
            SarticleList.Add(article);
        }

reader 循环不会触发,当我查看 sdr.hasrows 时它被设置为 false

Using the same query in Sybase Central

我尝试了其他过滤器,例如 LIKE,然后出现了同样的问题,我不知道为什么会这样。

用于我的应用程序的引用是 System.Data.Odbc

您永远不会关闭连接。 var sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 或类似的东西(我很长时间没有使用 ODBC,所以 CommandBehavior.CloseConnection 可能不是正确答案,但你可以 google 它)。那么while就会被命中

我终于让它工作了,但没有使用 system.data.odbc。我发现了可以安装到项目中的 iAnywhere .net 参考。我在 C:\Program Files\SQL Anywhere 12\Assembly\v4.5 下找到了我的,然后我添加了对我的项目的引用浏览到这个文件夹并导入 iAnywhere.Data.SQLAnywhere.v4.5.dll 。 . 使用这个参考,我现在甚至在我的查询中使用过滤器也能得到结果。

现在是代码:

    public List<SearchArticleNr> SearchArticle(string articlenr)
    {
        List<SearchArticleNr> SarticleList = new List<SearchArticleNr>();
        iAnywhere.Data.SQLAnywhere.SAConnection myConnection = null;
        iAnywhere.Data.SQLAnywhere.SACommand myCommand = null;
        iAnywhere.Data.SQLAnywhere.SADataReader myDataReader = null;
        try
        {
            myConnection = new iAnywhere.Data.SQLAnywhere.SAConnection(conStrMonitor);
            myConnection.Open();
            myCommand = myConnection.CreateCommand();
            myCommand.CommandText = "Select art_artnr, art_ben from monitor.ARTIKEL where art_artnr = ?";
            myCommand.Parameters.Add("@art", articlenr);
            myDataReader = myCommand.ExecuteReader();

            int i = 0;
            while (myDataReader.Read())
            {
                i++;
                SearchArticleNr article = new SearchArticleNr();
                article.Article = myDataReader["art_artnr"].ToString();
                article.Ben = myDataReader["art_ben"].ToString();
                SarticleList.Add(article);
            }
            if (i == 0)
            {
                SearchArticleNr article = new SearchArticleNr();
                article.Article = "NO OBJECTS FOUND";
                article.Ben = "NO OBJECTS FOUND";
                SarticleList.Add(article);
            }
        }
        catch (Exception exp)
        {
            myConnection = null;
            throw exp;
        }
        finally
        {
            myConnection.Close();
            myDataReader.Close();
            myCommand = null;
        }
        return SarticleList.ToList();
    }