C# 与通过C对Access数据库的查询类似,始终返回0的计数(*)

C# 与通过C对Access数据库的查询类似,始终返回0的计数(*),c#,ms-access,ms-access-2013,oledbdatareader,C#,Ms Access,Ms Access 2013,Oledbdatareader,请查看以下代码: using (OleDbConnection openCon = new OleDbConnection(ConfigurationManager.AppSettings["AccessConnectioString"])) { openCon.Open(); string tc = string.Empty; string ttc = string.Empty;

请查看以下代码:

using (OleDbConnection openCon = new OleDbConnection(ConfigurationManager.AppSettings["AccessConnectioString"]))
{
                openCon.Open();
                string tc = string.Empty;
                string ttc = string.Empty;
                if (!string.IsNullOrEmpty(QSetId))
                {
                    tc = "select count(*) as [Count] from ABC where QSetId = @qSetId and TText like 'RT*'";
                }
                else
                {
                    tc = "select count(*) as [Count] from PQR where TText like 'RT*'";
                }
                using (OleDbCommand qtc= new OleDbCommand(tc))
                {
                    qtc.Connection = openCon;
                    if (!string.IsNullOrEmpty(QSetId))
                        qtc.Parameters.Add("@qSetId", OleDbType.VarChar).Value = QSetId;
                    OleDbDataReader dr1 = qtc.ExecuteReader();
                    while (dr1.Read())
                    {
                        ttCnt = (int)dr1["Count"];
                    }
                }

                openCon.Close();
}
我总是将计数设为0,而不是某个整数值。在调试过程中,我在MS ACCESS 2013中执行了查询,它给出了正确的结果。我不明白问题出在哪里。

试试
ExecuteScalar()
方法

替换此项:

 OleDbDataReader dr1 = qtc.ExecuteReader();
 while (dr1.Read())
 {
    ttCnt = (int)dr1["Count"];
 }
为此:

 ttCnt = Convert.ToInt32(qtc.ExecuteScalar());
尝试
ExecuteScalar()
方法

替换此项:

 OleDbDataReader dr1 = qtc.ExecuteReader();
 while (dr1.Read())
 {
    ttCnt = (int)dr1["Count"];
 }
为此:

 ttCnt = Convert.ToInt32(qtc.ExecuteScalar());

在Access本身中运行的查询与从外部应用程序运行的查询之间存在类似通配符的差异,这会让您大吃一惊

从Access本身运行查询时,需要使用星号作为通配符:
如“RT*”


当从外部应用程序(如您的C#app)运行查询时,您需要使用百分号作为通配符:
如“RT%”

在Access中运行的查询与从外部应用程序运行的查询之间的类似通配符的差异会让您感到困惑

从Access本身运行查询时,需要使用星号作为通配符:
如“RT*”


当从外部应用程序(如C#应用程序)运行查询时,您需要使用百分号作为通配符:
如“RT%”

您可能希望从阅读手册开始。OLE DB.NET Framework数据提供程序使用带问号(?)的位置参数,而不是命名参数。如果您从未使用过,那么设置
getTotalTweetCount
有什么意义
OleDbDataReader
实现
IDisposable
,但您从不调用
Dispose
。Etc.@ta.speot.感谢您的回复,'AccessConnectioString'不是拼写错误,'getTotalTweetCount'不存在,它的'tc'(我已经编辑过了),@工作正常,它也被替换为正确的值。我不认为@造成了问题,因为我在程序的其他部分使用了相同的东西,并且它正在工作。你可能想从阅读手册开始。OLE DB.NET Framework数据提供程序使用带问号(?)的位置参数,而不是命名参数。如果您从未使用过,那么设置
getTotalTweetCount
有什么意义
OleDbDataReader
实现
IDisposable
,但您从不调用
Dispose
。Etc.@ta.speot.感谢您的回复,'AccessConnectioString'不是拼写错误,'getTotalTweetCount'不存在,它的'tc'(我已经编辑过了),@工作正常,它也被替换为正确的值。我不认为@造成了问题,因为我在程序的其他部分使用了相同的东西,并且它正在工作。已经尝试过,但它不工作,即使在QuickWatch dr1[“Count”];将值指定为0。@user3030342:您确定查询返回的是非零的整数吗?当然,即使我在运行时使用断点检查了它,在变量中复制了最终查询并在ms access sql视图中执行了它,它也没有给我n行。已经尝试过了,但不起作用,即使在QuickWatch dr1[“Count”];值为0。@user3030342:您确定查询返回的是非零的整数吗?当然,即使我在运行时使用断点检查了它,在变量中复制了最后一个查询并在ms access sql视图中执行它,它也不会给我n行。