从SQL Server迁移到ASP.NET中的访问

是的,你确实正确阅读了。这是以下情况:您知道SQL Server是迄今为止上级数据库系统(如果确实可以称为数据库系统)。您还知道不建议使用MS访问数据库作为Web应用程序的数据存储。您对SQL Server感到满意,并且多年来没有看过访问 - 如果有的话。但现在,您的老板或您的客户希望您在下一个项目中使用它。

也许该项目相对较小,或者它们可能只是不想花费额外的现金对SQL Server托管的成本 - 或者他们已经使用Access的Acces,并且希望在Web上提供当前数据库。任何。这是决定而你被困在一起。几乎所有的文章,你可以找到谈论移动 向上 到SQL Server。这一个会看看其他方式时应该考虑的考虑因素。

提供者

建议连接到访问的方法是通过Jet 4.0 OLEDB提供程序。值得一提的是,我指的是"Access",我实际上是指独立的.mdb文件。访问是具有良好设计师,表单,报告,宏和模块的桌面应用程序。否则这些都没有可用于ASP.NET应用程序,除非MS访问安装在Web服务器上,使用Office Interop。如何做到这一点超出了本文的范围。

使用权 2007具有新的格式和提供程序 - ACE.OLEDB提供程序,数据库可以保存为.accdB文件。除非您访问托管应用程序的服务器,否则应避免使用此提供程序。它仅在最近公平的Office 2007之外的下载,并且在许多商业网络托管机上非常不可能找到。是否将作为Longhorn服务器的一部分提供的默认安装,目前未知。另一方面,Jet现在是Windows平台的一部分,是XP,Windows服务器和Vista的默认安装的一部分。

连接

建立连接的3个主要方法是:通过一个 使用权DataSource 控制,A sqldatasource. 控制,或最后,直接来自代码。无论您选择哪个,.mdb文件的最佳位置是app_data文件夹。此文件夹已被配置为不提供通过HTTP请求的文件,这意味着没有人可以浏览到www.yourdomain.com/app_data/yourdb.mdb并下载数据库。它还允许使用别名| DataDirectory |在连接字符串中,它自动解析为该位置,无论计算机的文件系统路径如何,都没有将从一台计算机连接到另一台计算机的字符串所必需的更改。

  • AccessDataSource 控制仅限于喷气式OLEDB提供商。因此,它公开了只读提供服务。它还公开了一个可接受.mdb文件的位置和名称的数据文件属性,它可以是例如〜/ app_data / yourdb.mdb或完整文件系统路径的相对路径。 您无法设置ConnectionString属性,这意味着您无法使用AccessDataSource控件来连接到密码受保护的.mdb文件。
  • sqldatasource. 控制 可以与与SQL Server相同的访问权限。它需要一个连接字符串,理想情况下应该在一个地方保持 - Web.config。
  • 连接 直接通过代码 与SQL Server完全相同的方式,除了使用来自System.Data.oledb命名空间而不是System.Data.SqlClient,例如OLEDBCONNECTE,OLEDBCOMMAND,OLEDBDATAREADER等。

连接字符串

如果将.mdb文件放在app_data中,则唯一需要从以下内容更改<yourdb.mdb>:

提供者=Microsoft.Jet.Oledb.4.0;Data Source=|DataDirectory|<yourdb.mbd>

常见的错误是将“数据源”合并为一个单词,这导致"找不到可安装的ISAM"错误。可以找到连接到密码保护文件等的其他变体 www.connectionstrings.com/?carrier=Access.。请勿使用ODBC版本或DSN。 ODBC在多用户环境中不稳定,是数据库损坏的主要原因。

另一个常见的错误消息,"操作必须使用可更新的查询"结果不是在App_data文件夹上应用正确的权限。在Win XP Pro时,ASPNet帐户需要修改权限,并且在Windows Server 2003上,必须在网络服务帐户中授予修改权限。这是因为当访问数据库时,可以创建一个临时.ldb文件,这是必需的。

访问和SQL Server之间的主要差异

存储程序

访问不提供存储过程,触发器或用户定义的函数。该区域的最佳访问量保存查询。这些是可以通过OLEDB调用的单个SQL命令。可以使用查询设计器直接在访问本身内创建,或者通过代码传递DDL命令:"创建程序myquery作为......"。当从代码调用时,它们以完全相同的方式处理在SQL Server中的存储程序。三个主要差异是参数未在程序的身体内宣布;您无法创建批处理命令;并且没有用于控制流的代码的地方,例如情况,如果等等。保存的选择语句中存在另一个QUIRK,尽管它们是使用的"Create Procedure"语句实际上保存为访问中的视图对象。这意味着它们不会出现在访问或SQLDataSource控件中的存储过程列表中。您需要手动将查询的名称应用于DataSource的SelectCommand。此外,它们是在Visual Web Developer / Visual Studio中的数据库/ Server Explorer窗格中的视图中找到的。

