use*_*846 6 c# sql-server ms-access odbc linked-tables
所以我有一个 msaccess 数据库,其中有几个链接表,这些表通过内置用户名和密码的 DSN 指向 SQL Server 数据库。
在我的 .net 应用程序中,我需要连接到我的访问数据库,并对链接的表运行查询。我尝试过 OLEDB 和 ODBC 方法,它们似乎都不适用于指向 SQL Server 的链接表,但指向其他访问表的链接表很好。我收到一个错误,例如:ODBC---连接到“THISDSN”失败。
有没有办法连接到我的访问数据库,以便我可以简单地运行查询,而链接表是 SQL 服务器还是只是访问表都没有关系?
您所描述的可以完成,您只需要检查设置中的一些详细信息。
我有以下 Access 数据库,其中包含本地表 [Expenses] 和链接表 [dbo_AccountCodes]


我还有一个名为 [ExpenseDetails] 的已保存查询,它从 [Expenses] 中提取数据并使用 JOIN 检索相关的 [AccountDescription]:
SELECT Expenses.*, dbo_AccountCodes.AccountDescription
FROM Expenses INNER JOIN dbo_AccountCodes ON Expenses.AccountID = dbo_AccountCodes.AccountID;
Run Code Online (Sandbox Code Playgroud)
我可以使用普通的 OLEDB 方法从我的 C# 应用程序运行已保存的 Access 查询:
static void Main(string[] args)
{
var conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\__tmp\accounting.accdb;");
conn.Open();
var cmd = new OleDbCommand("SELECT * FROM ExpenseDetails", conn);
OleDbDataReader rdr = cmd.ExecuteReader();
int rowCount = 0;
while (rdr.Read())
{
rowCount++;
Console.WriteLine("Row " + rowCount.ToString() + ":");
for (int i = 0; i < rdr.FieldCount; i++)
{
string colName = rdr.GetName(i);
Console.WriteLine(" " + colName + ": " + rdr[colName].ToString());
}
}
rdr.Close();
conn.Close();
Console.WriteLine("Done.");
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我得到:
Row 1:
ID: 1
UserID: dr.evil
ExpenseDescription: "Laser"
ExpenseAmount: 1000000
AccountID: 101
AccountDescription: Weapons of World Domination
Done.
Run Code Online (Sandbox Code Playgroud)
所以它可以工作。您可以检查的一些事项是:
您的链接表是否使用系统 DSN?根据 C# 代码的执行方式,如果 DSN 是其他类型,它可能无法“查看”DSN。
如果这是 ASP.NET 应用程序,请确保运行代码的进程具有访问 SQL Server 数据库所需的凭据。您说您的 DSN 有“内置的用户名和密码”,因此请确保.Connect链接表的字符串明确表示Trusted_Connection=No;。您还可以尝试在 Access 中重新创建表链接,并在“链接表”对话框中选择“保存密码”选项。如果您决定尝试在 SQL Server 上使用 Windows 身份验证,您可能必须在服务器上添加 SQL 登录名,并在数据库上添加 SQL 用户NT AUTHORITY\SYSTEM和/或NT AUTHORITY\NETWORK SERVICE和/或YourDomain\YourIisServerName$,具体取决于您的设置。
| 归档时间: |
|
| 查看次数: |
4994 次 |
| 最近记录: |