tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルcsvのデータを取得したい・・4徹目です(TT)
記事No6655
投稿日: 2007/12/11(Tue) 01:29
投稿者ダダ
初めて書き込みます。VB初心者です。
環境はVB2005 sqlはsqlCEを使っています。
csvからtext型のデータを取得して、データテーブルに格納したいのですが、できません。
データテーブルを開く→テーブルの作成まではできたのですが、
データの挿入でつまずいています。4徹目です(TT)。

お助け下さい・・・
コードを書きます

        ' データベースを開きます。

        Dim cn As SqlCeConnection = New SqlCeConnection( _
         "Data Source=\My Documents\MySqlCeTest.sdf")
        cn.Open()



        ' テーブルを作成します。
        Dim sql As String = "CREATE TABLE csv " & _
        "(単語 nvarchar(100) NOT NULL, " & _
        "意味 nvarchar(100) NOT NULL," & _
        "品詞 nvarchar(100) NOT NULL," & _
        "例文 nvarchar(500) NOT NULL," & _
        "例文意味 nvarchar(500) NOT NULL)"


        Dim cmd As SqlCeCommand = New SqlCeCommand(sql, cn)

        cmd.CommandType = CommandType.Text
        cmd.ExecuteNonQuery()


    ’データの挿入
    sql = "INSERT INTO sdf " & _
        "(単語,意味,品詞,例文,例文意味)

    VALUES
    
    ('i', 'j','k','l','m')"
        

    'cmd.CommandText = sql
        'cmd.ExecuteNonQuery()

この i  j  k  l  m にcsvからデータを取得して挿入したいのですが、

どのようなコードを書けばいいのかまったく分かりません。

お助け下さい。。。      

[ツリー表示へ]
タイトルRe: csvのデータを取得したい・・4徹目です(TT)
記事No6656
投稿日: 2007/12/11(Tue) 01:35
投稿者ダダ
テーブルを作成するコードの一部を間違いました。

間違い

         ' テーブルを作成します。
         Dim sql As String = "CREATE TABLE csv " & _

本当は
         Dim sql As String = "CREATE TABLE sdf " & _

でした。。。

すいません。  

[ツリー表示へ]
タイトルRe^2: csvのデータを取得したい・・4徹目です(TT)
記事No6657
投稿日: 2007/12/11(Tue) 09:02
投稿者じぇふん
順序だてて考えて見ましょう。

1 CSVファイルのオープン
2 CSVファイルの読込
3 (データがなくなるまで繰り返し)
   読み込んだデータを分割
   sql文字列の生成と実行
   次のデータを読み込み
4 CSVファイルのクローズ

基本はこんな感じですよ。

[ツリー表示へ]
タイトルRe^3: csvのデータを取得したい・・4徹目です(TT)
記事No6664
投稿日: 2007/12/11(Tue) 18:06
投稿者ダダ
> 順序だてて考えて見ましょう。
>
> 1 CSVファイルのオープン
> 2 CSVファイルの読込
> 3 (データがなくなるまで繰り返し)
>    読み込んだデータを分割
>    sql文字列の生成と実行
>    次のデータを読み込み
> 4 CSVファイルのクローズ
>
> 基本はこんな感じですよ。

遅レスすいません。
返信ありがとうございます。

頑張ってみます。

明日の夜ごろ、また、書き込みます・・・

[ツリー表示へ]
タイトルcsvのデータを取得したい・・4徹目です(TT)
記事No6754
投稿日: 2008/01/02(Wed) 18:43
投稿者ダダ
> > 順序だてて考えて見ましょう。
> >
> > 1 CSVファイルのオープン
> > 2 CSVファイルの読込
> > 3 (データがなくなるまで繰り返し)
> >    読み込んだデータを分割
> >    sql文字列の生成と実行
> >    次のデータを読み込み
> > 4 CSVファイルのクローズ
> >
> > 基本はこんな感じですよ。

SQLの迷路に迷い込んだ初心者です。
レスが遅くて申し訳ありません。

先日じぇふんさんの助言を得て、コードを書きました。

このコードは、ウィンドウズモバイルで使うデータベース.sdfを
XP上のcsvテキストを元に生成するアプリケーションを目指しています。

以下のコードでデバックしたところ

cmd.excute.nonquery

