回 帖 发 新 帖 刷新版面

主题:头疼……,TOP和ORDER BY的问题

头疼……,TOP和ORDER BY的问题

我编写的是短信处理程序,
就是有用户发短信参与我们的节目,
他可能发字母、数字等,可能发到不同的号码,
我这里根据他发送的内容,以及他发送到的目标号码来判断他参与的活动,
然后给他发送回应,
比如:
发送“A”到某号码,他将收到“回答正确”,
发送“B”到某号码,他收到“回答错误”,
而同样发送“A”,如果到别的号码,说不定就是“感谢参与”
……

我的程序有接收、处理、发送三个线程。
接收线程收来的东西全部放进数据库,
处理线程则一个一个处理。
现在就说处理线程:


我用SELECT语句来选择没有处理过的记录,
——某一个int型字段为0表示没有处理过,1表示已处理
于是,语句为“SELECT ... WHERE (某字段 = 0)”,
为了防止长期占用资源,我每次只处理20条记录,然后等下一个时间。
于是我加了个“TOP 20”:“SELECT TOP 20 ... WHERE (某字段 = 0)”,
为了有先有后,还要“ORDER BY 某字段”,该字段就是有索引的ID号。
“SELECT TOP 20 ... WHERE (某字段 = 0) ORDER BY 某ID字段”,

问题来了:

问题一,如果SELECT语句中包含有“TOP 20”,那么eof永远为假,
于是,“while (!对象.Eof())”失败,
无法用这样的循环来一个一个处理。
目前我只好妥协了,去掉了“TOP 20”,
不含“TOP 20”的语句,其记录集会正确指示EOF状态。

去掉了“TOP 20”后,返回的记录集有可能会超过20条记录,
当然,也可能小于20条,甚至没有记录。
即使超过20,我也只处理20条:
我用“while ((!对象.Eof()) && (iCount < 20))”。

这样的改动,区别在于返回的记录集可能存在浪费。
有的时候,短时间内会有大量短信到达,
——比如电视里公布题目的时候。
那么,SELECT语句一下子返回那么多记录,应该会浪费资源。


问题二、如果加了“ORDER BY”,则记录无法更新。
我每处理一条记录,就要将那个特定的字段设为1,
表示这个记录已经处理过了,
但是,有“ORDER BY”的查讯,这个操作失败。
您别问我记录集的锁定类型,它是正确的。

我又只好妥协了,去掉了“ORDER BY”,不管它的先后,我就这么处理吧。
——我觉得默认情况应该是按这个有索引的ID排的。
即使不是按ID排列的,问题也不大,先后不过相差零点几秒而已。

问题三、对于ACCESS,RecordCount可以返回正确的记录数,
对于SQL SERVER,则永远返回-1,
所以,while(i<RecordCount)这种方式也不能循环。
还是只能用上面的循环方式:“while ((!对象.Eof()) && (iCount < 20))”。

这些问题以前一直没有碰到,
最初,我是专门写WEB程序的,ASP中没有碰到过这个问题,
后来,我写C++程序,用的是ACCESS也没有这个问题。
也就是说,ASP中操作ACCESS或SQL SERVER都没有这个问题,
C++中操作ACCESS也没问题,
C++中操作SQL SERVER就有以上两个问题。

短信处理程序用ASP这样的脚本是不够的,
ACCESS这样的数据库也不够。

-----------------------------
我的部分代码:
CoInitialize(NULL);//初始化COM环境
strConnectionString.Format("Provider=Sqloledb;User ID=%s;Password=%s;Initial Catalog=%s;Data Source=%s;",
  m_sSqlUsername,
  m_sSqlPassword,
  m_sSqlDatabaseName,
  m_sSqlServerName);

try
{
  m_pConn.CreateInstance(__uuidof(Connection));
  m_pConn->PutConnectionTimeout(m_nTimeOut);
  m_pConn->Open((_bstr_t)strConnectionString,
    (_bstr_t)"",
    (_bstr_t)"",
    adModeUnknown);

  m_pRs.CreateInstance(__uuidof(Recordset));
  m_pRs->Open((_variant_t)m_strSql,
    m_pConn.GetInterfacePtr(),
    adOpenStatic,//3
    adLockPessimistic,//2
    adCmdText);
}


回复列表 (共3个回复)

沙发

奶奶个熊,原来是我的SQL SERVER有问题,
我把程序给我朋友测试,一切都是好的。

板凳

好久不见偷猫了

你也在做短信呀

3 楼

我没有他的电话号码啊。你要干嘛啊。你想找钟洁柳直接发信息给她就行了。她关机说明她不想看到信息啊。你不会这样都不会想吧。你上网吧。我跟你发邮件。。

我来回复

您尚未登录,请登录后再回复。点此登录或注册