0

以下GetEmpIDInBytes_INDIRECTにリストされている方法では、次の例外が発生します。

タイプ 'System.String' のオブジェクトをタイプ 'System.Byte[]' にキャストできません。

次の行を使用すると、このエラーを回避できることがわかっています (つまり、byte[] キャストの代わりにエンコード)

result = Encoding.ASCII.GetBytes(odbcCommand.ExecuteScalar().ToString());

しかし、DB2 関数で使用されたエンコーディングが何であったかがわからないため、エンコーディングを使用できません。DB2 から byte[] として戻す必要があります。どうすれば入手できますか?

コード

string sqlGetEncryptedEmpID_INDIRECT = String.Format(SQLGetEncryptedID_INDIRECT, empIDClearText);
byte[] empIDData_INDIRECT = (byte[])GetEmpIDInBytes_INDIRECT(sqlGetEncryptedEmpID_INDIRECT);



public const string SQLGetEncryptedID_INDIRECT = @"SELECT  SSS.id_encrypt ('E','0000000{0}') 
                                                AS ENCRYPT_ID FROM FFGLOBAL.ONE_ROW FETCH FIRST 1 ROW ONLY WITH UR;";



private byte[] GetEmpIDInBytes_INDIRECT(string sqlQuery)
    {
        byte[] result = null;
        string db2connectionString = ConfigurationManager.ConnectionStrings[UIConstants.DB2ConnectionString].ConnectionString;
        using (OdbcConnection odbcConnection = new OdbcConnection(db2connectionString))
        {
            using (OdbcCommand odbcCommand = new OdbcCommand(sqlQuery, odbcConnection))
            {
                odbcCommand.CommandType = System.Data.CommandType.Text;
                odbcConnection.Open();
                result = (byte[])odbcCommand.ExecuteScalar();
                //result = Encoding.ASCII.GetBytes(odbcCommand.ExecuteScalar().ToString());
            }
        }
        return result;
}

DB2 接続文字列

<add name="DB2ConnectionString_XA"
connectionString="Driver={IBM DB2 ODBC DRIVER};Database=MyDB;Hostname=DB2GWTST;
Protocol=TCPIP;Port=3700;Uid=remotxa;Pwd=xxxx;"/>
4

2 に答える 2

3

次の方法を検討してください (この回答を参照として使用してください)。

static byte[] GetBytes(string str)
{
    byte[] bytes = new byte[str.Length * sizeof(char)];
    System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
    return bytes;
}

次のように使用します。

result = GetBytes(odbcCommand.ExecuteScalar().ToString());
于 2013-03-01T08:16:02.843 に答える
0

最後に、Db2 クエリ自体でCASTASを使用しました。CHAR(100) FOR BIT DATAそれはうまくいきました。

public const string SQLGetEncryptedIDDirect =
@"SELECT  CAST ( SSS.id_encrypt ('E','0000000{0}') AS CHAR(100) FOR BIT DATA)  
AS ENCRYPT_ID FROM FFGLOBAL.ONE_ROW FETCH     FIRST 1 ROW ONLY WITH UR;";
于 2013-03-01T10:41:01.943 に答える