i5(AS400)の特殊文字を含むカラム名の取扱い

i5(AS400)に対してODBC経由でSELECTはもちろん、INSERT,UPDATEなどのクエリも問題なく処理できるのですがプログラムのインストールとは別にIBM iSeries Access for WindowsをインストールしODBCの接続設定をしないと動作しません。しかもODBCの接続設定名も間違っていてはいけません。

そのためiSeries Access for Windowsに含まれるIBM.Data.DB2.iSeries(.Netプログラミングサポート時にインストールされる)を利用してクエリを実行するにはどうすればよいか悩んでました。

というのも、@@TESTというカラムが存在していた場合にODBCなら[@@TEST]と記述すれば問題なかったが、iSeries Access for Windowsで同じように記述するとエラーとなる。

結局、"(ダブルクォテーション)を使えばうまく行くことがわかった。実際には"@@TEST"となる。"(ダブルクォテーション)はC#上でも特殊文字なので記述が面倒だけど。

public void UpdateTest(string sValue)
{
    const string CRLF = @"\r\n";
    StringBuilder sbSql = new StringBuilder();

    sbSql.Append("UPDATE" + CRLF);
    sbSql.Append("    TESTLIB.TEST0407" + CRLF);
    sbSql.Append("SET" + CRLF);
    sbSql.Append("    \"@@TEST2\" = @TEST2" + CRLF);
    sbSql.Append("WHERE" + CRLF);
    sbSql.Append("    \"@@TEST1\"= @TEST1" + CRLF);

    try
    {
        using (iDB2Connection cn = new iDB2Connection(DataSource=192.168.xxx.xxx;USERID=(ユーザー名);PASSWORD=(パスワード);))
        {
            cn.Open();
            using (iDB2Command cmd = cn.CreateCommand())
            {
                sbSql = sbSql.Replace(CRLF, " ");
                cmd.CommandText = sbSql.ToString();
                
                Debug.WriteLine(sbSql.ToString());

                cmd.Parameters.Add("@TEST1", iDB2DbType.iDB2Char);
                cmd.Parameters.Add("@TEST2", iDB2DbType.iDB2Char);

                cmd.Parameters["@TEST1"].Value = "(更新対象レコードのキー)";
                cmd.Parameters["@TEST2"].Value = sValue;

                cmd.ExecuteNonQuery();
            }
            cn.Close();
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

※AppendLineを使用していないのは、WindowsCEとソースを共有している為です。あと\は実際には円マークです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です