忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

VB.NET:ADO.NETを使用したSQL-ServerのテーブルのCSV出力
ADO.NET を使用した SQL-Server のテーブルをCSVファイルに出力する簡単な関数を作成してみました。

CSVファイルを作成する関数への引数は、データベース名とデータソース名と、SQL文、それとCSVファイル名とCSV内のカラムヘッダを 出力するかのフラグになります。

CSV出力処理関数内では SQL-Server への接続をオープンし、指定されたSELECT文を実行します。 SELECT文の結果の行が在れば、1行づつデータを取得します。 初回の行の処理の場合には、リーダーオブジェクトからカラム名を取得しヘッダ行を書き込みます。 その後、各データ行をCSVファイルに書き込みます。 CSVの各データは強制的にダブルクォートで囲む様にしていますので、 データ内のダブルクォートはエスケープ処理しています。

Public Class Form1
    'フォーム上に張り付けたボタンでの処理
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        SqlToCsv("TEST", ".\SQLEXPRESS12", "SELECT * FROM TEST1 ORDER BY CODE", "TEST.CSV", True)
    End Sub

    ''' <summary>指定SQL文のCSVファイル出力</summary>
    ''' <param name="Database">データベース名</param>
    ''' <param name="DataSource">データソース名</param>
    ''' <param name="SQL">SELECT文</param>
    ''' <param name="CsvFilePath">CSVファイルパス</param>
    ''' <param name="fHeader">カラムヘッダ出力指示</param>
    Private Sub SqlToCsv(ByVal Database As String, ByVal DataSource As String, ByVal SQL As String, _
                         ByVal CsvFilePath As String, ByVal fHeader As Boolean)
        'CSVファイル書込Encoding(Shift-JIS)
        Dim Enc As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS")
        'CSVファイルオープン
        Dim SWrt As New System.IO.StreamWriter(CsvFilePath, False, Enc)

        'SQL-Server接続文字列
        Dim DBConnection As String = "Persist Security Info=false;Integrated Security=SSPI;" & _
            "Database=" & Database & ";Data Source=" & DataSource & ";"
        'SQLコネクションクラス
        Dim Conn As New System.Data.SqlClient.SqlConnection(DBConnection)
        Conn.Open()
        'コマンドオブジェクト
        Dim Cmd As New System.Data.SqlClient.SqlCommand(SQL, Conn)

        'TESTデータ取得(リーダーオブジェクト)
        Dim Reader As System.Data.SqlClient.SqlDataReader = Nothing
        Reader = Cmd.ExecuteReader()
        '読込行数が存在??
        If Reader.HasRows Then
            Dim fFirst As Boolean = True
            '読込
            While Reader.Read() = True
                If fHeader = True And fFirst = True Then
                    fFirst = False
                    Dim ColName As String = ""
                    'カラム数分の処理
                    For i As Integer = 0 To Reader.FieldCount - 1
                        'カラム名取得し、ダブルクォートで囲む
                        ColName = SuroundDblQuotes(Reader.GetName(i))
                        'カラム名書込
                        SWrt.Write(ColName)
                        'カンマ書込
                        If i < Reader.FieldCount - 1 Then
                            SWrt.Write(","c)
                        End If
                    Next
                    '改行書込
                    SWrt.Write(vbCrLf)
                End If

                Dim ColData As String = ""
                For i As Integer = 0 To Reader.FieldCount - 1
                    'データ取得し、ダブルクォートで囲む
                    ColData = SuroundDblQuotes(Reader.GetValue(i).ToString())
                    'データ書込
                    SWrt.Write(ColData)
                    'カンマ書込
                    If i < Reader.FieldCount - 1 Then
                        SWrt.Write(","c)
                    End If
                Next
                '改行書込
                SWrt.Write(vbCrLf)
            End While
        End If
        'CSVファイルクローズ
        SWrt.Close()
        'クローズ
        Conn.Close()
    End Sub

    ''' <summary>文字列をダブルクォートで囲む</summary>
    Private Function SuroundDblQuotes(ByVal str As String) As String
        If str.IndexOf(""""c) > -1 Then
            '文字列をダブルクォートをダブルクォートでエスケープ
            str = str.Replace("""", """""")
        End If
        Return """" & str & """"
    End Function

尚、今回のテーブルは以下の生成文で生成しました。
CREATE TABLE TEST1 (
   CODE  VARCHAR(8) NOT NULL
  ,DATA1 VARCHAR(16)
  ,DATA2 VARCHAR(16)
  ,DATA3 VARCHAR(16)
  ,CONSTRAINT TEST1_PKC PRIMARY KEY (CODE)
);
INSERT INTO TEST1 VALUES('00000001', 'A000001', 'BBBBBB1', 'C001');
INSERT INTO TEST1 VALUES('00000002', 'A000002', 'BBBBBB2', 'C002');
INSERT INTO TEST1 VALUES('00000003', 'A000003', 'BBBBBB3', 'C003');
INSERT INTO TEST1 VALUES('00000004', 'A000004', 'BBBBBB4', 'C004');

結果的にCSVファイル内容は以下の様になります。
"CODE","DATA1","DATA2","DATA3"
"00000001","A000001","BBBBBB1","C001"
"00000002","A000002","BBBBBB2","C002"
"00000003","A000003","BBBBBB3","C003"
"00000004","A000004","BBBBBB4","C004"


=====
2016/03/22:の時の情報











PR

コメント

コメントを書く