ユーザーにとって使いやすくするために、アクセスで多値を使用したいと思います。
しかし、それをC#に読み込むとoledb
、最初の値とそれに続くガベージを使用columnname.value
すると、まったく同じデータの複数の行が取得され、その列だけが異なるため、無駄に思えます。
より良い方法はありますか?
複数の値がSQLでもOracleでもサポートされていないことは知っていますが、ユーザーにとってははるかに簡単になるので、可能であればそれを維持したいと思います。
ユーザーにとって使いやすくするために、アクセスで多値を使用したいと思います。
しかし、それをC#に読み込むとoledb
、最初の値とそれに続くガベージを使用columnname.value
すると、まったく同じデータの複数の行が取得され、その列だけが異なるため、無駄に思えます。
より良い方法はありますか?
複数の値がSQLでもOracleでもサポートされていないことは知っていますが、ユーザーにとってははるかに簡単になるので、可能であればそれを維持したいと思います。
より良い方法はありますか?
はい:ODBC。
複数値を持つフィールド (Access の "ルックアップ ウィザード" によって作成された) の処理に関してOdbc
は、実際よりも優れているように見えOleDb
ます。[multiValueTest] という名前のテーブルのテスト データの場合
+----+-------------+------------+
| ID | Description | Attributes |
+----+-------------+------------+
| | | attribute1 |
| 1 | foo | attribute2 |
| | | attribute4 |
+----+-------------+------------+
クエリ
SELECT Attributes FROM multiValueTest WHERE ID=1
オブジェクトによって取得されると、実際にガベージ文字が返されOleDbDataReader
ます。
ただし、OdbcDataReader
オブジェクトによって取得された同じクエリ、具体的には
using (OdbcConnection con = new OdbcConnection())
{
con.ConnectionString =
@"Driver={Microsoft Access Driver (*.mdb, *.accdb)};" +
@"Dbq=C:\Users\Public\Database1.accdb;";
con.Open();
using (OdbcCommand cmd = new OdbcCommand())
{
cmd.Connection = con;
cmd.CommandText = "SELECT Attributes FROM multiValueTest WHERE ID=1";
OdbcDataReader rdr = cmd.ExecuteReader();
rdr.Read();
Console.WriteLine(rdr[0]);
rdr.Close();
}
con.Close();
}
このような単一の文字列値を返します
attribute1;attribute2;attribute4
これは、セミコロン ( ;
) 文字で分割され、適切に処理されます。
長くなりましたが、この問題は解決しましたか?MultiValue データベースは、多値属性にデータを格納できますが、格納する必要はありません。
1 つのオプションは、エクスポートの前に BASIC を使用して DBMS のデータを正規化し、リレーショナル ツール (ADO.NET など) で理解できるフラットな形式で新しい作業ファイルに書き込むことです。
DBMS からデータを抽出するために使用するツールによっては、多値レコードをデータセットに正規化する機能が既にある場合があります。このようなツールの例には、ユニバースおよびユニデータ用の UniObjects または U2.NET Toolkit、D3 および mvBase 用の MVSP、QM 用の QMClient、およびすべての MV プラットフォーム用の MVSP が含まれます。
複数値をエクスポートする必要がある場合は、値マーク (xFD) で単純な分割を実行し、それらを string[] または List に変換できます。
おっしゃるとおり、RDBMS/SQL ツールは複数の値をサポートしていません。したがって、そのデータをリレーショナル/正規化された形式に移動するには、データを複製して複数のレコードを作成するか、別のテーブルを作成して外部キーで結合する必要があります。これは、さまざまな製品が MV をリレーショナルに見せるために使用する手法の 1 つです。たとえば、その顧客の電話ごとに 1 つのレコードを持つ CustomerPhones テーブルを指す Customer レコードがあります。元は、単一の Customer レコード内の単なる複数値でした。
msdatashape プロバイダーを使用します。これにより、; 区切りリスト。接続文字列の例: Provider=MsDataShape;Data Provider=Microsoft.ACE.OleDb.12;Data Source=(Your Path)