1

この質問では、Microsoft Indexing Services ( Dialect 2 ) と、C#/.NET プログラムのCisso.dll 相互運用ライブラリIixssoQuery インターフェイスを使用しています。

インデックスにはvt_i8データ型 (8 バイト)として定義された列がありますCreateRecordSetが、相互運用ライブラリのメソッドは常に 4 バイト整数の数値列を持つ RecordSet を返し、2,147,483,648 の範囲制限を超えるものは切り捨てます。

理想的には、相互運用ライブラリから C# System.Int32 (4 バイトlong) の代わりに C # System.Int64 (8 バイト) をプルする必要があります。int

次のコード サンプル (主にジョグ メモリに提供) は、Cisso.dll を使用してレコードセットを取得し、DataTable に入力して、切り捨てられた整数でデータ テーブルを返します。

CissoQueryClass cqc = new Cisso.CissoQueryClass();
RecordSet rs = new RecordSet();
cqc.Columns = "Rank, DocTitle, VPath, Filename, Characterization,Write";
// ... setup ...
var myDs = new DataSet();
oldDbAdapter.Fill(myDs, cqc.CreateRecordSet("nonsequential"), "IXResults");
return myDs;

cqcを試しました。DefineColumn(..)メソッド、データ型で遊ぶなどがありますが、役に立ちません-切り捨てられた整数の動作に変化は見られません。

この整数の切り捨てが CISSO 相互運用ライブラリの制限なのか、それともより大きな整数値を取得できるのか、その方法がわからないだけなのかを知りたいです。

このあたりの誰かが同様の問題に遭遇したに違いないと確信しています。今回のインターネットのグーグル検索は、詳細が非常に不足しています。


インデックス内のデータに基づいて回避策を見つけました。別の文字列フィールドから必要なものを取得し、そこから数値を解析することができます。理想的ではありませんが、回避策です。

4

1 に答える 1

0

ええ、私はあなたのように立ち往生しています。OLE DB 列の最大長は 32 ビット (oledb.h) の ULONG のようですが、ixsso 実装は符号付きとして扱います。最初に、VS のデータベース接続にデータソースをマウントすることで、テーブル スキーマを取得できると考えました。そのとき、検索の「カスタム」クエリ機能を発見しました。そのルートはこれで終わりです。

次に、.net RCW を実装までたどってみましたが、ixsso.dll のデバッグ シンボルが見つからなかったため、診断するのに十分な小さな asm ブロックを取得できませんでした。

最良の推測は、DefineColumns (生の COM インターフェイス) 機能が値を基になるスキーマ ストアに制限しており、それに対してできることは何もないということです。これは、あなたがすでに推測したものであり、同様の理由からです。

幸運を。申し訳ありませんが、これをクラックできませんでした。値下げは嬉しいけど……。

于 2011-03-09T20:38:20.623 に答える