のところで、例外として排除されてしまいます。
いろいろ調べたのですが、この問題を解決できません。

何か良いアイディアはないでしょうか?



以下コードを書きます。


Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e
                               As System.EventArgs) Handles Button1.Click

        'データベース重複防止

        

   If System.IO.File.Exists("D:\User\ikejiri\testsdf.sdf") Then
            System.IO.File.Delete("D:\User\ikejiri\testsdf.sdf")
        End If




        ' ファイル名で指定したデータベースを作成します。拡張子は SDF です

        Dim eng As SqlCeEngine = New SqlCeEngine( _
            "Data Source=D:\User\ikejiri\testsdf.sdf")
        eng.CreateDatabase()

        ' データベースを開きます。
        Dim cn As SqlCeConnection = New SqlCeConnection( _
            "Data Source=D:\User\ikejiri\testsdf.sdf")
        cn.Open()

        ' テーブルを開きます。
        Dim sql As String = "CREATE TABLE csv " & _
        "(単語 nvarchar(100) NOT NULL, " & _
        "意味 nvarchar(100) NOT NULL," & _
        "品詞 nvarchar(100) NOT NULL," & _
        "例文 nvarchar(500) NOT NULL," & _
        "例文意味 nvarchar(500) NOT NULL)"

        

    Dim cmd As SqlCeCommand = New SqlCeCommand(sql, cn)
        cmd.CommandType = CommandType.Text
        cmd.ExecuteNonQuery()


        'CSVファイルを開いてSDFに挿入する

        '定義

        Dim path As String = "D:\User\ikejiri\sampletext.txt"
        Dim textfile As IO.StreamReader

        Dim line As String

        Dim textarray() As String

        Dim text As string

        

        '開くときの例外排除

        If IO.File.Exists(path) = False Then

            MessageBox.Show("パスミス", "結果")

            Exit Sub

        End If

        'CSVファイル開く

        textfile = New IO.StreamReader(path, System.Text.Encoding.Default)




        Do While -1

            'ラインを一行読む

            line = textfile.ReadLine()

            '読み終わったときの処理

            If line Is Nothing Then
                MessageBox.Show("終わり", "結果")
                Exit Do

            End If

            '一行をカンマで分割’
            textarray = line.Split(",")

            For Each text In textarray 'textarrayの一つ一つの分割textに対して      

                sql = "INSERT INTO csv " & _
                          "(単語,意味,品詞,例文,例文意味) VALUES
                          (text,text,text,text,text)"

                cmd.CommandText = sql

                cmd.ExecuteNonQuery()

            Next

        Loop


        'データベース閉じる
        cn.Close()


        'CSV閉じる
      
      
        textfile.Close()

  
    End Sub

長文申し訳ありません。。。

[ツリー表示へ]
タイトルRe: csvのデータを取得したい・・4徹目です(TT)
記事No6755
投稿日: 2008/01/02(Wed) 18:46
投稿者ダダ

Public Class Form1の前に

Imports System
Imports System.Data
Imports System.Data.SqlServerCe

が抜けていました。

追加します。

[ツリー表示へ]
タイトルRe^2: csvのデータを取得したい・・4徹目です(TT)
記事No6757
投稿日: 2008/01/04(Fri) 15:20
投稿者
VB2005もsqlCEもよく知りませんが一言。

例外エラーが出る
cmd.ExecuteNonQuery()
の直前時点での変数sqlの内容を確認してみるといいですよ。
多分思い描いている内容と違っているはずなので。

[ツリー表示へ]
タイトルRe^3: csvのデータを取得したい・・4徹目です(TT)
記事No6758
投稿日: 2008/01/04(Fri) 16:17
投稿者ダダ
> VB2005もsqlCEもよく知りませんが一言。
>
> 例外エラーが出る
> cmd.ExecuteNonQuery()
> の直前時点での変数sqlの内容を確認してみるといいですよ。
> 多分思い描いている内容と違っているはずなので。

ありがとうございます。
だいぶ勘違いしてました

自己解決しました

一応、共同研究なので、彼らの了承が取れましたらコードを乗せます。

[ツリー表示へ]
タイトル一応の解決と更なる問題
記事No6759
投稿日: 2008/01/04(Fri) 17:46
投稿者ダダ
一応これでエクセルのcsv形式ファイルから、.sdf型のデータが作成できます。

