2011-09-30 2 views
0

私は私がbuffeledしまった奇妙なエラーました:私は、関数..uhmを持っている を...このような何か:System.Int64をlongに変換するとエラーが発生しますか?

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のどの値が実際に関数に渡されているかを見るためのログを持っていません...しかし、そうであっても...パラメータが長いと、IDが長く...正しいことを保証する必要がありますか?では、なぜこれが投げ込まれているのですか? 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)があるが、それはありませんスタックがスローすると言う行番号。

+14

私は常に自分のコードをテストするとは限りません。しかし私がそうするとき、私は生産でそれをします。 –

+6

注: 'Type.GetType(" System.Int64 ")'を使用する代わりに、 'typeof(long)'または 'typeof(System.Int64)'を使用してください。 –

+1

'入力文字列は正しいフォーマットではありませんでした。'何かが文字列を期待していることを伝えますが、実際には 'object'か' System.Int64'のプロンプトが表示されます。 – Zasz

答えて

7

再現することはできません - これが私のために正常に動作します:あなたはtypeof(long)を使用してType.GetType()への呼び出しを取り除くことができます

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); 
    } 
} 

注意を。

何らかの理由で値が文字列に変換されているように見えます。実際にはが奇妙です...それはちょうどそのコードのものですか?

私のような短い完全な例を考え出すことができますが、失敗すると、それが本当に助けになります。

1

longDataRowCollection.Addメソッドに渡してもよろしいですか?

投稿したコードスニペットがあまり役に立たない場合は、実際のコードを投稿できますか?

System.Data名前空間コードはジェネリックよりも前ですので、たくさんのボクシングとアンボクシングがあり、その周りには方法はないと思います。スタックトレースから、DataRowカラムの値をObjectの値に設定しようとしていることがわかります。その結果、StringInt64に解析されます。これにより、table.Rows.Addへの呼び出しがRID列の値longを受け取っていないと考えられます。ボクシングがlong値を台無しにし、空であると終わらない限り不可能ではないが、非常に不可能ではないString。つまり、私は.NETフレームワークをコード化していませんでした。内部的には何が起こっているのか分かりません。マイクロソフトが良い仕事をしていると信じていますが、すべてのコードでエラーが発生する可能性があります。だから、バグはあなたのコードまたはマイクロソフトのコードにあります。オッズはあなたに逆らっています。

+0

hmm ...無効な/空の文字列に変換された長いものは何でしょうか?長い特別なケースはありますか?すなわち、 #INF #NAN? – Radu094

+0

実稼働中のコードは本当ですか?私はコレクションに行を追加する "like/not likeルール"と "より大きい/少ないルール"の違いは見られません。コメントから、「価値IDは提供されていません」と表示されます。実際のコードは 'm_Rules.Rows.Add(m_RID、PropID、"、type、Data);なのでしょうか? – Xint0

関連する問題