2013-09-22 52 views
3

我将旧版ACCESS应用程序移植到.NET框架,并且需要保持相同的数据排序顺序。连接到同一个数据库,Access应用程序使用配置为使ODBC连接:SQL排序顺序与MS-ACCESS与.NET中的相同查询有所不同

的Microsoft SQL Server Native Client的版本11.00.2100

数据源名称:中央主机的设置数据库
数据源说明:
服务器:localhost \ SQLEXPRESS
使用集成安全性:是
数据库:CentralSQL15
语言:(默认)
数据密型重刑:没有
信任服务器证书:没有
多活动结果集(MARS):无
镜像服务器:
翻译字符数据:是
日志长时间运行的查询:没有
日志驱动程序统计:无
使用区域设置:没有
使用ANSI引用标识符:是
使用ANSI空,填充和警告:是

在.NET应用程序中,我最初使用SqlClient和SQL Server的连接字符串,但是我也尝试使用OdbcConnection/OdbcCommand/OdbcDataReader,它使用与ACCESS完全相同的ODBC连接。但是,ACCESS & .NET的排序顺序总是不同。

例如与查询:

SELECT sessionstn3270.sessionid, 
     sessionnames.sessionname, 
     sessionstn3270.sessiontypeid, 
     sessionstn3270.usernameid, 
     sessionnames.host, 
     sessionnames.port, 
     lus.lu, 
     sessionnames.lastmodifiedsn, 
     templates.template, 
     templates.templatetype, 
     sessionnames.sessiontype 
FROM (sessionnames 
     LEFT JOIN templates 
       ON sessionnames.template = templates.templateid) 
     INNER JOIN (sessionstn3270 
        LEFT JOIN lus 
          ON sessionstn3270.sessionid = lus.sessionid) 
       ON sessionnames.sessionnameid = sessionstn3270.sessionnameid 
WHERE usernameid = 3978 
ORDER BY templates.templatetype, 
      sessionnames.sessiontype; 

使用SQL管理Studio和.NET应用程序中的SessionIDs顺序返回:

随着MS ACCESS他们返回顺序如下:时间

95%,我可以复制相同的搜索结果通过添加ORDER BY SessionID DESC,但它不是100%I'v e尝试了不同领域的不同排序顺序,但没有100%的时间工作。

有人知道还有什么可能会影响ACCESS和.NET之间返回的结果顺序吗?

更新:

我从http://expressprofiler.codeplex.com/下载ExpressProfiler,发现如下:

当ACCESS发送SQL查询来访问数据库中的下列交易发生:

SELECT "dbo"."SessionsTN3270"."SessionID" ,"dbo"."SessionsTN3270"."SessionID","dbo"."SessionNames"."SessionType" ,"dbo"."SessionNames"."SessionNameID","dbo"."Templates"."TemplateType" ,"dbo"."Templates"."TemplateID" FROM "dbo"."SessionsTN3270",\oj "dbo"."SessionNames" LEFT OUTER JOIN "dbo"."Templates" ON ("dbo"."SessionNames"."Template" = "dbo"."Templates"."TemplateID") \ WHERE (("dbo"."SessionsTN3270"."UserNameID" = 3978) AND ("dbo"."SessionNames"."SessionNameID" = "dbo"."SessionsTN3270"."SessionNameID")) 
go 
declare @p1 int 
set @p1=1 
exec sp_prepexec @p1 output,N'@P1 int',N'SELECT "SessionID" ,"dbo"."LUs"."LUID" FROM "dbo"."LUs" WHERE ("SessionID" = @P1)',17797 
select @p1 
go 
exec sp_execute 1,17798 
go 
exec sp_execute 1,17799 
go 
exec sp_execute 1,17800 
go 
exec sp_execute 1,17801 
go 
exec sp_execute 1,105372 
go 
SELECT CASE DATABASEPROPERTYEX(DB_NAME(), 'Updateability') WHEN 'READ_ONLY' THEN 'Y' ELSE 'N' END 
go 
declare @p1 int 
set @p1=1 
exec sp_prepexec @p1 output,N'@P1 int,@P2 int,@P3 int,@P4 int,@P5 int,@P6 int,@P7 int,@P8 int,@P9 int,@P10 int',N'SELECT "TemplateID","Template","TemplateType" FROM "dbo"."Templates" WHERE "TemplateID" = @P1 OR "TemplateID" = @P2 OR "TemplateID" = @P3 OR "TemplateID" = @P4 OR "TemplateID" = @P5 OR "TemplateID" = @P6 OR "TemplateID" = @P7 OR "TemplateID" = @P8 OR "TemplateID" = @P9 OR "TemplateID" = @P10',15,15,15,15,15,33,33,33,33,33 
select @p1 
go 
declare @p1 int 
set @p1=2 
exec sp_prepexec @p1 output,N'@P1 int,@P2 int,@P3 int,@P4 int,@P5 int,@P6 int,@P7 int,@P8 int,@P9 int,@P10 int',N'SELECT "SessionNameID","SessionName","Host","Template","SessionType","Port","LastModifiedSN","SSMA_TimeStamp" FROM "dbo"."SessionNames" WHERE "SessionNameID" = @P1 OR "SessionNameID" = @P2 OR "SessionNameID" = @P3 OR "SessionNameID" = @P4 OR "SessionNameID" = @P5 OR "SessionNameID" = @P6 OR "SessionNameID" = @P7 OR "SessionNameID" = @P8 OR "SessionNameID" = @P9 OR "SessionNameID" = @P10',204,203,202,201,200,272,272,272,272,272 
select @p1 
go 
declare @p1 int 
set @p1=3 
exec sp_prepexec @p1 output,N'@P1 int,@P2 int,@P3 int,@P4 int,@P5 int,@P6 int,@P7 int,@P8 int,@P9 int,@P10 int',N'SELECT "SessionID","SessionTypeID","UserNameID","SessionNameID" FROM "dbo"."SessionsTN3270" WHERE "SessionID" = @P1 OR "SessionID" = @P2 OR "SessionID" = @P3 OR "SessionID" = @P4 OR "SessionID" = @P5 OR "SessionID" = @P6 OR "SessionID" = @P7 OR "SessionID" = @P8 OR "SessionID" = @P9 OR "SessionID" = @P10',17801,17800,17799,17798,17797,105372,105372,105372,105372,105372 
select @p1 
go 
declare @p1 int 
set @p1=4 
exec sp_prepexec @p1 output,N'@P1 int,@P2 int,@P3 int,@P4 int,@P5 int,@P6 int,@P7 int,@P8 int,@P9 int,@P10 int',N'SELECT "LUID","SessionID","LU" FROM "dbo"."LUs" WHERE "LUID" = @P1 OR "LUID" = @P2 OR "LUID" = @P3 OR "LUID" = @P4 OR "LUID" = @P5 OR "LUID" = @P6 OR "LUID" = @P7 OR "LUID" = @P8 OR "LUID" = @P9 OR "LUID" = @P10',18539,18539,18539,18539,18539,18539,18539,18539,18539,18539 
select @p1 
go 
SELECT "SessionTypeID" ,"SessionType" FROM "dbo"."SessionTypes" WHERE ("HostTypeID" = 200) 
go 
SELECT "UserNameID" ,"WSUserName" ,"RecordType" ,"Role" ,"SecurityLevel" ,"BuildingCode" ,"FloorLevel" ,"ServerID" ,"Airline" ,"Description" ,"LastModified" FROM "dbo"."WSUsers" 
go 

