ADO OleDB连接字符串未更新



我有一个ASP.NET C#应用程序,我想让用户从测试环境和生产环境中检索数据。该应用程序为用户提供了一个下拉列表,其中包含两种环境的选项。数据库连接是通过一个自定义ADO提供程序进行的,我使用OleDbConnection来查询该提供程序。ADO是由供应商提供的,我为每个环境格式化一个连接字符串,如下所示:

string strProd = "Provider={ProviderName};Data Source={Production_Server};Password={Password};User ID={UserId}";
string strTest = "Provider={ProviderName};Data Source={Test_Server};Password={Password};User ID={UserId}";

第一次连接时一切都很好。因此,如果我编译和部署应用程序,并且用户首先请求生产数据,它就会从生产环境中提取数据。但是,当用户尝试从测试环境中提取数据时,检索到的数据再次来自生产环境,即使已经设置了测试环境的连接字符串。

这里有一个我如何检索数据的例子——适用的连接字符串被传递给函数:

protected void Page_Load(object sender, EventArgs e)
{
string strProd = "Provider={ProviderName};Data Source={Production_Server};Password={Password};User ID={UserId}";
string strTest = "Provider={ProviderName};Data Source={Test_Server};Password={Password};User ID={UserId}";
var prod = GetData(strProd); // returns Prod data
var uat = GetData(strTest); // also returns Prod data ??
}
public DataTable GetData(string connStr) {
OleDbConnection conn = new OleDbConnection(connStr);
OleDbCommand cmd = new OleDbCommand("select top 10 field from table", conn);
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}

我确信我正在传递适用的连接字符串,但数据源(和用户Id/密码(似乎坚持使用第一次使用该特定提供程序设置的内容。例如,如果我将提供程序更改为Microsoft.Jet.OLEDB.4.0提供程序并读取CSV文件,它就会读取该CSV文件并正确检索CSV数据。但是,如果我切换回自定义提供程序,它仍然停留在第一个连接字符串值上,即使我将连接字符串设置为其他环境。

当我调试并完全重新启动应用程序时,如果我首先连接到测试环境,它将与测试环境保持一致,不会更新到生产环境,如果我先连接到生产环境它将与生产环境保持一致。我尝试了各种方法来使用连接(使用conn.Open()conn.Close()conn.Dispose()等(,但检索到的数据总是来自第一次尝试的connection String。

我不排除这是自定义ADO提供程序的错误,但我还有什么可以尝试的吗?这些值是否有可能被缓存,如果有,有没有办法防止这种行为?我被难住了。

编辑:根据@jdweng的建议,我将连接分为不同的类——这并没有解决问题。

public partial class Test : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btn_Click(object sender, EventArgs e) {
string connStr = string.Format("Provider=ProviderName;Data Source={0};Password=Password;User ID=UserId", ddlEnv.SelectedValue);
GetEnvData envData = new GetEnvData();
DataTable dt = envData.GetData(connStr);
}
}
public class GetEnvData {
public DataTable GetData(string connStr) {
OleDbConnection conn = new OleDbConnection(connStr);
OleDbCommand cmd = new OleDbCommand("select top 10 field from table", conn);
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
}

编辑:添加要检查的Web.Config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.7.2" />
<httpRuntime targetFramework="4.7.2" />
<authentication mode="Windows" />
<authorization>
<deny users="?"/>
</authorization>        
<identity impersonate="true"/>
</system.web>
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=&quot;Web&quot; /optionInfer+" />
</compilers>
</system.codedom>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
</system.webServer>
</configuration>

Gee,这是个谜。可能的是;潜水员";您可能基于";sql";,并且如果";sql";如果是相同的,则它使用以前的sql数据来提高性能。

因此,我会考虑尝试";不同的";每次尝试使用sql。如果发送完全相同的sql,则可能会使用某种缓存,并忽略连接。

我还将代码包装在using中,这将关闭连接,并正确处理对象,因此:

public DataTable GetData(string connStr)
{
DataTable dt = new Datatable();
using (OleDbConnection conn = new OleDbConnection(connStr)) 
{
using (OleDbCommand cmd = new OleDbCommand("select top 10 field from table", conn))
{
conn.open();
dt.load(cmd.ExecuteReader());
}
}
return dt;
}

最新更新