Kobarin's Development Blog

C#やASP.NET、公開APIなどについての記録です。

CSVファイルのデータをSQLserverにインポート(TextFieldParser編)

    string strPath = "c:\test.csv";

    DataTable dt = new DataTable();


    //Shift JISで読み込む
    using (Microsoft.VisualBasic.FileIO.TextFieldParser tfp = new Microsoft.VisualBasic.FileIO.TextFieldParser(strPath, System.Text.Encoding.GetEncoding(932)))
    {
      //フィールドをが文字で区切るか。デフォルトでDelimited。
      tfp.TextFieldType = FieldType.Delimited;
      //区切り文字を「,」
      tfp.Delimiters = new string { "," };
      //フィールドを「"」で囲み、改行・区切り文字を含めるか。デフォルトでtrue。
      tfp.HasFieldsEnclosedInQuotes = true;
      //フィールドの前後のスペースを削除。デフォルトでtrue。
      tfp.TrimWhiteSpace = true;

      //先頭行を読み込み、列を定義
      string fields = tfp.ReadFields();
      foreach (string field in fields)
      {
        switch (field)
        {
          case "商品名":
            dt.Columns.Add(field, Type.GetType("System.String"));
            break;
          case "単価":
            dt.Columns.Add(field, Type.GetType("System.Int32"));
            break;
          default:
            dt.Columns.Add(field, Type.GetType("System.String"));
            break;
        }
      }

      //2行目から、値を読み込む
      while (!tfp.EndOfData)
      {
        string[] values = tfp.ReadFields();   //値を読み込む
        dt.Rows.Add(values);
      }

      tfp.Close();
    }

    //DBへ1行ずつ取込み
    using (SqlConnection cn = new SqlConnection(strCon))
    {
      cn.Open();

      for (int r = 0; r < dt.Rows.Count; r++)
      {
        using (SqlCommand cmd = cn.CreateCommand())
        {
          cmd.CommandText = @"
insert into Table1 ([商品名],[単価]) values (@name, @tanka)";
          cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value = dt.Rows[r]["商品名"];
          cmd.Parameters.Add("@tanka", SqlDbType.Int).Value = dt.Rows[r]["単価"];
          cmd.ExecuteNonQuery();
        }
      }
      cn.Close();
    }