読み込み時に、CSVファイルを使用DataReaderのOLEDBジェットデータプロバイダは、どのようにコントロールできま列データか。

StackOverflow https://stackoverflow.com/questions/115658

  •  02-07-2019
  •  | 
  •  

質問

私C#申請を使用しているMicrosoft Jet OLEDBデータプロバイダを読み込むにはCSVファイルです。接続文字列は以下のようなものです:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\Data;Extended Properties="text;HDR=Yes;FMT=Delimited

私は開ADO.NET OleDbConnectionを使用する接続文字列を選択して、CSVファイルからのコマンド:

select * from Data.csv

私は開OleDbDataReaderとつのデータタイプの列を返します、私が何かのスタックしてきましたように、データの種類に基づく最初の行のデータのファイルです。例えば、CSVファイル:

House,Street,Town
123,Fake Street,Springfield
12a,Evergreen Terrace,Springfield

呼び出しのOleDbDataReader.GetDataTypeName方法の欄にすることを明らかにしたカラムは与えられたデータ型"DBTYPE_I4ないように、すべての値から読み取られているとして解釈される整数です。私の問題は、きな文字列が読み込みのハウスの値から次の行のOleDbDataReaderはnullを返します。

どのように伝えられ、ジェットデータベースのプロバイダまたはOleDbDataReaderの解釈カラムを文字列としてではなく数?

役に立ちましたか?

解決

あのスキーマファイルを作成できることを教えてくADO.NET どのように扱うかのCSVに有効な構造です。

してみてください: http://www.aspdotnetcodes.com/Importing_CSV_Database_Schema.ini.aspx

他のヒント

拡大Marcの答えながらプレーする必要がありますの作成と呼ばれるテキストファイルのスキーマ.iniに入れて同じディレクトリとして、CSVファイルです。どのカラムの種類、このファイルが指定可能なファイルの形式は、日付時刻の形式は、地域設定のカラム名だけに含まれていないファイルです。

の例ったのか、仕事のスキーマファイルはこのようになっているでしょう:

[Data.csv]
ColNameHeader=True
Col1=House Text
Col2=Street Text
Col3=Town Text

私もこのデータプロバイダを検討すべての列をファイル以前ようとするように、データの種類

[Data.csv]
ColNameHeader=true
MaxScanRows=0

現実に自分の輸入からデータファイルダの名前、私をスキーマ.iniファイルに書くのと同じディレクトリとして、CSVファイル以前の私の接続用です。

さらに詳細はこちらをご覧ください- http://msdn.microsoft.com/en-us/library/ms709353(VS.85).aspx または検索にMSDN図書館内に"Schema.iniファイル".

ご確認ください

http://kbcsv.codeplex.com/

using (var reader = new CsvReader("data.csv"))
{
    reader.ReadHeaderRecord();
    foreach (var record in reader.DataRecords)
    {
        var name = record["Name"];
        var age = record["Age"];
    }
}

必要なものを書いたスキャンするすべての行を決定するスキーマ.その場合、最初の数は数字の英数字、英数字の細胞が空白にします。

のように ロリー, 私の作成に必要なスキーマ.iniファイルを動的になる方法はありませんprogramaticallyのドライバをスキャンして行った。(の場合はこの限りではありませんのためにexcelファイル)

が必要です MaxScanRows=0 おschema.ini

このコード例:

    public static DataTable GetDataFromCsvFile(string filePath, bool isFirstRowHeader = true)
    {
        if (!File.Exists(filePath))
        {
            throw new FileNotFoundException("The path: " + filePath + " doesn't exist!");
        }

        if (!(Path.GetExtension(filePath) ?? string.Empty).ToUpper().Equals(".CSV"))
        {
            throw new ArgumentException("Only CSV files are supported");
        }
        var pathOnly = Path.GetDirectoryName(filePath);
        var filename = Path.GetFileName(filePath);
        var schemaIni =
            $"[{filename}]{Environment.NewLine}" +
            $"Format=CSVDelimited{Environment.NewLine}" +
            $"ColNameHeader={(isFirstRowHeader ? "True" : "False")}{Environment.NewLine}" +
            $"MaxScanRows=0{Environment.NewLine}" +
            $" ; scan all rows for data type{Environment.NewLine}" +
            $" ; This file was automatically generated";
        var schemaFile = pathOnly != null ? Path.Combine(pathOnly, "schema.ini") : "schema.ini";
        File.WriteAllText(schemaFile, schemaIni);

        try
        {
            var sqlCommand = $@"SELECT * FROM [{filename}]";

            var oleDbConnString =
                $"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={pathOnly};Extended Properties=\"Text;HDR={(isFirstRowHeader ? "Yes" : "No")}\"";

            using (var oleDbConnection = new OleDbConnection(oleDbConnString))
            using (var adapter = new OleDbDataAdapter(sqlCommand, oleDbConnection))
            using (var dataTable = new DataTable())
            {
                adapter.FillSchema(dataTable, SchemaType.Source);
                adapter.Fill(dataTable);
                return dataTable;
            }
        }
        finally
        {
            if (File.Exists(schemaFile))
            {
                File.Delete(schemaFile);
            }
        }
    }

だいくつかの変更る場合にはこの同じディレクトリは、複数のスレッドでも同時に行います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top