列Oracle到MySQL的范围值超出范围

时间:2013-03-07 15:31:24

标签: c# mysql sql oracle .net-3.5

我正在将一个巨大的数据库从它的oracle数据源同步到一个mysql数据源以用于其他目的。在linux / oracle数据库中使用PuTTY读取数据时,值为

8888888888

将其存储到对象中,然后插入MySQL中,然后最终成为

00000000000000000000000000000000000000000000000000000000000000000000008888888888

现在我不幸没有编程英雄,我似乎无法弄清楚问题。两个数据库中的数据类型都是int(10),C#Application不会篡改任何值。这是实际的错误消息:(省略了语句的不相关部分)

Error while executing query 
INSERT INTO tsdsmd(kode8) 
VALUES ('00000000000000000000000000000000000000000000000000000000000000000000008888888888')
Out of range value for column 'kode8' at row 1

这可能是字符集不匹配吗?

这是构建插入命令的代码

public int Insert(string table, string[] fields, object[] values)
{
    if (fields.Length != values.Length)
        throw new DBException("Field lengt is not equal to values length!");

    StringBuilder query = new StringBuilder();
    query.Append("INSERT INTO ");
    query.Append(table);
    query.Append("( ");
    for (int i = 0; i < fields.Length; i++)
    {
        query.Append(fields[i]);

        if (i != fields.Length - 1)
        {
            query.Append(", ");
        }
    }

    query.Append(") VALUES (");

    for (int i = 0; i < fields.Length; i++)
    {
        query.Append("@" + fields[i]);

        if (i != fields.Length - 1)
        {
            query.Append(", ");
        }
    }

    query.Append(")");

    DBCommand command = new DBCommand(query.ToString());

    for (int i = 0; i < fields.Length; i++)
    {
        command.AddParameter("@" + fields[i], values[i]);
    }

    return Insert(command);
}

编辑;我已经更改了一些代码,现在我正在使用单独的try catch跳过这些行。看看,这就是我所看到的。值shoudl在int的范围内,我很困惑。潜在的错误?它给我的错误是int对于int32而言太小或太大。不应该是这种情况。 Code screenshot

2 个答案:

答案 0 :(得分:1)

在我看来,您可能需要在添加参数时显式转换值。您的代码尝试插入的值是错误的数据类型和零填充,但它在技术上是正确的。如果你这样做,它应该解决问题:

command.AddParameter("@" + fields[i], (int)values[i])

不可否认,如果您尝试动态处理多种数据类型,那将会有点痛苦,但添加一些测试来计算值的正确数据类型应该不会太难。

答案 1 :(得分:0)

实际上,oracle中的列不受int32的限制,就像mysql中的“int”一样。必须将mysql列转换为int64 / long。