C# Oracle到MySQL列的值超出范围
我正在将一个巨大的数据库从oracle数据源同步到mysql数据源,以用于其他目的。在linux/oracle数据库中使用PuTTY读取数据时,值为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#应用程
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);
}