2

我创建了一个简单的项目,其中包含一个 SQL Server 数据库,其中包含数十个表和大量索引,但没有什么复杂的。没有触发器,没有存储过程,没有额外的“数据库魔法”。代码是用 C# 编写的,使用实体模型和动态数据站点来快速设置基础知识,所以可以让一些打字猴子工作并做一些基本的数据输入,而我将修改项目变得更加成熟.

在 SQL Server 2005 上对其进行了测试,一切正常。因此,我通过 Visual Studio 进行了设置,并将其发送给打字猴子及其管理员。他们所要做的就是:1)创建一个新数据库。2) 执行数据库的创建脚本。3)安装我给他们的设置。4)修改连接字符串,为了方便起见,它恰好放在一个特殊的配置文件中。5) 使用网络界面,如果出现问题,请通知我。

出了点问题。这个完整的错误:第 1 行:'(' 附近的语法不正确。'row_number' 不是可识别的函数名。关键字'AS' 附近的语法不正确。

我不在我的代码中使用“row_number”。我只是使用 Linq 进行查询。此外,由于实体模型,我什至不必担心做任何 SQL 的事情。(尽管我很擅长。)

我的第一个猜测是他们使用了错误的连接字符串。他们可能正在 SQL Server 上安装此应用程序(应该仍然可以工作),但他们没有完全更改连接字符串,现在我的项目认为它正在使用 SQL Server 2005。(或其他。)我是对的还是这是由某些原因引起的其他讨厌的错误?

完整错误:

[SqlException (0x80131904):第 1 行:'(' 附近的语法不正确。'row_number' 不是可识别的函数名。关键字'AS' 附近的语法不正确。]
System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔值breakConnection)+1950890 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,布尔 breakConnection)+4846875 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)+194
System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2392
System.Data.SqlClient.SqlDataReader.ConsumeMetaData() +33 System.Data.SqlClient.SqlDataReader.get_MetaData() +83 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +297
System.Data .SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +954 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String 方法, DbAsyncResult 结果) +162
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String 方法) +32 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior 行为, String 方法) +141
System.Data.SqlClient.SqlCommand。 ExecuteDbDataReader(CommandBehavior 行为)+12
System.Data.Common.DbCommand.ExecuteReader(CommandBehavior 行为)+10
System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand,CommandBehavior 行为)+387

[EntityCommandExecutionException:执行命令定义时发生错误。有关详细信息,请参阅内部异常。]
System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) +423
System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute(ObjectContext context, ObjectParameterCollection parameterValues) +743
System.Data。 Objects.ObjectQuery 1.GetResults(Nullable1 forMergeOption) +157
System.Data.Objects.ObjectQuery`1.GetIListSourceListInternal() +13 System.Data.Objects.ObjectQuery.System.ComponentModel.IListSource.GetList() +7 System.Web.UI.WebControls.EntityDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments, Creator qbConstructor)+1168 System.Web.UI.WebControls.EntityDataSourceView.ExecuteSelect(DataSourceSelectArguments 参数)+102
System.Web.UI.DataSourceView.Select(DataSourceSelectArguments 参数,DataSourceViewSelectCallback 回调) +19 System.Web.UI.WebControls.DataBoundControl.PerformSelect() +142 System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +73 System. Web.UI.WebControls.GridView.DataBind() +4 System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() +82 System.Web.UI.WebControls.CompositeDataBoundControl.CreateChildControls() +72 System.Web.UI.Control .EnsureChildControls() +87 System.Web.UI.Control.PreRenderRecursiveInternal() +44 System.Web.UI.Control.PreRenderRecursiveInternal() +171 System.Web.UI.Control.PreRenderRecursiveInternal() +171 System.Web.UI .Control.PreRenderRecursiveInternal() +171 System.Web.UI.Control.PreRenderRecursiveInternal() +171 System.Web.UI.Control。PreRenderRecursiveInternal() +171 System.Web.UI.Page.ProcessRequestMain(布尔型 includeStagesBeforeAsyncPoint,布尔型 includeStagesAfterAsyncPoint)+842


这个应用程序以前是在 SQL Server 2000 系统上构建的,然后它也可以正常工作。但是,测试数据库升级到 2005,而生产数据库仍然使用 2000。我希望这不会造成任何问题,但我的假设是否正确?

4

4 回答 4

5

我知道这是一个旧线程,但我认为它仍然具有一定的重要性。

我遇到了同样的问题。我在 sql2008 服务器上开发并部署到 sql2000 服务器。不要在 2000 机器上开发,而是在写字板中打开 .edmx 文件并将清单标记更改为“2000”。然后重建并发布。比在不同的机器上开发要容易得多。

于 2010-07-16T14:00:42.733 回答
2

ROW_NUMBER()用于执行Skip/之类的操作Take,至少在 SQL Server 2005/2008 上是这样。如果您的目标是早期版本的 SQL Server,它可能会感到困惑。

LINQ-to-SQL 为支持 SQL 2000 做出了合理的尝试(尽管并非所有内容都受支持)——不过,老实说,我不知道 EF 是否支持。

于 2009-06-23T07:58:23.790 回答
2

查看异常,似乎连接指向不是 SQL 2005 的 SQL Server 数据库。

SQL 2005 支持 ROW_NUMBER。

于 2009-06-23T07:58:45.443 回答
2

好吧,我做了一个简单的测试。我已经将我的项目与 SQL Server 2000 数据库连接,安装了数据库并运行了 SQL 脚本。然后 - 没有重新编译 - 我用我的网站连接到这个数据库,但它失败了。这是同样的错误。

然后是测试的下一部分:我刷新了项目中的实体模型并重新编译了整个项目。仍然与 SQL Server 2000 连接,我再次启动该站点,它就在那里,我美丽的站点。:-)

事实证明,实体模型(和 LINQ-TO-SQL)将检测您在编译项目时使用的数据库。如果您使用 2005,最终代码将针对 2005 进行优化,您将无法在 SQL Server 2000 上安装整个程序。

因此,尽管很烦人,但我将不得不继续在 SQL Server 2000 机器上进行开发。(并且踢某人的屁股,因为他应该在类似于最终用户的系统上测试我的设置!)

于 2009-06-23T08:58:59.517 回答