从经典 ASP 应用程序连接到 SQLExpress

Posted

技术标签:

【中文标题】从经典 ASP 应用程序连接到 SQLExpress【英文标题】:Connecting to SQLExpress from Classic ASP application 【发布时间】:2015-10-08 15:46:58 【问题描述】:

我有一个本地 SQLExpress 数据库。我需要从经典的 ASP Web 应用程序连接到它。

我认为我的连接字符串是正确的,因为当我使用 C# 控制台应用程序进行测试时,我能够连接和读取数据:

// C# Example app
var connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=TestData;Integrated Security=True";
var con = new SqlConnection(connectionString);

 con.Open();
 var cmd = new SqlCommand("SELECT * FROM tbl", con);

 cmd.ExecuteNonQuery();
 var reader = cmd.ExecuteReader();
 while(reader.Read())
 
    Console.WriteLine(reader.GetValue(1)); // displays data
 

但是,当我在 ASP Web 应用程序中使用相同的字符串时,它会失败:

// ASP Web App
connection = Server.CreateObject("ADODB.Connection");
connectionString = "Data Source=.\\SQLEXPRESS;Initial Catalog=TestData;Integrated Security=True";
Response.Write("connectionString:" + connectionString + "<br/>");
connection.Open(Application(connectionString)); // error

Open 方法失败:

0x80004005 - 用于 ODBC 驱动程序的 Microsoft OLE DB 提供程序: [Microsoft][ODBC Driver Manager] 数据源名称未找到且无 指定的默认驱动程序

我还尝试为 SQL 数据库设置登录名并使用用户 ID 和密码:

var connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=TestData;User Id=AspTest;Password=Test";

以同样的方式失败。

如何让我的网络应用程序连接到我的数据库?

【问题讨论】:

尝试删除其中一个反斜杠:Data Source=.\\SQLEXPRESS @markpsmith 我得到与 Data Source=.\SQLExpress; 相同的结果; 我不明白更改连接字符串对这里有什么帮助,因为您可以看到我使用的连接字符串适用于我的 C# 示例。 可能是 32 位还是 64 位的问题?就架构而言,c# 的运行方式是什么?例如,如果服务器是 64 位,而 c# 运行的是 32 位,那么 Web 应用程序是否在应用程序池中启用了 32 位模式? 【参考方案1】:

如果您显示的 ASP 代码是您实际使用的代码,Application(connectionString) 很可能返回 null/nothing,因为应用程序对象是一个字典。您是否尝试过直接使用连接字符串打开连接:

connection.Open(connectionString); 

通常的模式是在 global.asa 中分配 Application("conectionString") = "your connection string" 然后使用以下代码创建连接:

connection.Open(Application("connectionString")); 

此外,您将需要不同的 ASP 和 .NET 连接字符串,如上一个答案所示。

【讨论】:

注意只在ApplicationSession对象中存储连接字符串而不是ADODB.connection对象。 不太喜欢使用Application("connectionString") 模式,因为更改连接需要重新启动应用程序池。将其存储在 Session 对象中效果更好,因为可以轻松放弃会话。 很公平。我的主要观点是代码使用连接字符串值作为应用程序对象中的查找键。 不,我同意。 Application(connectionString) 是错误的,如果他们已经定义了 connectionString 变量,那么代码示例就使用它。应该是connection.Open(connectionString);。目前Application 将寻找一个名为Data Source=.\\SQLEXPRESS;Initial Catalog=TestData;Integrated Security=True 的密钥,这没有任何意义。 这很有帮助,Application 对象是空的。【参考方案2】:

步骤:

    为本地 SQL 数据库添加用户(包括用户名和 密码) 授予用户读取、写入、选择 DB 中(所有)项目的权限(YMMV - 我的应用程序需要它)

    配置 ODBC(32 位)(C:\Windows\SysWOW64\odbcad32.exe),使“SqlConnectString”使用 SQL 本地客户端 11 连接到(本地)\SQLEXPRESS

    设置 SQL 登录凭据 将默认 DB 设置为 testDB

    从以下位置更改 ASP 连接代码: con.Open(Application("SqlConnectString")); 到 con.Open("DSN=SqlConnectString;User Id=[username];Password=[password]");

您过去的 ASP 代码现在可以与 SQL Express 对话。

【讨论】:

【参考方案3】:

你试过了吗:

connString = "Provider=SQLOLEDB; SERVER=MYSERVER\SQLEXPRESS; Database=MYDB; Uid=sa; Pwd=Pass!@#"

【讨论】:

以上是关于从经典 ASP 应用程序连接到 SQLExpress的主要内容,如果未能解决你的问题,请参考以下文章

经典 asp 查询未按连接到 Microsoft Access 数据库的用户名排序

带有 COM 的经典 ASP 在 Windows Server 2008 R2 上抛出“未找到数据源名称且未指定默认驱动程序”

无法从 docker windows 容器中的 asp.net 核心应用程序连接到主机数据库

无法从 ASP.NET Web 应用程序连接到我的 SQL Server Express

无法从在 Docker (Linux) 中运行的 ASP.NET Core 连接到 SQL Server 命名实例

经典 ASP 给出内部服务器错误 500