【发布时间】:2015-06-08 08:05:37
【问题描述】:
我正在编写一个实用程序来处理一堆旧的 Access '97 .MDB 文件。我需要以编程方式连接到它们,并且不允许将文件转换为较新版本的 Access。到目前为止,没什么大不了的。他们中的大多数都受密码保护,但密码真的很奇怪:
我发现将这个字符串设置为文本框的默认文本会破坏我的代码。我可以使用以下代码读取密码并将其加载到表单上的文本框中:
FileStream Reader = new FileStream(openFileDialog2.FileName, FileMode.Open);
byte[] StringData = new byte[Reader.Length];
Reader.Read(StringData, 0, StringData.Length);
String strPassword = Encoding.Default.GetString(StringData);
txtReadPassword.Text = strPassword;
strDatabasePassword = strPassword;
如果此时我将字符串写入控制台,最后一个字符不会出现,但带有重音符号的大写字母 E 会出现。我正在通过以下代码使用读取密码生成连接字符串:
public static string GetConnectionString(string strDataSource, string strPassword)
{
return String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Mode=Share Deny None;data source={0};password={1};", strDataSource, strPassword,"Jet OLEDB:Database ");
}
并且返回的连接字符串确实包含特殊字符:
密码正确,因为我可以将其复制/粘贴到访问中并打开数据库。当我尝试通过此代码使用该连接字符串时:
private void btnConnectToDatabase_Click(object sender, EventArgs e)
{
System.Data.OleDb.OleDbConnection connection = new System.Data.OleDb.OleDbConnection();
try
{
connection.ConnectionString = strConnectionString;
connection.Open();
Console.WriteLine("Connected!");
}
catch (Exception ex)
{
MessageBox.Show("Failed to connect to data source" + ex.ToString());
}
}
我得到这个结果:
第 78 行是“connection.ConnectionString = strConnectionString;”从上面。我相信索引 137 是连接字符串中的最后两个字符,它们是密码中的奇怪字符。
生成并打开这些 .MDB 文件的“不再受支持”应用程序正在以编程方式连接到它们,因此必须有一种方法可以这样做。解决方案已经让我三天了,所以我正在寻求帮助。
【问题讨论】:
-
你试过 unicode:String strPassword = Encoding.Unicode.GetString(StringData);
-
我无法重现您的问题。我的 C# 应用程序在打开数据库密码为
54BÈ┘的 Access97 数据库文件时没有问题。但是,我确实必须将连接字符串参数从;password=54BÈ┘更改为;Jet OLEDB:Database Password=54BÈ┘,否则 Jet OLEDB 认为数据库启用了用户级安全 (ULS) 并抱怨找不到工作组信息文件。 -
古斯塔夫,我试过了,密码变成汉字了……不行。
-
Gord,我将连接字符串的那部分更改为您发布的内容,并且上面列出的与索引参考相同的“不符合”错误。它让我希望您能够使用密码中的相同字符连接 Access 97 数据库。我想知道我的项目设置是否不正确,或者我是否缺少程序集或参考。当您开始项目时,您是否添加了超出标准模板的任何内容?你能发布你使用的实际工作的代码吗?
标签: c# string ms-access connection-string non-ascii-characters