我得到了一个让我感到困惑的奇怪错误: 我有一个功能..uhm ...这样的事情:
void someFunctionTakingALong( long ID)
{
var table = new DataTable();
table .Columns.Add(new DataColumn("RID", Type.GetType("System.Int64")));
table.Rows.Add(ID); //<-- throws err
}
抛出此错误:
System.ArgumentException: Input string was not in a correct format.Couldn't store in RID Column. Expected type is Int64. ---> System.FormatException: Input string was not in a correct format.
at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
at System.Number.ParseInt64(String value, NumberStyles options, NumberFormatInfo numfmt)
at System.String.System.IConvertible.ToInt64(IFormatProvider provider)
at System.Data.Common.Int64Storage.Set(Int32 record, Object value)
at System.Data.DataColumn.set_Item(Int32 record, Object value)
--- End of inner exception stack trace ---
这在生产中发生,我没有日志来查看实际传递给函数的ID的值...但即便如此......如果参数为a,则至少应保证ID为long。 .. 对?那为什么要扔?哪些值可以ID不能转换为int64?
修改
以下是实际来源:Trhowing列 PropValueID
public void AddRule(int PropID, long PropValueID, int type, string Data)
{
if (!m_HasRule)
{
m_Rules = new DataTable();
m_Rules.Columns.Add(new DataColumn("RID", Type.GetType("System.Int32")));
m_Rules.Columns.Add(new DataColumn("PropID", Type.GetType("System.Int32")));
m_Rules.Columns.Add(new DataColumn("PropValueID", Type.GetType("System.Int64")));
//m_Rules.Columns.Add(new DataColumn("PropValue", Type.GetType("System.String")));
m_Rules.Columns.Add(new DataColumn("Type", Type.GetType("System.Int32")));
m_Rules.Columns.Add(new DataColumn("Data", Type.GetType("System.String")));
m_HasRule = true;
}
ToStringSB = null;
if (type<2) // a "Is/Not specified property"
{
if (string.IsNullOrEmpty(Data)) //is specified (0,1)
m_Rules.Rows.Add(m_RID, PropID, 0, type, ""); //<<-- here we pass 0 (int32) instead of long.. could this be it? Stack says this is not the line throwing
else //is equal to/is not equal to(2,3)
m_Rules.Rows.Add(m_RID, PropID, PropValueID,3-type, Data);
}else
if ((type > 3) && (type < 6)) // a "like/not like" rule
{
// "Like" or "not like" DATA .. no value ID is provided
m_Rules.Rows.Add(m_RID, PropID, PropValueID, type, Data); //<<-- Stack says it throws here
}
else // a greater/lesser rule
{
m_Rules.Rows.Add(m_RID, PropID, PropValueID, type, Data);
}
}
有一个可疑行,我们传递文字0(一个int),但这不是堆栈说它抛出的行号。
答案 0 :(得分:7)
无法复制 - 这对我来说很好:
using System;
using System.Data;
class Test
{
static void Main()
{
long x = 10;
var table = new DataTable();
table.Columns.Add(new DataColumn("RID", Type.GetType("System.Int64")));
table.Rows.Add(x);
}
}
请注意,您可以使用Type.GetType()
删除对typeof(long)
的来电。
看起来由于某种原因,它将值转换为字符串并返回,这是真的奇怪......你确定它只是来自那个代码吗?
如果你能想出一个简短但完整的例子,比如我的但却失败了,那真的会有所帮助。
答案 1 :(得分:1)
您确定要将long
传递给DataRowCollection.Add
方法吗?
您发布的代码段没有多大帮助,您可以发布实际代码吗?
System.Data
命名空间代码优先于泛型,所以有很多拳击和拆箱正在进行,我认为没有办法解决它。从堆栈跟踪中我们可以看到代码正在尝试从DataRow
值设置Object
列的值,这会导致String
解析为Int64
}。这使我相信对table.Rows.Add
的调用没有收到long
列的RID
值。除非拳击搞砸long
值并最终为空String
,否则这是不可能的,这是非常不可能的。我的意思是,我没有编写.Net Framework代码,我不知道它在内部做了什么,总的来说我们相信微软做得很好,但是在所有代码中都存在错误的可能性。因此,无论是您的代码还是Microsoft的代码中的错误。可能性不利于你。