- PR -

ExcelデータのDB取り込み処理について

投稿者投稿内容
真空牙
会議室デビュー日: 2004/09/01
投稿数: 9
投稿日時: 2004-09-17 18:15
いつも参考にさせてもらっております。

C#.netでwebアプリを作成しております。
ExcelをDBに保存するプログラムで行き詰まっております。
byte配列に格納し、SQLにてInsert処理を行っているのですが、
保存できるデータと、できないデータがあり、その区別がわからない状況です。

以下ソース---------------------------
objInfile:HtmlInputFileのコントロールです

System.IO.Stream ioStream;
ioStream = objInfile.PostedFile.InputStream

// ファイルを読み込むバイト型配列を作成する
byte[] bs = new byte[ioStream.Length];

// ファイルの内容をすべて読み込む
ioStream.Read(bs, 0, bs.Length);

------------------------------------

上記で取得したデータをblod型のフィールドスペースにセットしています。

ODBCCommand.CommandText でSQL文を発行
ODBCCommand.Parameters.add で指定のフィールドにbyte配列をセット
ODBCCommand.ExecuteNonQuery で実行

byte配列化した時にデータの破損がおこっているのでしょうか?
もし、ご存知の方がいらっしゃればお教えいただきたいのですが。
よろしく御願い致します。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2004-09-17 18:49
[HOW TO] Visual C# .NET で ADO.NET を使用した BLOB データの読み取りと書き込みの方法
にSqlCommandBuilderを使う方法があります。


http://www.google.com/search?q=C%23+ADO.NET+BLOB&lr=lang_ja
真空牙
会議室デビュー日: 2004/09/01
投稿数: 9
投稿日時: 2004-09-17 20:58
回答ありがとうございます。

ご指示いただいたページのプログラムも一通り目を通しており
実践済みですが、やはり取り込めない状況です。
あれこれ探してロジックを簡潔にした結果が、提示しているソースです。

全てが取り込めないならまだあきらめもつきますが、
取り込めるものとできないものがあるというのが
原因がわからず困っています。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2004-09-17 21:47
真空牙さん、こんばんは。

引用:

全てが取り込めないならまだあきらめもつきますが、
取り込めるものとできないものがあるというのが
原因がわからず困っています。


そういう場合はどういう条件でOK/NGの違いが出るのか、ステップ実行でじっくり追い込んでいきましょう。
ところで、取り込めない、というのはエラーが出たりとかするんですか?
真空牙
会議室デビュー日: 2004/09/01
投稿数: 9
投稿日時: 2004-09-18 00:08
回答ありがとうございます。
ステップ実行も行っていますが・・・データの値を増減させてbyte数を
変えてみたり、オブジェクト貼ってみたりと。

ですが、byte数が小さくても取り込めなかったり、大きくても
取り込めたりとなっています。

ちなみにエラーはログをはくようにしていて

System.Data.Odbc.OdbcException: ERROR [42000] [MySQL][ODBC 3.51 Driver][mysqld-4.0.20a-nt]You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'ュI・ー.、)\0\0X\0\0\0\0\0\0・0\0\0\0\r
とっと
大ベテラン
会議室デビュー日: 2004/03/25
投稿数: 197
投稿日時: 2004-09-18 02:08
こんばんは。

Excelのデータがおかしい場合はどうでしょう?

僕はDataSetにあるテーブルのキーになる値が入ったExcelのデータを取り込んで、その中のDataTableをループさせて対象のテーブルにその値をWhere条件にしてSQLを発行してデータを取得しました。その過程でキーになるフィールドにあわせてCtypeでString型に変換したんですけど、Excelのデータがおかしいレコードについては中身がVBNullになっていてStringに変換する段階でエラーになってました。
未記入
会議室デビュー日: 2004/09/18
投稿数: 1
投稿日時: 2004-09-18 14:32
えーっと、Excel用のODBCドライバの仕様で、複数の行からなるレコードで、同一の
列で文字列として認識できる行(レコード)と、数字として認識できる行が混在して
いると、その列が文字列なのか、数字なのかは多数決で決定されます。

そしてここからが問題なのですが、多数派は問題なくデータが取り出せますが、
少数派のデータはnullになります。つまり、例をあげると、A列で、10個のセル
の値がA、9個のセルの値が1であった場合、9個のセルは値1が取り出せるのではなく、
nullとなります。

これはMSの仕様ですので、回避策はありません。データソースとしてはExcel
ではなく、Accessを使うべきです。Accessならこの問題はありません。
とっと
大ベテラン
会議室デビュー日: 2004/03/25
投稿数: 197
投稿日時: 2004-09-18 16:14
引用:

未記入さんの書き込み (2004-09-18 14:32) より:

これはMSの仕様ですので、回避策はありません。データソースとしてはExcel
ではなく、Accessを使うべきです。Accessならこの問題はありません。




こんにちは。

まあ、確かにそうなのかもしれませんが、この場合はExcelでやる事に意味があるので、少数派のデータが読み込まれた時の対処をしてあげればいいんではないでしょうか?ユーザーの要求がExcelのデータのインポートであるのかもしれませんし・・・。

例えば、取り込めなかったデータを取り込める部分だけでもDataTableに格納してDataGrid上でユーザーに修正してもらってから登録するとか・・。

スキルアップ/キャリアアップ(JOB@IT)