3

私は使用しています:

  • アドバンテージ データベース サーバー 10
  • Advantage.Data.Provider.dll (v.9.10.2.9)

すべてがほとんどのワークステーションで非常に安定して動作しますが、今日、新しい顧客の 1 人が、私たちのアプリで問題が発生したと報告しました。ログには、次のストレージ例外が表示されます。

System.ArgumentException: 接続文字列のプロパティ 'ユーザー ID' が認識されません。Advantage.Data.Provider.AdsConnectionStringHandler.ParseConnectionString(String strConnect) で Advantage.Data.Provider.AdsPoolManager.GetConnection(String strConnectionString, AdsInternalConnection& internalConnection, AdsConnectionPool& pool) で Advantage.Data.Provider.AdsConnection.Open()

同じコードが他のすべての顧客で問題なく機能するようになるとすぐに、問題は実行環境に関連している可能性があると思いますが、この問題の正確な原因を突き止めようとしています.

何か案は?

アップデート

Advantage.Data.Provider.dllコードを調べたところHashtable、接続文字列のプロパティと一致させるために a を使用していて、Hashtableの初期化が少し奇妙に見えることがわかりました。

public static Hashtable CreateCaseInsensitiveHashtable()
{
  return new Hashtable((IEqualityComparer) StringComparer.CurrentCultureIgnoreCase);
}

ここで問題が発生するStringComparer.CurrentCultureIgnoreCase可能性がありますが、確認する必要があります。

4

2 に答える 2

3

これは、クライアントのバージョン9.10.0.21以降で修正されています。ダウンロードリンクのあるページから:

2-一部のロケール(具体的にはtr-TR)で接続文字列が正しく解析されない原因となっていたAdvantage.NETデータプロバイダーのバグを修正しました。

于 2012-08-17T15:48:08.583 に答える
1

ああ、年StringComparer.CurrentCultureIgnoreCaseが問題でした。のバグのようAdvantage.Data.Provider.dllです。StringComparer.InvariantCultureIgnoreCase代わりに を使用する必要があります。次のコードは問題を示しています。

foreach (var culture in CultureInfo.GetCultures(CultureTypes.AllCultures))
{
    Thread.CurrentThread.CurrentCulture = culture;
    Thread.CurrentThread.CurrentUICulture = culture;

    var isEquals = StringComparer.CurrentCultureIgnoreCase
                                 .Compare("user id", "User ID") == 0;

    if (!isEquals)
        Console.WriteLine("culture: {0}; equals: {1}", culture.Name, isEquals);
}

出力が得られます。

culture: tr; equals: False
culture: az; equals: False
culture: tr-TR; equals: False
culture: az-Latn-AZ; equals: False
culture: az-Latn; equals: False

回避策は簡単です -User ID接続文字列で使用します。システムに現在どの文化が設定されているかを顧客に尋ねます。

アップデート

顧客は、彼がトルコの文化を持っていることを確認しました.

于 2012-08-17T11:18:50.753 に答える