ASP.NET中 *** 作SQL数据库(连接字符串的配置及获取)

ASP.NET中 *** 作SQL数据库(连接字符串的配置及获取),第1张

在WebConfig中配置数据库连接字符串 代码如下

复制代码 代码如下: <connectionStrings><add name=ConnectionString connectionString="user id=用户名password=密码initial catalog=数据库名称data source=服务器名称"/></connectionStrings>

然后在Webform_ aspx cs里面获取连接字符串 要添加如下引用

复制代码 代码如下: using System Configurationusing System Datausing System Data SqlClient 复制代码 代码如下: SqlConnection conprotected void Page_Load(object sender EventArgs e) { ConnectDB()} private void ConnectDB() { string ConString = ConfigurationManager ConnectionStrings["ConnectionString"] ConnectionStringcon = new SqlConnection(ConString)con Open()SqlCommand = new SqlCommand()SqlDataReader sdrstring sqlstr = "select * from item"CommandText = sqlstrConnection = consdr = ExecuteReader()while (sdr Read()) { Response Write(sdr["字段名"] ToString()+"</br>")} sdr Close()sdr = null} lishixinzhi/Article/program/net/201311/14106

-

但是有时候,为了数据库服务器安全,这个端口会被改成其它的,这时再连接数据库可能报

出以下错误:

在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server

不允许进行远程连接可能会导致此失败。 (provider: 命名管道提供程序, error: 40 - 无

法打开到 SQL Server 的连接)

这时只需要把端口号加上就可以了:

端口修改方法:

“开始”-->“服务器网络实用工具”-->tcp/ip-->默认端口:2433(其它的也可以)

StateServer 会话管理

将mode 属性设为StateServer,也就是将会话数据存储到单独的内存缓冲区中,再由单独一

台机器上运行的Windows 服务来控制这个缓冲区。状态服务全称是“ASP.NET State Service ”

(aspnet_state.exe),它由Web.config 文件中的stateConnectionString 属性来配置。该

属性指定了服务所在的服务器,以及要监视的端口 :

在这个例子中,状态服务在一台名为myserver 的机器的42424 端口(默认端口)运行。要在

服 务 器 上 改 变 端 口 , 可 编 辑

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters 注

册表项中的 Port 值。 显然,使用状态服务的优点在于进程隔离,并可在Web farm 中共享。

使用这种模式,会话状态的存储将不依赖于iis 进程的失败或者重启,然而,一旦状态服务

中止,所有会话数据都会丢失。换言之,状态服务不像SQL Server 那样能持久存储数据;它

只是将数据存储在内存中。

无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态

服务)已启动,并且客户端端口与服务器端口相同。如果服务器位于远程计算机上,请检查

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\All

owRemoteConnectio

n 的值,确保服务器接受远程请求。如果服务器位于本地计算机上,并且上面提到的注册表

值不存在或者设置为 0(如果改为1,就可接受远程连接),则状态服务器连接字符串必须使用

