【问题标题】:Using non-ascii characters in connection string password在连接字符串密码中使用非 ASCII 字符
【发布时间】: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


【解决方案1】:

@Pierce Microsoft 根据 Access 的版本对密码中的字符数制定了这些最棒的规范。所以就像 rad 一样,Access 2003 及以下版本是 14 个字符,而 Access 2007+ 是 20 个字符。试一下这 20 个字符,因为您在示例中使用了 22 个字符。甜!

【讨论】:

  • 杀了我的脸!我们通过转换数据库仔细检查了密码,在 2010 年打开它并复制/粘贴密码 - 它工作得很好。事实证明,Access 将密码截断为 20 个字符,但因为它被屏蔽了,所以它从未向我注册过。我挖出了 Access '97 的旧安装,但密码的复制/粘贴不起作用!如果你去掉最后两个奇数字符,它确实如此!它从来都不是代码——它是密码错误和 Access 在我们通过截断粘贴来测试密码的有效性时向我们抛出一个曲线球的组合。
  • 甜!一只手拿着 Brewski,另一只手拿着宝贝,沉浸在大自然中。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    相关资源
    最近更新 更多