2015-04-03 111 views
1

我正在编写一个实用程序来处理一堆传统的Access '97.MDB文件。我需要以编程方式连接到它们,并且我不允许将这些文件转换为更新版本的Access。到目前为止,没有什么大不了的。其中大多数是密码保护,但密码是非常奇怪:在连接字符串密码中使用非ASCII字符

Password File

我发现,使这个字符串文本框会打破我的代码默认文本艰辛的道路。我能看懂的密码,并将它与下面的代码加载到一个文本框的窗体上:

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 "); 
     } 

并返回不包含特殊字符连接字符串::我通过下面的代码使用读取密码生成连接字符串

enter image description here

的密码是正确的,因为我可以复制/粘贴到访问并打开数据库。当我尝试通过此代码使用连接字符串:

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

enter image description here

行是 “connection.ConnectionString = strConnectionString;”从上面。我相信,索引137是连接字符串中最后两个字符,它们是密码中奇怪的字符。

生成并打开这些.MDB文件的“不再支持”应用程序以编程方式连接到它们,因此必须有一种方法。该解决方案已经避开了三天,所以我正在寻求帮助。

+0

你用unicode试过:String strPassword = Encoding.Unicode.GetString(StringData); – Gustav 2015-04-03 09:39:14

+0

我无法重现您的问题。我的C#应用​​程序打开数据库密码为“54BÈ┘”的Access97数据库文件没有问题。但是,我确实必须将连接字符串参数从'; password =54BÈ┘'更改为'; Jet OLEDB:Database Password =54BÈ┘',否则Jet OLEDB认为数据库具有用户级别安全性(ULS)启用和投诉关于找不到工作组信息文件。 – 2015-04-03 11:43:08

+0

Gustav,我试过了,密码变成了中文字符...并且不起作用。 – Pierce 2015-04-03 14:07:20

回答

2

@Pierce Microsoft提供了这些最令人敬畏的规范,其密码字符数取决于Access版本。所以像Rad 2003一样,下面的是14个字符,Access 2007+是20个字符。由于您在示例中使用了22个字符,因此请给这20个字符一个镜头。甜!

+0

杀了我的脸!我们通过转换数据库来重新检查密码,并在2010年打开密码并进行密码的复制/粘贴 - 它工作得很好。事实证明,Access将密码锁定为20个字符,但因为它被屏蔽了,所以从未注册过我。我挖了一个旧的安装'97'和密码的复制/粘贴不起作用!如果你放弃了两个最后的奇怪字符,它确实!它从来没有代码 - 它是一个错误的密码和Access的组合,当我们通过截断粘贴来测试密码的有效性时,抛出一个曲线球。 – Pierce 2015-04-11 12:07:00

+0

SWEET!一方面是布鲁斯基,另一方面是贝贝,并且吸收了一些自然的母亲。 – Malibu 2015-04-20 17:08:34

0

对于那些仍然有这个问题,尽管适当的口令长度(高达14/20个字符),封装撇号内的密码值或转义引号:

"...;Password=\"passwordÈ┘\"" 

"..;Password='passwordÈ┘'"