将long转换为System.Int64抛出错误?

时间:2011-09-30 18:01:58

标签: c#

我得到了一个让我感到困惑的奇怪错误: 我有一个功能..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),但这不是堆栈说它抛出的行号。

2 个答案:

答案 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的代码中的错误。可能性不利于你。