2016-07-25 8 views
0

C#を使用してスタンドアロンのアプリケーション開発を試しています。私はCSVファイルのデータをSQL Serverデータベースにコピーしたいと思っていますが、それは他のものと思われます。私は一日中この問題が発生しています。誰かが私を助けてください。C#を使用してCSVファイルのデータをSQL SERVERにコピーしたい。

StreamReader sr = new StreamReader(@filePath); 
     string line = sr.ReadLine(); 
     string[] value = line.Split(','); 
     DataTable dt = new DataTable(); 
     DataRow row; 

     foreach (string dc in value) 
     { 
      dt.Columns.Add(new DataColumn(dc)); 
     } 

     while (!sr.EndOfStream) 
     { 
      value = sr.ReadLine().Split(','); 
      if (value.Length == dt.Columns.Count) 
      { 
       row = dt.NewRow(); 
       row.ItemArray = value; 
       dt.Rows.Add(row); 
      } 
     } 

     using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn)) 
     { 
      conn.Open(); 
      bulkCopy.DestinationTableName = "receipts"; 
      foreach (var column in dt.Columns) 
      { 
       bulkCopy.ColumnMappings.Add(column.ToString(), column.ToString()); 
       //MessageBox.Show(column.ToString()); 
      } 
      bulkCopy.WriteToServer(dt); 
      bulkCopy.Close(); 
      conn.Close(); 
     } 

私のコードにはどのような問題がありますか?

+0

どのようなエラーが表示されますか? –

+2

私には分かりませんが、何が問題なのですか?間違いはありますか?予想外の結果ですか?それとも全く違うの? – HoneyBadger

+0

エラーまたは例外はスローされません。何もしません –

答えて

0

私はついにこの問題を解決しました。すべてが完璧です!回答を遅く投稿して申し訳ありません。私がしたのは、forループを使用してデータテーブルからデータを読み取り、データベースに挿入することでした。

ここにコードがあります。

  StreamReader sr = new StreamReader(@filePath); 
      string line = sr.ReadLine(); 
      string[] value = line.Split(','); 
      DataTable dt = new DataTable(); 
      DataRow row; 

      foreach (string dc in value) 
      { 
       dt.Columns.Add(new DataColumn(dc)); 
      } 

      while (!sr.EndOfStream) 
      { 
       value = sr.ReadLine().Split(','); 
       if (value.Length == dt.Columns.Count) 
       { 
        row = dt.NewRow(); 
        row.ItemArray = value; 
        dt.Rows.Add(row); 
       } 
      } 

      dgv.DataSource = dt; 

      conn.Open(); 
      for (int i = 0; i < dt.Rows.Count; i++) 
      { 

       SqlCommand command = new SqlCommand("INSERT INTO [receipts] ([fullname], [state], [regno], [dept], [year], [session], [amount], [date], [faculty], [bank], [jamb]) VALUES('" + dt.Rows[i][1].ToString() + "', '" + dt.Rows[i][2].ToString() + "', '" + dt.Rows[i][3].ToString() + "', '" + dt.Rows[i][5].ToString() + "', '" + dt.Rows[i][6].ToString() + "', '" + dt.Rows[i][7].ToString() + "', '" + dt.Rows[i][8].ToString() + "', '" + dt.Rows[i][9].ToString() + "', '" + dt.Rows[i][10].ToString() + "', '" + dt.Rows[i][11].ToString() + "', '" + dt.Rows[i][4].ToString() + "')", conn); 
       command.ExecuteNonQuery(); 

      } 
      conn.Close(); 
-1

//ファイルがそれにのみ単一のラインを持っているかどうかを確認してください.......そのような場合には、その後のStreamReaderは唯一の楽しみであり、あなたが

...その行から値を既に受けているとして
while (!sr.EndOfStream) 
    { 

前の行を読み取ることはできません。StreamReaderは、前方のみのタイプの読み取り専用です。あなたが行を読むときに戻ることはできません。

エラーはここである: (あなたのファイルは、単一の行を持っている場合)

StreamReader sr = new StreamReader(@filePath); 
    string line = sr.ReadLine(); 

//これが唯一の...ポインタが)最後
文字列ライン= sr.ReadLine(である前進です。今

//、ここでこれはSRがすでにnullであるとして...叶うことは決してありません...だから、何も実際にデータテーブルの行

while (!sr.EndOfStream) 
    { 

Check the value of sr...its coming null

され、前の値を保持するために行きません一時変数を読み込んだり、内容全体をコレクションに読み込んだり、いくつかの区切り文字でそれを分割することができます。

sr.EndOfStreamの値がtrueかfalseかを確認します。

+0

' EndOfStream' *をチェックするのは、読者からより多くのデータを読むことができるかどうかをチェックする正しい方法です。それはエレガントではないかもしれません(例えば、ReadLineの結果をチェックすることはコードを少なくし、 'ReadLines'はすべてこれをイテレータでラップします)。何とかそれがストリームの最後まで読んでいると思いましたか?または、それを 'ReadToEnd'と混同しましたか? –

+0

あなたは何を話しているのかわからない.....私はこのコードを書いたことも何も混乱していない。これは誰かによって投稿されています。ストリームリーダーが既にストリームの最後にあるというエラーを指摘しました。StreamReader sr = new StreamReader(@filePath); 文字列line = sr.ReadLine();現在中断しています(!sr.EndOfStream) { var readLine = sr.ReadLine(); srが既にnullであるため、決して真ではありません。 –

+0

あなたはそれがストリームの最後にあると思いますか?ファイルに10行がある場合、最初の 'ReadLine'は* first *行だけを読み込みます。そして 'sr.EndOfStream'は決してnullにはなりません - それはtrueかfalseのブール値です。 –

関連する問題