|
分類:[.NET 全般]
これは先のスレッド C# C++ ? の続きです。 http://bbs.wankuma.com/index.cgi?mode=al2&namber=66239
最初にお問い合わせさせて頂いた内容と異なって来た為に、新しいスレッドとさせて頂きます。 また、沢山の方にご教授頂き、自分では解決したと思っていますが、そのお礼とご報告の為に 以下に記載致します。 大変有り難う御座いました。
CSVファイル同士でのSQL的な結合をやりたいわけですが。 以下のエラーが出力され、質問させて頂きました。 ERROR [07002] [Microsoft][ODBC Text Driver] パラメータが少なすぎます。2 を指定してください。
結果は、データベース自体の内容が間違っている為のエラーでした。 カラム名F1をつけていなかった。 以上、まだSQL文の詳細は理解できていないところがありますが、とりあえず希望通りには なりましたので、あとは自分で調べればokと思ってますので、一応解決とさせて頂きます。 大変有り難う御座いました。
Text1.csv テーブル内容 T1 F1 T1-2 1 佐藤 201 2 吉田 202 3 近藤 203 4 伊藤 204 5 田中 205
Text2.csv テーブル内容 T2 F1 T2-2 1 伊藤 福島県 2 田中 鳥取県 3 近藤 茨城県 4 佐藤 東京都 5 吉田 長野県
処理結果表示 T1,F1,T1-2,T2,F1,T2-2 1,佐藤,201,4,佐藤,東京都 2,吉田,202,5,吉田,長野県 3,近藤,203,3,近藤,茨城県 4,伊藤,204,1,伊藤,福島県 5,田中,205,2,田中,鳥取県
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Data.Odbc; namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
private void button1_Click(object sender, EventArgs e) {
string csvDir = @"C:\tmp"; string csvFileName = "Text1.csv"; string csvFileName2 = "Text2.csv";
//ODBC接続文字列を組み立てる OdbcConnectionStringBuilder builder = new OdbcConnectionStringBuilder(); builder["Driver"] = "Microsoft Text Driver (*.txt; *.csv)"; builder["dbq"] = csvDir; builder["Extension"] = "text;HDR=No;FMT=Delimited\"";
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); sw.Start();
using (OdbcConnection con = new OdbcConnection(builder.ConnectionString)) { con.Open(); //string strSQL = "SELECT T1.* FROM (" + csvFileName + " T1 INNER JOIN " + csvFileName2 + " T2 ON T1.F1=T2.F1)"; string strSQL = "SELECT * FROM (" + csvFileName + " T1 INNER JOIN " + csvFileName2 + " T2 ON T1.F1=T2.F1)";
using (OdbcCommand cmd = new OdbcCommand(strSQL, con)) using (OdbcDataReader rd = cmd.ExecuteReader()) { StringBuilder sb = new StringBuilder(); //カラム名を取得し、カンマ区切りで編集します for (int col = 0; col < rd.FieldCount; col++) { sb.Append(rd.GetName(col)).Append(","); } sb.Remove(sb.Length - 1, 1); System.Diagnostics.Debug.WriteLine(sb);
//データを取得しカンマ区切りで編集します while (rd.Read()) { sb.Length = 0; for (int col = 0; col < rd.FieldCount; col++) { sb.Append(rd.GetValue(col)).Append(","); } sb.Remove(sb.Length - 1, 1); System.Diagnostics.Debug.WriteLine(sb); } } } sw.Stop(); label1.Text = String.Format("完了{0:#,##0}ms", sw.ElapsedMilliseconds); } } }
|