C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: OledBで取り込んだExcelデータのNull値について


(過去ログ 30 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■14588 / inTopicNo.1)  OledBで取り込んだExcelデータのNull値について
  
□投稿者/ まぐねしうむ (9回)-(2008/02/22(Fri) 13:24:45)

分類:[.NET 全般] 

いつもお世話になっております。

現在ExcelのデータをMDBに取り込むルーチンを作成しています。
そこで、質問なのですがEXCELからSELECT文でデータを取得しているのですが
エクセル側の空白の時にどの様な値が入っているか確認したいのですが分かりません。

お手数ですが教えていただけないでしょうか?

//指定したExcelのデータをDataSetに取り込む
string sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + ofd.FileName + "; Extended Properties=Excel 8.0;";
string cmd = "SELECT  * FROM [ユーザ情報$]";
dsExcel = ReadData(sConnectionString, cmd, "UserInfo", "UserData");

 //全てのデータを調査する
for (int i = 0; i <= intTotalRecoard - 1; i++)
{
  try
  {
    //行を代入
    dr = ds.Tables[0].Rows[i];

    //列を探索する
    for (int Col = 0; Col <= Cols - 1; Col++)
    {
    if ((dr[Col].ToString() != "") || (dr[Col].ToString() != null))
    {
      //パラメータを登録
      listPara.Add(dr[Col].ToString());
    }
    else
    {
       listPara.Add(null);
    }
  }

  //SQLコマンドを作る
  sqlCmd = makeNewAddCmd(listPara);
}


//DB追加用のコマンドを作成する
private string makeNewAddCmd(List<string> Datas)
{
  StringBuilder sb = new StringBuilder();
  string para = "'";

  //コマンド部
  sb.Append("INSERT INTO UserData ( UserID, Pass, RegistDate, Family, Name, Fami_Furi, Name_Furi, Birth, Sex, ZipCode, Area, TEL, Mobile, E_Mail, OptionMsg ) VALUES ('");

  //必須パラメータ
  sb.Append(Datas[0] + para);
  sb.Append(" , " + para + Datas[1] + para);
  sb.Append(" , " + para + DateTime.Now.ToString("d") + para);

★ここが分かりません。

  例えばコレをやってみましたが中は何も入っていませんでした。
  という事はNull?
  char[] test = Datas[3].ToCharArray();

  //以降は必須ではないのでNullならAppendしない => なぜかAppendの処理に入ってしまう。
 //値が入っていなければ、パラメータは作らない。
  if ((Datas[3] != "")||(Datas[3] !=null)) { sb.Append(" , " + arryCmd[1] + para + Datas[3] + para); }

 以下同じような処理

  return sb.ToString();
}

引用返信 編集キー/
■14589 / inTopicNo.2)  Re[1]: OledBで取り込んだExcelデータのNull値について
□投稿者/ まぐねしうむ (10回)-(2008/02/22(Fri) 13:26:19)
すみません、環境を書くのを忘れていました。

VS2005
C#
Excel2003

です。

よろしくお願いします。
引用返信 編集キー/
■14598 / inTopicNo.3)  Re[2]: OledBで取り込んだExcelデータのNull値について
□投稿者/ 七曜 (81回)-(2008/02/22(Fri) 17:30:47)
No14589 (まぐねしうむ さん) に返信
そもそも、仮にDatas[3]がNullだったとしても、AppendしないとINSERT文のColumn数とValuesの数が合わなくなるのでうまくいかない様な気がします・・・。
そういう意味では、listParaの生成方法にも問題がありそうですが・・・。

それは置いておいて・・・
Datasは、List<string> Datasなので、Datas[3]の型はstringですから

string.IsNullOrEmpty(Datas[3])

がtrueなら、Nullか空(Empty)なのでしょう。
本当かどうかは、ステップ実行してDatas[3]の中身を見れば良いかと思います。

で、string.IsNullOrEmpty(Datas[3])がfalseである場合には、空白が何文字か入っていたりするのかもしれません。
その場合は、Trimした後で評価するとか・・・。

あと、
char[] test = Datas[3].ToCharArray();
これですが、「中は何も入っていませんでした」とのことですが
test.Length=0だったということでしょうか。

いずれにしても、if文にかからないのであれば、
複数の条件指定をしている場合には、個々の指定に分割して、どの条件が、想定上、真になるはずなのか、
真にならないのは、評価している値がどういう状態であるのか
をいった事を一つ一つ評価していく必要があるかと思います。

また、これは考え方にもよりますが、この例のSourceをテストするのであれば
Excelから読んでいる値が想定外なのか、makeNewAddCmd内のコードが問題なのかを切り分ける意味でも
makeNewAddCmdに渡される事が想定されている、List<string>をハードコードで作成して渡した場合に
期待通りの動作をするのかを確認された方が宜しいかと思います。(要はmakeNewAddCmdの単体テストをする、ということです。)


引用返信 編集キー/
■14601 / inTopicNo.4)  Re[2]: OledBで取り込んだExcelデータのNull値について
□投稿者/ 七曜 (82回)-(2008/02/22(Fri) 17:44:58)
No14589 (まぐねしうむ さん) に返信
参考までに、dsExcel取得後にsql構文を生成するロジックを私ならこんな感じで書くかなぁ。

            foreach (DataRow row in dsExcel.Tables[0].Rows)
            {
                StringBuilder commandBuilder = new StringBuilder();
                commandBuilder.Append("INSERT INTO UserData ( UserID, Pass, RegistDate, Family, Name, Fami_Furi, Name_Furi, Birth, Sex, ZipCode, Area, TEL, Mobile, E_Mail, OptionMsg ) VALUES (");
                foreach (DataColumn column in dsExcel.Tables[0].Columns)
                {
          // 型が複数あるなら型判定をして、適切な構文を生成するロジックを記述する
                    if (String.IsNullOrEmpty(row[column].ToString()))
                    {
                        commandBuilder.Append("NULL, ");
                    }
                    else
                    {
                        commandBuilder.AppendFormat("'{0}', ", row[column]);
                    }
                }
                if (dsExcel.Tables[0].Columns.Count > 0)
                {
                    commandBuilder.Length -= 2;
                }
                commandBuilder.Append(")");
                String sqlCommandText = commandBuilder.ToString();
                // ここにDBへ格納するロジックを記述する
            }


引用返信 編集キー/
■14604 / inTopicNo.5)  Re[3]: OledBで取り込んだExcelデータのNull値について
□投稿者/ まぐねしうむ (11回)-(2008/02/22(Fri) 19:02:15)
返信有難うございます。

> string.IsNullOrEmpty(Datas[3])
を試してみた所中身がNullである事が確認できました。
ありがとうございます。

> そもそも、仮にDatas[3]がNullだったとしても、AppendしないとINSERT文のColumn数とValuesの数が合わなくなるのでうまくいかない様な気がします・・・。
確かにそうですね・・・。
手直ししたいと思います。
ご指摘ありがとうございます。

> また、これは考え方にもよりますが、この例のSourceをテストするのであれば
> Excelから読んでいる値が想定外なのか、makeNewAddCmd内のコードが問題なのかを切り分ける意味でも
> makeNewAddCmdに渡される事が想定されている、List<string>をハードコードで作成して渡した場合に
> 期待通りの動作をするのかを確認された方が宜しいかと思います。(要はmakeNewAddCmdの単体テストをする、ということです。)
確かにそうですね。
勉強になります。

わざわざ参考コードまで書いて頂きまして有難うございます。
悩んでいた箇所は分ったので解決としたいと思います。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -