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

C# Oracle到MySQL列的值超出范围,c#,mysql,sql,oracle,.net-3.5,C#,Mysql,Sql,Oracle,.net 3.5,我正在将一个巨大的数据库从oracle数据源同步到mysql数据源,以用于其他目的。在linux/oracle数据库中使用PuTTY读取数据时,值为 8888888888 它被存储到一个对象中,然后插入MySQL,最后变成 00000000000000000000000000000000000000000000000000000000000000000000008888888888 现在不幸的是,我不是一个编程英雄,我似乎无法解决这个问题。两个数据库中的数据类型都是int(10),C#应用程

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

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

00000000000000000000000000000000000000000000000000000000000000000000008888888888
现在不幸的是,我不是一个编程英雄,我似乎无法解决这个问题。两个数据库中的数据类型都是int(10),C#应用程序无法篡改任何值。下面是实际的错误消息:(省略了语句中不相关的部分)

可能是字符集不匹配吗

这是生成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);
}
public int Insert(字符串表、字符串[]字段、对象[]值)
{
if(fields.Length!=values.Length)
抛出新的DBException(“字段长度不等于值长度!”);
StringBuilder查询=新建StringBuilder();
查询。追加(“插入”);
查询、追加(表);
查询。追加(“”);
for(int i=0;i
编辑;我已经更改了一些代码,现在在使用单独的try-catch时跳过这些行。看一看,这就是我看到的。这个值应该在int的范围内,我很困惑。潜在的错误?它给我的错误是int对于int32太小或太大。但事实并非如此。

在我看来,添加参数时可能需要显式转换值。您的代码试图插入的值是错误的数据类型和零填充,但在技术上是正确的。如果您执行以下操作,它将解决问题:

command.AddParameter(“@”+字段[i],(int)值[i])


诚然,如果您试图动态处理多个数据类型,这会有点痛苦,但添加一些测试来确定值的正确数据类型应该不会太难。

在我看来,在添加参数时可能需要显式转换值。您的代码试图插入的值是错误的数据类型和零填充,但在技术上是正确的。如果您执行以下操作,它将解决问题:

command.AddParameter(“@”+字段[i],(int)值[i])



诚然,如果您试图动态处理多种数据类型,这会有点痛苦,但添加一些测试来确定值的正确数据类型应该不会太难。

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

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

这被存储到字符串中
为什么?怎么做?抱歉弄脏了你的帖子,大卫。我在iPhone上回复。是否将0添加到insert语句?@BRAIN不,不是。我添加了创建insert语句的C#代码。@Sebas:Oracle确实理解数据类型
integer
(您可以在
create table
语句中使用它)。它只是编号(22)
的别名:@a_horse_,名称为“否”,但INT(10)失败。这就是我的观点。整件事都是为了指出油灰提取物是不相关的。
这被存储到字符串中
为什么?怎么做?抱歉弄脏了你的帖子,大卫。我在iPhone上回复。是否将0添加到insert语句?@BRAIN不,不是。我添加了创建insert语句的C#代码。@Sebas:Oracle确实理解数据类型
integer
(您可以在
create table
语句中使用它)。它只是编号(22)的别名:@a_horse_,名称为“否”,但INT(10)失败。这就是我的观点。这一切都是为了指出油灰提取物是无关紧要的。奇怪的是,它声称转换是无效的。我将进一步研究这个问题。也许尝试显式转换而不是强制转换?我的c#技能并不出众,所以我可能做错了。铸造它似乎不是问题。我正在使用convert、cast和parse,但出于某种原因,它们似乎都返回前导000。问题是888888比int32支持的要大。仍然无法找到为什么在查询mysql时添加000000000。奇怪的是,它声称转换无效。我将进一步研究这个问题。也许尝试显式转换而不是强制转换?我的c#技能并不出众,所以我可能做错了。铸造它似乎不是问题。我正在使用convert、cast和parse,但出于某种原因,它们似乎都返回前导000。问题是888888比int32支持的要大。仍然无法找到在查询mysql时添加000000000的原因。请注意:kode8中的888888值显然是伪造的测试数据。感谢数据库管理员。请注意:kode8中的8888888值显然是伪造的测试数据。感谢数据库管理员。
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);
}