0

.Net フレームワーク 4.0 を使用しています。そして、私は次のようなソースコードを持っています:

....
using (MySqlCommand cmd = new MySqlCommand())
{
   cmd.Connection = conn;
   String query = "SELECT a.process_id, a.prod_dt, a.vlt_dt, a.prod_month, a.karoseri, a.error_flag, a.created_by, date_format(a.created_dt, '%Y%m%d') as created_dt, a.updated_by, date_format(a.updated_dt, '%Y%m%d') as updated_dt FROM tb_t_vlt_web a " +
                        "WHERE a.process_id = '" + processId + "'";
                    DataTable dt = CSTDDBUtil.ExecuteQuery(query);
   if (dt.Rows.Count > 0)
   { 
      as400Con = CSTDDBUtil.GetAS400Connection();
      as400Con.Open();

      using (OdbcCommand as400Cmd = new OdbcCommand())
      {
          as400Cmd.Connection = as400Con;
          as400Cmd.CommandText = "INSERT INTO DCDLIB.TBTVLT(VLPRID, VLPRDT, VLVLDT, VLPRMO, VLKRCD, VLERFG, VLCRBY, VLCRDT, VLCHBY, VLCHDT) VALUES " +
                            "(?,?,?,?,?,?,?,?,?,?)";

          foreach (DataRow dr in dt.Rows)
          {
              as400Cmd.Parameters.Add("1", OdbcType.VarChar).Value = dr["process_id"].ToString();
              as400Cmd.Parameters.Add("2", OdbcType.Numeric).Value = dr["prod_dt"];
              as400Cmd.Parameters.Add("3", OdbcType.Numeric).Value = dr["vlt_dt"];
              as400Cmd.Parameters.Add("4", OdbcType.VarChar).Value = dr["prod_month"].ToString();
              as400Cmd.Parameters.Add("5", OdbcType.VarChar).Value = dr["karoseri"].ToString();
              as400Cmd.Parameters.Add("6", OdbcType.VarChar).Value = dr["error_flag"].ToString();
              as400Cmd.Parameters.Add("7", OdbcType.VarChar).Value = dr["created_by"].ToString();
              as400Cmd.Parameters.Add("8", OdbcType.Numeric).Value = dr["created_dt"];
              as400Cmd.Parameters.Add("9", OdbcType.VarChar).Value = dr["updated_by"].ToString();
              as400Cmd.Parameters.Add("10", OdbcType.Numeric).Value = dr["updated_dt"];

              as400Cmd.ExecuteNonQuery();
              as400Cmd.Parameters.Clear();
         }
         as400Cmd.Dispose();
     }
}
... Next Process Below ...

プログラムを実行すると、 でエラーが発生しましたas400Cmd.ExecuteNonQuery();。エラーは次のとおりです。

ERROR [00000] [IBM][System i Access ODBC Driver]Column 4: CWB0111 - Input data is too big to fit into field
ERROR [22001] [IBM][System i Access ODBC Driver]Column 4: Character data right truncation. 

そして、AS400を確認したところ、カラムサイズに問題はありません。
このエラーを解決するにはどうすればよいですか?

TBTVLTの構造表 構造表 TBTVLT

4

1 に答える 1

1

エラー メッセージが表示されないため、実際の問題が何であるかを簡単に判断することはできませんが、最初にすべきことは、これをやめることです。

insertQuery = String.Format("INSERT INTO DCDLIB.TBTVLT(VLPRID, VLPRDT, VLVLDT, VLPRMO, VLKRCD, VLERFG, VLCRBY, VLCRDT, VLCHBY, VLCHDT) VALUES " +
    "('{0}',{1},{2},'{3}','{4}','{5}','{6}',{7},'{8}',{9})",

SQL 自体に値を挿入して SQL クエリを作成しないでください。代わりに、SQLをパラメーター化し、パラメーターをコマンドに追加しました。

この意志:

  • SQL を読みやすくする
  • SQL インジェクション攻撃を回避する
  • 不要な文字列変換を避ける

問題が日付/時刻から文字列への変換によるものである場合、私はまったく驚かないでしょう。

例については、 「パラメーターの使用」 MySql ドキュメントを参照してください。

于 2012-11-09T06:48:28.453 に答える