9

私はサイトとグーグルを調べましたが、私がやろうとしていることに対する良い解決策を見つけることができなかったようです。

基本的に、クライアントサーバーアプリケーション(C#)があり、サーバーにSQL selectステートメント(SQL Server 2008への接続)を送信し、CSV方式で結果をクライアントに返したいと考えています。

これまでのところ、私は次のものを持っています:

if (sqlDataReader.HasRows)
{
    while(sqlDataReader.Read())
    {
       //not really sure what to put here and if the while should be there!
    }

} `

残念ながら、C#とSQLを接続するのは初めてです。結果をcsv形式の文字列に単純に入れる方法に関するヒントが必要です。列とフィールドが異なる可能性があるため、いくつかのサイトで見たような何か[何か]の方法を使用することはできません。私が理解できるかどうかはわかりませんtbh!

これについてのヒント/ポイントを教えてください!

4

5 に答える 5

16

これは、IDataReader を StreamWriter にダンプするために使用する方法です。私は通常、次のように StreamSwriter を作成しますnew StreamWriter(Response.OutputStream)。入力内の二重引用符文字を単一引用符文字に変換します (これを処理する最良の方法ではないかもしれませんが、私にとってはうまくいきます)。

public static void createCsvFile(IDataReader reader, StreamWriter writer) {
    string Delimiter = "\"";
    string Separator = ",";

    // write header row
    for (int columnCounter = 0; columnCounter < reader.FieldCount; columnCounter++) {
        if (columnCounter > 0) {
            writer.Write(Separator);
        }
        writer.Write(Delimiter + reader.GetName(columnCounter) + Delimiter);
    }
    writer.WriteLine(string.Empty);

    // data loop
    while (reader.Read()) {
        // column loop
        for (int columnCounter = 0; columnCounter < reader.FieldCount; columnCounter++) {
            if (columnCounter > 0) {
                writer.Write(Separator);
            }
            writer.Write(Delimiter + reader.GetValue(columnCounter).ToString().Replace('"', '\'') + Delimiter);
        }   // end of column loop
        writer.WriteLine(string.Empty);
    }   // data loop

    writer.Flush();
}
于 2009-12-26T16:43:08.857 に答える
2

CSV ファイルを扱うときは、通常 FileHelpersライブラリを使用します。このライブラリには、SQL サーバーからレコードを読み取って CSV ファイルに書き込むために使用できるSqlServerStorageクラスがあります。

于 2009-12-26T21:13:33.570 に答える
2

前述のように、区切り記号、文字の正しいエスケープ、さまざまな型の正しい書式設定にはかなりの問題があります。しかし、データを文字列に入れる例を探しているだけなら、さらに別の例があります。前述の合併症のチェックは行いません。

  public static void ReaderToString( IDataReader Reader )
     {
     while ( Reader.Read() )
        {
        StringBuilder str = new StringBuilder();
        for ( int i = 0; i < Reader.FieldCount; i++ )
           {

           if ( Reader.IsDBNull( i ) )
              str.Append( "null" );
           else
              str.Append( Reader.GetValue( i ).ToString() );

           if ( i < Reader.FieldCount - 1 )
              str.Append( ", " );

           }
        // do something with the string here
        Console.WriteLine(str);
        }
     }
于 2009-12-26T16:54:14.450 に答える
1

ここで利用可能なCSVライターの実装を適応させることができる場合があります。

CSVファイルも解析する必要がある場合、ここでの実装は比較的優れています。

CSV形式は、見た目よりも複雑です。特に、クエリから返される任意のデータを処理する場合はそうです。特殊文字(引用符やコンマなど)のエスケープ、改行の処理などを処理できる必要があります。特にC#を初めて使用する場合は、実績のある実装を見つけて使用することをお勧めします。

于 2009-12-26T16:32:51.530 に答える
1

次のようにテーブルの列名を取得できます。

SqlConnection conn = new SqlConnection(connString);
conn.Open();

SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataReader rdr = cmd.ExecuteReader();

DataTable schema = rdr.GetSchemaTable();
foreach (DataRow row in schema.Rows) 
{
    foreach (DataColumn col in schema.Columns)
        Console.WriteLine(col.ColumnName + " = " + row[col]);
}

rdr.Close()
conn.Close();

もちろん、最初の行のみで列名を決定できます。ここでは、すべての行でそれを行います。

独自のコードを挿入して、列を CSV 行に簡単に結合できるようになりました...

ありがとう

于 2009-12-26T16:42:25.833 に答える