QA@IT

C#のプログラムでsqlserverのテーブルへinsertとすると、データ型でうまく登録できません。

10791 PV
foreach (DataRow DataRows in tblKondate.Rows)
            {
                string[] Rows = new string[10];
                       Rows[0] = DataRows["ShisetsuCode"].ToString();
                       Rows[1] = DataRows["SyokusyuCode"].ToString();
                       Rows[2] = DataRows["Date"].ToString();
                       Rows[3] = DataRows["MealKbnNo"].ToString();
                       Rows[4] = DataRows["No"].ToString();
                       Rows[5] = DataRows["BunRyou"].ToString();
                SqlCommand com2 = cSqlConnection.CreateCommand();

                string valuesString = String.Format("'{0}','{1}','{2}','{3}','{4}','{5}'", Rows[0], Rows[1], Rows[2], Rows[3],Rows[4],Rows[5]);
                com2.CommandText = "INSERT INTO Kondate (ShisetsuCode, SyokusyuCode,Date,MealKbnNo,No,BunRyou) VALUES (" + valuesString + ");";
                com2.ExecuteNonQuery();

            }

c#でvisual studio 2010を利用しています。開発環境がWindows 8です。エラーの内容が'データ型 varchar を numeric に変換中にエラーが発生しました。'です。DataRows["BunRyou"]がnumeric型のデータ型でどうしてもうまくいきません。誰かご教授をお願いします。

  • パラメータ化しましょう。後で考えるという話もあったようですが、すべてにおいて物事は最初から正しくやる方がよさそうです。 -

回答

手元のSQL Server データファイル接続で 軽く試した限りでは、
DateTime型に '2014/04/24 19:57:07'
Numeric型に ' 999 '(前後に半角スペースあり) としても
SqlCommandから Insert文が成功します。
ですので、もしまだ解決されていないのであれば、エラーが発生した時の rows[5]の値が null なのかもしれません。

対症療法になってしまいますが、文字列でValue句つくるのはあまり粘るところでもないので、
以下の様にするとうまくいくかもしれません。
他の列にもnullがある場合は パラメータを利用したやり方に変えてしまった方が良いと思いますのでこのコードは読み飛ばしてください。

string valuesString = "";
if ( !String.IsNullOrEmpty(Rows[5]) ){
    String.Format("'{0}','{1}','{2}','{3}','{4}','{5}'", Rows[0], Rows[1], Rows[2], Rows[3],Rows[4],Rows[5]);
}
else{
    // 空ならBunRyouはnullに
    String.Format("'{0}','{1}','{2}','{3}','{4}', null ", Rows[0], Rows[1], Rows[2], Rows[3],Rows[4]);
}

とりあえず 前回の質問時 に問題だった文字列操作はできたようですので、
以下の記事などを参考に、パラメータを利用する形に書き換えてみるといいかと思います。
http://www.atmarkit.co.jp/ait/articles/0307/12/news002_2.html

このページですと型まで取り扱っていないのでこれだけでは足りませんが、参考にはなると思います。
(ご自分でも探してみてください)。
nullの対処があるとちょっと大変かもしれませんが混乱されない様に頑張ってみてください。

編集 履歴 (0)
  • ありがとうございます。勉強になります。
    -
  • うまく、いきました。大変助かりました。ありがとうございます。 -
  • 何度も回答していただき、ありがとうございます。また、よろしくお願いします。 -

とりあえず動けばいい、というレベルなら

Rows[5] = (int)DataRows["BunRyou"];
string valuesString = String.Format("'{0}','{1}','{2}','{3}','{4}',{5}", Rows[0], Rows[1], Rows[2], Rows[3], Rows[4], Rows[5]);

でいかがでしょうか?

C# も SQL も「データ型」というものをきちんと意識してプログラムを書く必要があります。

また、クエリを文字列の連結で組み立てるのもあまり好ましいスタイルではありません。

「パラメタライズドクエリ」などをキーワードに検索してみて、データベースを扱う際の習わしについて学んでみてください。

編集 履歴 (0)
  • ありがとうございます。やってみます。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。