但是这是一种基于单个文件的解决方案,即我们必须为每一个生成的存储过程建立一个模板。如果我们提供一种基于多文件的代码生成方式,将会为编程人员带来极大的便利。借助于T4 ToolBox这个开源工具箱,多文件的SQL Generator的实现变得异常简单。[文中的例子可以从这里下载]目录二、创建自定义的Generator三、ProcedureGenerator如何被使用?一、多文件代码生成器会带来多大的便利?我们先来直观的感受一下较之《上篇》提供的单一文件的代码生成器,基于多文件的代码生成解决方案会为开发人员带来多大的便利。 同样对于《上篇》创建的数据表T_PRODUCT,之前我们为了生成三个不同的存储过程,我们不得已需要创建3个不同的T4模板文件。实际上我们更需要的方式只需要创建一个T4模板,让我们的SQL Generator自动为我们生成3个包含相应存储过程的.sql附属文件,如左图所示(点击看大图)。有的时候,基于单个数据表的存储过程生成方式我们依然觉得不方便。如果我们能够在T4模板文件中指定的数据表的列表,让我们的SQL Generator为列表的每一个数据表都生成CUD三个存储过程,这样的方式更加具有吸引力。如右图所示(点击看大图),一个订单模块包含两个具有主子关系的两张表(T_ORDER和T_ORDER_DETAIL),现在我们在一个T4模板中指定这两个表明,通过SQL Generator可以帮助我们生成6个包含存储过程的.sql附属文件。甚至有的时候我们连数据表列表都无需指定,让SQL Generator为所有的表都生成相应的存储过程。我的例子中没有提供这样的功能,但是实现自来不会存在任何问题。二、创建自定义的Generator在《上篇》中我创建了一个抽象的ProcedureTemplate类,以及三个基于生成CUD存储过程的具体ProcedureTemplate:InsertProcedureTemplate、UpdateProcedureTemplate和DeleteProcedureTemplate。它们都将直接服务于我们今天将要提供的基于多文件的SQL Generator。在《上篇》中,这四个Template分别定义在4个不同的TT文件中,3个具体的ProcedureTemplate通过<#@include>指令将抽象ProcedureTemplate模板文件包含过来。由于我们将要创建的T4模板将会使用到这四个类,如果我们用四个<#@include>指令将四个TT文件包含过来,由于T4引擎将会导致对ProcedureTemplate的4次包含,最好将会导致变异问题。个人觉得这应该算是T4引擎解析包含关系的一个局限性,为了解决这个问题我们不得不抽象的ProcedureTemplate和三个具体的ProcedureTemplate都合并成一个TT文件。T4 ToolBox为类库中为了提供了一个抽象的T4Toolbox.Generator类用于实现多文件的代码生成。为此我们创建一个TT模板文件,定义了如下一个继承自该类的ProcedureGenerator。ProcedureGenerator的核心是通过属性Templates定义的类型为IEnumerable<ProcedureTemplate>的ProcedureTemplate列表,这个列表在存储过程中进行初始化。而对于ProcedureGenerator的构造函数,处理定义了一个表示数据库连接字符串的databaseName的参数外,并以数组参数的形式指定了生成的存储过程基于的数据表名的列表。<#@ import namespace="System.Collections.Generic" #><#@ include file="ProcedureTemplate.tt" #><#@ include file="T4Toolbox.tt" #><#+publicclass ProcedureGenerator : Generator{public IEnumerable<ProcedureTemplate>Templates{getprivate set}public ProcedureGenerator(string databaseName, paramsstring[] tableNames) {if(null == tableNames || tableNames.Length == 0) {thrownew ArgumentNullException("tableNames")} this.Templates = InitlizeTemplates(databaseName,tableNames)}private IEnumerable<ProcedureTemplate>InitlizeTemplates(string databaseName, string[] tableNames) { foreach(string tableName in tableNames) {yieldreturnnew InsertProcedureTemplate(databaseName, tableName)yieldreturnnew UpdateProcedureTemplate(databaseName, tableName)yieldreturnnew DeleteProcedureTemplate(databaseName, tableName)} }protectedoverridevoid RunCore() {foreach(ProcedureTemplate tempalte inthis.Templates) { tempalte.RenderToFile(tempalte.GetProcedureName() + ".sql")} }}#>真正的存储过程的T-SQL脚本实现在重写的RunCore中。由于具体的文本转化逻辑都定义在了ProcedureTemplate中了,所以在这里我们需要遍历的ProcedureTemplate集合中每一个Template对象,调用RenderToFile方法将相应的存储过程的脚本写入以存储过程命名同名的.sql文件中。三、ProcedureGenerator如何被使用?我们最后来看看我们创建的ProcedureGenerator最终如何被应用于具体的代码生成。其实很简单,我们只需要创建相应的模板文件,通过<#@include>将定义ProcedureGenerator类的TT文件包含近来,最后以代码语句调用块(<#StatementCode#>)的形式实力化该对象,并调用Run方法即可。在构造函数中指定数据库连接字符串的名称和数据表名的列表。下面是基于但表的T4模板。<#@ template language="C#" hostSpecific="true" debug="true" #><#@ include file="Templates\ProcedureGenerator.tt" #><#new ProcedureGenerator("TestDb","T_PRODUCT").Run()#>下面是基于多表的T4模板:<#@ template language="C#" hostSpecific="true" debug="true" #><#@ include file="Templates\ProcedureGenerator.tt" #><#new ProcedureGenerator("TestDb","T_ORDER","T_ORDER_DETAIL").Run()#>当你代码生成工作执行之后,会多出一个与TT文件同名的附属文件,你需要手工删除掉它。从数据到代码——通过代码生成机制实现强类型编程[上篇]从数据到代码——通过代码生成机制实现强类型编程[下篇]从数据到代码——基于T4的代码生成方式


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/9893594.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存