更新:已指出,在运行Create Procage ...命令时,您已指出您可以确实声明参数及其数据类型。它不是必需的,但这样做可能会节省一小部分性能,在否定数据库字段上的查找需要获取数据类型。正确的语法如下:

  

创建程序 myproc. AS

参数 @我的身份 ;

选择 我菲尔德 MyTable

在哪里 MyID = @MyID

  

谢谢 Hans_v. 把它指向我。

参数

OLEDB参数是位置。这意味着给出的参数的名称是无关的,并且必须以完全相同的顺序添加到参数集合中的参数,其中它们出现在SQL内。您可以使用与@或a的名称为前缀,或者或任何与现有字段名称不匹配的字符串,因此以下参数化查询功能等效:

  

插入 类别(类名,描述) 价值 (?,?)

插入 类别(类名,描述) 价值 (@类别名称,@描述)

插入 类别(类名,描述) 价值 (param1,param2)

插入 类别(类名,描述) 价值 ([p1],[p2])

  


第一个示例很好,可以直接从代码运行,但如果用作已保存的查询,则无法工作。在这种情况下,每个参数必须具有不同的名称。

分隔符

如果直接从代码调用,或者如果在保存的查询中使用,则字符串分隔符是单个报价
数字分隔符与SQL Server相同 - 没有。
日期分隔符可以是单引号或octhothorpes(#)

与SQL Server一样,您可以使用参数而不是动态SQL消除许多与分隔符相关问题。

通配符

通配符字符为%,如在SQL Server中。但是,如果要在Access中设计和测试您的查询,则必须使用*。完成工作后,如果要在访问中保存,您必须记得恢复到%。 OLEDB不明白*,并将其作为文字。

职能

MS访问提供了一流的内置功能。但是,并非所有这些都可以通过Jet Oledb提供商获得。一般来说,您会发现标准VBA功能可用,虽然即使它并非总是保证。我经常发现,特别是用字符串函数,它从查询带回比你需要的更多数据,然后在结果上使用C#或VB字符串函数比获得访问权限更快。 YMMV,始终值得测试客户端应用程序是否更快地执行处理,特别是对于长时间运行的数据库调用。

限制

除了使用基于文件的系统而不是基于服务器的系统的优秀限制之外,Access数据库的大小不能超过2GB。由于更新和删除命令,访问数据库具有膨胀趋势,因此需要定期压缩。这可以通过使用Jet Replication对象(JRO)的代码来完成,这些对象是COM对象。关于如何执行Compy Compact和Repeion的指南 这里可用。这将有助于重置索引并提高数据库的性能。但是,您不想在峰值峰值时间内运行此代码。机会是数据库在进行过程中将不可用。

数据类型

访问中的表设计器似乎提供了一些新的数据类型。这是他们的工作方式:

  • 文本 - 对于长度高达255个字符的字符串。存储大小可设置
  • 备忘录 - 相当于SQL Server的文本数据类型。将在理论上存储高达2GB,但由于访问权限中的任何对象的限制,因此访问中的所有对象.mdb文件等。
  • 数字 - 用于整数,双打 - 任何数值。 DDL允许您设置要存储的数字类型,设计器如图所示。
  • DateTime - 存储数据和时间。可用内置功能:日期()将在时间部分中与12中午一起存储当前日期。现在()将存储当前日期和时间。 getDate()不可用。
  • 货币 - 不推荐用于ASP.NET应用程序。使用号码。
  • AutoNumber - 增量种子,类似于SQL Server中的标识。您必须使用@@ Identity来获取最近添加的值,而不是scope_identity()。
  • 是 - 布尔值。是是-1,否是0。
  • oleObject - 类似于图像。不推荐作为存储文件的地方。使用文件系统,并将指针存储到文本字段中的FilePath。
  • 超链接 - 导致混淆。此数据类型纯粹用于存储和显示访问表单中的超链接。它不会在ASP.NET页面中神奇地将您的Web地址转换为超链接。所有它都会做的就是在任何一端都在#。不要使用它。

在这里可以找到更多的阅读:

使用MS Access的ASP.NET参数查询
用于访问2000的Microsoft Microsoft Jet SQL
用于访问2000的中间Microsoft Jet SQL
高级Microsoft Jet SQL用于Access 2000