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

C# 在连接字符串密码中使用非ascii字符,c#,string,ms-access,connection-string,non-ascii-characters,C#,String,Ms Access,Connection String,Non Ascii Characters,我正在编写一个实用程序来处理一堆旧版Access'97.MDB文件。我需要以编程方式连接到它们,不允许将文件转换为更新版本的Access。到目前为止,没有什么大不了的。大多数密码都有密码保护,但密码真的很奇怪: 我发现让这个字符串作为文本框的默认文本会破坏我的代码。我可以读取密码并将其加载到我表单上的文本框中,代码如下: FileStream Reader = new FileStream(openFileDialog2.FileName, FileMode.Open); byte[] Str

我正在编写一个实用程序来处理一堆旧版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;
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 ");
        }
如果此时我将字符串写入控制台,最后一个字符不会出现,但带有重音标记的capitol E会出现。我通过以下代码使用读取密码生成连接字符串:

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;
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 ");
        }
返回的连接字符串不包含特殊字符:

密码是正确的,因为我可以将其复制/粘贴到access中并打开数据库。当我尝试通过以下代码使用该连接字符串时:

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文件的“不再受支持”应用程序正在以编程方式连接这些文件,因此必须有一种方法来实现。我已经三天没有找到解决方案了,所以我正在寻求帮助。

@Pierce Microsoft针对密码中的字符数制定了这些最棒的规范,具体取决于Access的版本。和rad一样,Access 2003及以下版本为14个字符,Access 2007+版本为20个字符。由于在示例中使用了22个字符,因此请一次拍摄20个字符。好极了

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

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


您是否尝试过unicode:String strPassword=Encoding.unicode.GetString(StringData);我无法重新创建您的问题。我的C#应用程序在打开数据库密码为
54BÈ的Access97数据库文件时没有问题┘。但是,我必须将连接字符串参数从
更改;密码=54BÈ┘
;Jet OLEDB:数据库密码=54BÈ┘
,否则Jet OLEDB认为数据库启用了用户级安全性(ULS),并抱怨找不到工作组信息文件。Gustav,我试过了,密码变成了中文字符…但不起作用。Gord,我将连接字符串的那一部分更改为您发布的内容,并使用了相同的“不符合”上面列出的索引引用错误。我希望您能够使用密码中的相同字符连接Access 97数据库。我想知道我的项目设置是否不正确,或者是否缺少程序集或引用。您在启动项目时是否添加了标准模板以外的内容?你能把你用过的代码贴出来吗?当面杀了我!我们通过转换数据库、在2010年打开数据库并复制/粘贴密码对密码进行了双重检查,结果很好。事实证明,Access将密码截断为20个字符,但由于密码被屏蔽,它从未向我注册。我找到了Access'97的旧安装,密码的复制/粘贴不起作用!但是,如果您删除最后两个奇数字符,它会删除!它从来不是代码——它是一个糟糕的密码和访问的组合,当我们通过截断paste.SWEET来测试密码的有效性时,它给我们带来了一个曲线球!一只手拿着布雷夫斯基,另一只手拿着贝贝,沉浸在大自然中。