在查询中使用筛选器时,SQL Anywhere 12 ODBC返回零行

时间:2018-03-21 13:18:35

标签: c# sql .net odbc sybase

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

这是我的代码

的一个例子
 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);
        }

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

Using the same query in Sybase Central

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

用于我的应用程序的

引用是System.Data.Odbc

2 个答案:

答案 0 :(得分:0)

你永远不会关闭连接。 var sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);或类似的东西(我很长时间没有使用过ODBC,因此CommandBehavior.CloseConnection可能不是正确的答案,但你可以google它)。然后会while被点击。

答案 1 :(得分:0)

我终于让它工作但没有使用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();
    }