但是当SQL Server运行查询,它更简单:

SELECT SessionsTN3270.SessionID, SessionNames.SessionName, SessionsTN3270.SessionTypeID, SessionsTN3270.UserNameID, SessionNames.Host, SessionNames.Port, LUs.LU, SessionNames.LastModifiedSN, Templates.Template, Templates.TemplateType, SessionNames.SessionType 

FROM (SessionNames LEFT JOIN Templates ON SessionNames.Template = Templates.TemplateID) INNER JOIN (SessionsTN3270 LEFT JOIN LUs ON SessionsTN3270.SessionID = LUs.SessionID) ON SessionNames.SessionNameID = SessionsTN3270.SessionNameID WHERE UserNameID = 3978 ORDER BY Templates.TemplateType, SessionNames.SessionType; 

go 

从这个SQL跟踪,我发现我可以使用查询复制从SQL Server相同的顺序,开始是这样的:

SELECT "dbo"."SessionsTN3270"."SessionID" ,"dbo"."SessionsTN3270"."SessionID","dbo"."SessionNames"."SessionType" ,"dbo"."SessionNames"."SessionNameID","dbo"."Templates"."TemplateType" ,"dbo"."Templates"."TemplateID" FROM "dbo"."SessionsTN3270", "dbo"."SessionNames" LEFT OUTER JOIN "dbo"."Templates" ON ("dbo"."SessionNames"."Template" = "dbo"."Templates"."TemplateID") 
WHERE (("dbo"."SessionsTN3270"."UserNameID" = 3978) AND ("dbo"."SessionNames"."SessionNameID" = "dbo"."SessionsTN3270"."SessionNameID")) 

无法看起来更难看虽然...但是...感谢你表达分析器。

+3

如果按列排序并未指定唯一值,则相同值内的顺序本质上是随机的。没有现实的方法可以将它从一个DBMS复制到另一个。实际上,如果您在SQL Server上重建索引或压缩Access数据库,则顺序可能会发生更改。 – Laurence

+0

如果要移动/升级应用程序以使用SQL Server,为什么要复制Access提供的缺陷排序顺序?我想人们会想要正确排序可能是什么。 –

+0

数据来自同一个SQL服务器。 Access应用程序不在数据库中存储任何数据,而是使用相同的ODBC连接字符串从SQL服务器中检索它。我同意排序顺序是“随机的”,因为它是“未指定的”排序顺序很重要的原因是因为应用程序是以这种方式编写的,所以依赖订单的东西会回来。如果我无法修复它,我必须修复很多其他代码段。这是我的备份计划......但坦白地说,我花在意大利面代码上的时间越少越好。 –

回答

相关问题