测试环境:SQL Server 2014,Excel 2013
Excel示例文件下载:http://download.csdn.net/detail/zhanghongju/8533555
前期在做一个现场投票的小软件,准备使用Excel实现,工作簿中包含有两个工作表,各包含一个命令按钮,分别用于提交和查看投票结果。
问题出在查看投票按钮上,起初只是使用SELECT语句查询,一切正常;后期对于投票结果需要进行一些权重的计算,过程比较复杂,便想到把计算过程放在SQL Server端,使用存储过程实现。但是,在调用存储过程的过程中却遇到了问题,一直无法返回记录集。最后发现问题出现在记录集的CursorLocation属性设置上,下面便把此问题的过程和解决方案提供如下,以免发生类似问题。
一、使用CursorLocation属性设置游标的区别
CursorLocation属性包含两个属性值:adUseClient(常量值为3)和adUseServer(常量值为2)。adUseClient表示使用由本地游标库提供的客户端游标,adUseServer是默认值,表示使用数据提供者的或驱动程序提供的游标。
adUseClient游标服务的功能通常更加强大一些,许多功能可能是驱动程序提供的游标无法提供的。但是,adUseServer游标具有高度的敏感性,可以看到其他用户对数据源所作的更改,对于一些多用户操作,该特性是具有优势的。也正是因为此特性,会导致记录集行数的具有不确定性,因此某些情况下是无法使用RecordCount属性获取记录集的行数,也无法使用EOF和BOF判断是否到达记录集的尾部和头部。
二、在SQL Server中创建示例数据
下面的语句用于在SQL Server中创建两个表。dbo.MyScore用于存储评选人员ID、项目ID和评选分数,dbo.MyPerson用于存储评选人员ID和评选人员是否为专家的标志,标志为1,表示此评选人员为专家。
IF OBJECT_ID('dbo.MyScore') IS NOT NULL
DROP TABLE dbo.MyScore;
IF OBJECT_ID('dbo.MyPerson') IS NOT NULL
DROP TABLE dbo.MyPerson;
GO
CREATE TABLE dbo.MyScore(PersonID int, ProjectID int, ProjectScore int);
CREATE TABLE dbo.MyPerson(PersonID int, IsExpert int);
INSERT INTO dbo.MyScore VALUES
(1, 1001, 90),
(1, 1002, 80),
(1, 1003, 95),
(2, 1001, 85),
(2, 1002, 85),
(2, 1003, 90),</