我正在将一个巨大的数据库从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/