しかし、いざ実行すると最大九行分しかできませんでした。

どうすれば良いか分かりません。

どなたか・・・お助けを・・・・

Imports System.io
Imports System.Data.SqlClient
Imports System.Text
Imports System.data.sqlserverce
Imports System.Data
Imports Microsoft.VisualBasic.FileIO

Public Class Form1
    Public Sub New()

        ' この呼び出しは、Windows フォームデザイナで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。

    End Sub
    Private Function CreateDataTable() As DataTable

        Dim dt As New DataTable
        With dt
            .Columns.Add("単語", Type.GetType("System.String"))
            .Columns.Add("意味", Type.GetType("System.String"))
            .Columns.Add("品詞", Type.GetType("System.String"))
            .Columns.Add("例文", Type.GetType("System.String"))
            .Columns.Add("例文訳", Type.GetType("System.String"))
        End With
        Return dt

    End Function
    Private Function GetZipCodeDataTable(ByVal csvFilePath As String) As DataTable

        Dim dt As DataTable = Me.CreateDataTable
        Dim row As DataRow

        Using sr As New StreamReader(csvFilePath, Encoding.GetEncoding(932))
            Dim strLine As String
            Dim strFields() As String
            strLine = sr.ReadLine()
            While (strLine <> "")
                row = dt.NewRow
                strFields = Split(strLine, ",")
                For i As Integer = 0 To strFields.Length - 1
                    row.Item(i) = strFields(i).Replace("""", "")
                Next
                dt.Rows.Add(row)
                strLine = sr.ReadLine()
            End While
        End Using

        Return dt



    End Function

    Private Sub Button1_Click(ByVal sender As System.Object,
               ByVal e As System.EventArgs) Handles Button1.Click
        
    Dim dt As DataTable = GetZipCodeDataTable("D:\User\nomura\asa100.csv")
        dt.TableName = "kakacsv"
        DataGridView2.DataSource = dt
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object,
               ByVal e As System.EventArgs) Handles Button2.Click
        'sdfの作成
        If System.IO.File.Exists("C:\snapshot\MySqlCe.sdf") Then
            System.IO.File.Delete("C:\snapshot\MySqlCe.sdf")
        End If

        Dim eng As SqlCeEngine = New SqlCeEngine( _
                "Data Source=C:\snapshot\MySqlCe.sdf")
        eng.CreateDatabase()

        Dim cn As SqlCeConnection = New SqlCeConnection( _
                "Data Source=C:\snapshot\MySqlCe.sdf")
        cn.Open()

        Dim sql As String = "CREATE TABLE Customers " & _
               "(単語nchar(200)  NULL, " & _
               "意味nchar(200)  NULL," & _
               "品詞nchar(200)  NULL," & _
               "例文nchar(1000)  NULL," & _
               "例文訳nchar(1000)  NULL)"
        
        Dim cmd As SqlCeCommand = New SqlCeCommand(sql, cn)
        cmd.CommandType = CommandType.Text
        cmd.ExecuteNonQuery()

      
      

        cn.Close()

        Dim cn2 As New SqlCeConnection("Data Source=C:\snapshot\MySqlCe.sdf")
        Dim sqlcm As SqlCeCommand = cn.CreateCommand
        Dim adapter As New SqlCeDataAdapter(sqlcm)
        Dim table As New DataTable

        sqlcm.CommandText = "select * from Customers"
        adapter.Fill(table)

        DataGridView4.DataSource = table
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object,
                              ByVal e As System.EventArgs) Handles Button3.Click
        'バルクコピー
      
        Using bc As New SqlBulkCopy("Data Source=KIS-C01;
                           Initial Catalog=SQLMobile;Integrated Security=True")

            With bc
                .DestinationTableName = "NAKAMURA"

                Dim dt As DataTable =
                               GetZipCodeDataTable("D:\User\nomura\asa100.csv")

                .WriteToServer(dt)

            End With
        End Using

    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object,
                              ByVal e As System.EventArgs) Handles Button4.Click

      
        'バルク後のgrid表示
        Dim cn2 As New SqlConnection("Data Source=KIS-C01
                 ;Initial Catalog=SQLMobile;Integrated Security=True")
        Dim sqlcm2 As SqlCommand = cn2.CreateCommand
        Dim Adapter As New SqlDataAdapter(sqlcm2)
        Dim Table As New DataTable

        sqlcm2.CommandText = "SELECT * FROM NAKAMURA"
        Adapter.Fill(Table)

        DataGridView3.DataSource = Table

        Table.Dispose()
        Adapter.Dispose()
        sqlcm2.Dispose()
        cn2.Dispose()

    End Sub

  

    Private Sub Button5_Click(ByVal sender As System.Object,
                           ByVal e As System.EventArgs) Handles Button5.Click

        'Dim cn As New SqlCeConnection("Data Source=C:\snapshot\MySqlCeTest.sdf")
        'Dim sqlcm As SqlCeCommand = cn.CreateCommand
        '入れ子
        Dim dt As DataTable = DirectCast(DataGridView4.DataSource, DataTable)

        Dim xx, yy As Integer

        Dim db As New SqlConnection("Data Source=KIS-C01
                           ;Initial Catalog=SQLMobile;Integrated Security=True")
        Dim cmnd As SqlCommand = db.CreateCommand
        cmnd.CommandText = "SELECT * FROM NAKAMURA"
        db.Open()

        Dim dbrd As SqlDataReader
        dbrd = cmnd.ExecuteReader()

        'For xx = 0 To dbrd.FieldCount - 1
        'DataGridView4.Columns.Add("単語" & xx + 1, dbrd.GetName(xx))
        'Next




        yy = 0
        Do While dbrd.Read

            dt.Rows.Add()
            For xx = 0 To dbrd.FieldCount - 1

                DataGridView4.Item(xx, yy).Value = dbrd(xx).ToString()
            Next
            yy = yy + 1
        Loop

        db.Close()





        







        'dasiko
        ' Dim Table As DataTable = DirectCast(DataGridView3.DataSource, DataTable)


        ' Dim row As DataRow

        ' row = dt.NewRow
        ' Dim i As Integer
        ' i = 2

        'For i = 0 To 3



        ' dt.Rows(0)(1) = Table.Rows(i)("意味")
        ' row(1)("単語") = Table.Rows(m)("意味")


        '        Console.WriteLine(row(i)("単語"))
        ' dt.Rows.Add(row)
        DataGridView1.DataSource = dt



        ' Next i




        'For Each Row As DataRow In Table.Rows

        'Dim SQL As String = ""
        'Select Case row.RowState
        'Case DataRowState.Added

        ' Sql = "INSERT INTO Customers VALUES ("
        ' Sql &= row("単語") & ", "
        ' Sql &= "'" & row("品詞") & "', "
        'Sql &= "'" & row("意味") & "', "
        ' S() 'ql &= row("例文") & ", "
        'Sq() 'l &= "'" & row("例文訳") & "' "
        'Sql() ' &= ")"
        '
        '           Case Else
        '      Continue For

        '     End Select
        '    sqlcm.CommandText = Sql


        'sqlcm.ExecuteNonQuery()
        ' cn.Close()


        ' Next
        'Table.Dispose()
        'sqlcm.Dispose()
        ' cn.Dispose()
    End Sub


    Private Sub Button6_Click(ByVal sender As System.Object,
                           ByVal e As System.EventArgs) Handles Button6.Click

        Dim cn2 As New SqlCeConnection("Data Source=C:\snapshot\MySqlCe.sdf")
        Dim sqlcm As SqlCeCommand = cn2.CreateCommand
        Dim Table As DataTable = DirectCast(DataGridView4.DataSource, DataTable)

        For Each Row As DataRow In Table.Rows

            Dim SQL As String = ""

            Select Case Row.RowState
                Case DataRowState.Added
                    SQL = "INSERT INTO Customers VALUES ("
                    Sql &= "'" & Row("単語") & "', "
                    SQL &= "'" & Row("意味") & "', "
                    SQL &= "'" & Row("品詞") & "', "
                    Sql &= "'" & Row("例文") & "', "
                    Sql &= "'" & Row("例文訳") & "'"
                    Sql &= ")"


                Case Else
                    Continue For

            End Select




            sqlcm.CommandText = Sql

            cn2.Open()
            sqlcm.ExecuteNonQuery()
            cn2.Close()
        Next
        Table.Dispose()
        sqlcm.Dispose()
        cn2.Dispose()

        
      
    End Sub
End Class

[ツリー表示へ]