用户
 找回密码
 入住 CI 中国社区
搜索
查看: 3413|回复: 5
收起左侧

mmsql 分页遇到的问题(已解决),求更好方法,tks

[复制链接]
发表于 2009-7-8 07:36:35 | 显示全部楼层 |阅读模式
本帖最后由 erebus 于 2009-7-9 09:04 编辑

用ci做了个网站,发布到服务器上以后,每次访问到带有分页的页面时,分页连接可以显示,但是本页的内容就是显示不出来,随后就报出不能使用数据库的错误:Unable to select the specified database: lsrc       (lsrc是数据库名称)

我的ci是1.7版本,数据库驱动是用的此贴分享的,url地址:http://codeigniter.org.cn/forums/thread-72-1-5.html

驱动内容:
function _limit($sql, $limit, $offset)
{
// Horrible solucion =)
//$i = $limit + $offset;
//return preg_replace('/(^SELECT (DISTINCT)?)/i','\1 TOP '.$i.' ', $sql);        
$cursorName = 'mi_cursor_'.md5(strtolower($sql));
$sql = "DECLARE ".$cursorName." CURSOR DYNAMIC READ_ONLY FOR
    ".$sql."
    OPEN ".$cursorName."
    DECLARE @CURSOR AS INT
    SELECT @CURSOR = CURSOR_HANDLE FROM  MASTER.DBO.SYSCURSORS
    WHERE CURSOR_NAME = '".$cursorName."'
    EXEC SP_CURSORFETCH @CURSOR, 32, ".($offset+1).", ".$limit."
    EXEC SP_CURSORCLOSE @CURSOR";
    return $sql;
}

一般什么问题啊,hex大哥帮帮忙,谢先!
在我的机器上是没哟问题的,难道是环境问题?服务器环境:win2003+iis+php5.0+sql2000

请大家帮忙分析下,谢谢
发表于 2009-7-8 10:20:05 | 显示全部楼层
目前还不能确定具体原因,但有可能是 CI 版本不同造成的,毕竟之前那个是基于 1.5.4 来做的。当然不排除服务器环境原因。
发表于 2009-7-8 10:46:37 | 显示全部楼层
controller和model的分页部分代码贴一下吧
 楼主| 发表于 2009-7-9 09:03:39 | 显示全部楼层
本帖最后由 erebus 于 2009-7-9 09:49 编辑

已经解决,谢谢hex
服务器上的sql的权限不够或者把EXEC SP_CURSORFETCH 给禁掉了,自己把数据库驱动改了一下,但是这样比较弱,请大家讨论给下好点儿的解决办法。
我的网站基本都是一个表查询,语句都是select a,b,c from table where *** order by***类型的,所以就用一下变通办法,修改driver的_limit函数:
PHP复制代码
 
        function _limit($sql, $limit, $offset){
                $sql=trim($sql);
                if(strtolower(substr($sql,0,6))=='select'){
                        $sqlExep="select top ".intval($offset)." id ".strstr(str_replace('from','FROM',$sql),'FROM');
                        $sqlFrom="select top $limit ".substr($sql,6);
                        $sqlFromWhere=strstr(str_replace('where','WHERE',$sqlFrom),'WHERE');
                        if(empty($sqlFromWhere)){
                                $sqlFromOrder=strstr(str_replace('order','ORDER',$sqlFrom),'ORDER');
                                $sqlFrom=str_replace($sqlFromOrder,'',$sqlFrom);
                                $sqlFrom .= "where id not in(".$sqlExep.") ".$sqlFromOrder;
                        }else{
                                $sqlFrom=str_replace($sqlFromWhere,'',$sqlFrom);
                                $sqlFrom .= "where id not in(".$sqlExep.") and ".substr(trim($sqlFromWhere),5);
                        }
                        return $sqlFrom;
                }else{
                        return $sql;
                }
        }
 
复制代码
发表于 2009-7-9 10:15:42 | 显示全部楼层
mssql 的分页方法太多了,比如可以 google 出来的基于存储过程的分页,这些都可以写到 _limit 函数中的。
发表于 2009-7-9 12:14:26 | 显示全部楼层
俺是用mssql_seek分页,比较土

本版积分规则