0

の汎用更新関数を作成しようとしてOracleDataAdapterいますが、DataTableを更新しようとすると失敗します。
エラーメッセージはFailed to convert value from a Int32 to a DateTimeです。
DataTableでは、値は完全に形成されたDataTime値であるため、更新コマンドが失敗する場所がわかりません...ヒントはありますか?

private void CreateUpdate()
{
    //UPDATE "TABLE" SET "AD_USERID" = :AD_USERID,  WHERE (("AD_USERID" = :Original_AD_USERID) AND ("MODULE" = :Original_MODULE))
    DataTable tbl = _DsViews.Tables[_DbName];
    string value = string.Empty;
    string where = string.Empty;
    foreach (DataColumn col in tbl.Columns)
    {
        value += string.Format("\"{0}\" = :{0},", col.ColumnName.ToUpper());
        where += string.Format("(\"{0}\" = :Original_{0}) AND ", col.ColumnName.ToUpper());
    }
    value = value.Substring(0, value.Length - 1);
    where = where.Substring(0, where.Length - 5);
    string sql = string.Format("UPDATE \"{0}\"  SET {1} WHERE ({2})", _DbName, value, where);
    ta.UpdateCommand = new OracleCommand(sql, MyDBConnection);

    foreach (DataColumn col in tbl.Columns)
    {
        var para1 = ta.UpdateCommand.Parameters.Add(col.ColumnName.ToUpper(), GetOraType(col.DataType));
        para1.SourceColumn = col.ColumnName;
        para1.SourceColumnNullMapping = col.AllowDBNull;

        var para2 = ta.UpdateCommand.Parameters.Add("Original_" + col.ColumnName.ToUpper(), GetOraType(col.DataType));
        para2.SourceColumn = col.ColumnName;
        para2.SourceVersion = DataRowVersion.Original;
        para2.SourceColumnNullMapping = col.AllowDBNull;
    }
}


OracleType GetOraType(System.Type type)
{

    switch (Type.GetTypeCode(type))
    {
        case TypeCode.Boolean:
        case TypeCode.Byte:
            return OracleType.Byte;
        case TypeCode.Char:
            return OracleType.Char;
        //case TypeCode.DBNull:
        //    return OracleType
        case TypeCode.DateTime:
            return OracleType.DateTime;
        case TypeCode.Decimal:
        case TypeCode.Double:
            return OracleType.Number;
        //case TypeCode.Empty:
        case TypeCode.Int16:
            return OracleType.Int16;
        case TypeCode.Int32:
            return OracleType.Int32;
        case TypeCode.Int64:
            return OracleType.Number;
        case TypeCode.Object:
            return OracleType.Blob;
        case TypeCode.SByte:
            return OracleType.SByte;
        case TypeCode.Single:
            return OracleType.Float;
        case TypeCode.String:
            return OracleType.NVarChar;
        case TypeCode.UInt16:
            return OracleType.UInt16;
        case TypeCode.UInt32:
            return OracleType.UInt32;
        case TypeCode.UInt64:
            return OracleType.Number;
        default:
            return OracleType.VarChar;
    }
}
4

2 に答える 2

0

通常、SQL は引用符 '' 内にないものはすべて数値と見なします。通常、日付文字列を SQL に渡して、日付/時刻を比較/設定します。日付/時刻の値を引用符で囲んでみてください

于 2012-07-13T13:34:11.263 に答える
0

Ms には null 値を処理する特別な方法があるため、それらにもパラメーターを追加する必要があります。このコードは、DataTable の更新コマンドを生成します

    private void CreateUpdate()
    {
        //UPDATE "TABLE" SET "AD_USERID" = :AD_USERID,  WHERE (("AD_USERID" = :Original_AD_USERID) AND ("MODULE" = :Original_MODULE)) AND ((:IsNull_MODIFIED_BY = 1 AND ""MODIFIED_BY"" IS NULL) OR (""MODIFIED_BY"" = :Original_MODIFIED_BY))
        DataTable tbl = _DsViews.Tables[_DbName];
        string value = string.Empty;
        string where = string.Empty;
        foreach (DataColumn col in tbl.Columns)
        {
            value += string.Format("\"{0}\" = :{0},", col.ColumnName.ToUpper());
            if (GetOraType(col.DataType) == OracleType.Blob)
                continue;
            if (col.AllowDBNull || col.DataType == typeof(DateTime))
                where += string.Format("((:IsNull_{0} = 1 AND \"{0}\" IS NULL) OR (\"{0}\" = :Original_{0})) AND ", col.ColumnName.ToUpper());
            else 
                where += string.Format("(\"{0}\" = :Original_{0}) AND ", col.ColumnName.ToUpper());
        }

        value = value.Substring(0, value.Length - 1);
        where = where.Substring(0, where.Length - 5);
        string sql = string.Format("UPDATE \"{0}\"  SET {1} WHERE ({2})", _DbName, value, where);
        ta.UpdateCommand = new OracleCommand(sql, MyDBConnection);

        foreach (DataColumn col in tbl.Columns)
        {
            ta.UpdateCommand.Parameters.Add(new OracleParameter(col.ColumnName.ToUpper(), GetOraType(col.DataType), 0, ParameterDirection.Input, col.ColumnName.ToUpper(), DataRowVersion.Current, false, null));
            if (GetOraType(col.DataType) == OracleType.Blob)
                continue;
            if (col.AllowDBNull || col.DataType == typeof(DateTime))
                ta.UpdateCommand.Parameters.Add(new OracleParameter("IsNull_" + col.ColumnName.ToUpper(), OracleType.Int32, 0, ParameterDirection.Input, col.ColumnName.ToUpper(), DataRowVersion.Original, true, null));
            ta.UpdateCommand.Parameters.Add(new OracleParameter("Original_" + col.ColumnName.ToUpper(), GetOraType(col.DataType), 0, ParameterDirection.Input, col.ColumnName.ToUpper(), DataRowVersion.Original, false, null));
        }
    }
于 2012-07-19T11:15:14.673 に答える