在连接字符串密码中使用非ascii字符

时间:2015-04-03 08:20:51

标签: c# string ms-access connection-string non-ascii-characters

我正在编写一个实用程序来处理一堆旧的Access '97 .MDB文件。我需要以编程方式连接到它们,我不允许将文件转换为较新版本的Access。到目前为止,没什么大不了的。他们中的大多数都受密码保护,但密码真的很奇怪:

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

我得到了这个结果:

enter image description here

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

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

2 个答案:

答案 0 :(得分:2)

@Pierce Microsoft根据Access的版本,对密码中的字符数有这些最棒的规范。所以就像rad一样,Access 2003及以下版本是14个字符,Access 2007+是20个字符。因为你在你的例子中使用了22个字符,所以给出20个字符。 SWEET!

答案 1 :(得分:0)

对于那些尽管密码长度正确(最多14/20字符)仍然存在此问题的人,请将密码值封装在撇号或转义引号中:

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

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