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

8888888888

它存储在一个对象中,然后插入到MySQL中,最后变成
00000000000000000000000000000000000000000000000000000000000000000000008888888888

现在不幸的是,我不是编程英雄,我似乎无法解决问题。两个数据库中的数据类型都是int(10),而且C#应用程序不会篡改任何值。下面是实际的错误消息:(省略了语句中不相关的部分)
Error while executing query
INSERT INTO tsdsmd(kode8)
VALUES ('00000000000000000000000000000000000000000000000000000000000000000000008888888888')
Out of range value for column 'kode8' at row 1

可能是字符集不匹配吗?
这是生成insert命令的代码
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。看一看,这就是我看到的。这个值应该在int的范围内,我很困惑。潜在的错误?它给我的错误是int对于int32来说太小或太大。但事实并非如此。

最佳答案

在我看来,您可能需要在添加参数时显式转换该值。代码试图插入的值是错误的数据类型和零填充,但在技术上是正确的。如果您这样做,它应该可以解决问题:
command.AddParameter("@" + fields[i], (int)values[i])
诚然,如果您尝试动态处理多个数据类型,这会有点麻烦,但是添加一些测试来确定值的正确数据类型应该不会太困难。

关于c# - Oracle到MySQL列的值超出范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15275127/

10-14 20:55
查看更多