4

厳密に型指定された DataTable の列に値を代入すると、StrongTypingException が発生する理由を教えてください。(DBNull値で列を読み取ると、なぜそれが得られるのか理解しています)

以下の例では、ある DataTable から別の DataTable に値を代入しようとしています (例のすべての列はInt32 型です)。「newOrderRow.items」列に値を割り当てることができますが、「newOrderRow.debcode」列で同じことを行うと、例外がスローされます! どうして?!

私がこれまでに試したことのいくつか (運がなかっ た )
:orderrows のテーブルを DBNull から -1 に変更しても、依然として例外がスローされ、DBNull であると表示されます !!!

myDataSet.orderrowsRow newOrderRow;

foreach (MyDataSet.calclinesRow calclineRow in myDataSet.calclines)
{
    newOrderRow = myDataSet.orderrows.NeworderrowsRow();  //Create new 'orderrows' row

    //Assign values from one DataTable to another
    if (!calclineRow.IsitemsNull())
        newOrderRow.items = calclineRow.items;  //calclineRow.items == 1. Assignment successful
    if (!calclineRow.IsdebcodeNull()) 
        newOrderRow.debcode = calclineRow.debcode; //calclineRow.debcode == 556. Assignment raises System.Data.StrongTypingException ! (See message below)


    myDataSet.orderrows.AddorderrowsRow(newOrderRow);
}

/*Exception Message:
=====================

System.Data.StrongTypingException: The value for column 'debcode' in table 'orderrows' is DBNull. 
---> System.InvalidCastException: Specified cast is not valid. 
at MyProject.MyDataSet.orderrowsRow.get_debcode() in Q:\MyProjFolder\DataSets\MyDataSet.Designer.cs:line 21680
*/
4

3 に答える 3

4

SetNullnullable プロパティが null の場合は、自動生成されたメソッドを使用する必要があります。

if (!calclineRow.IsitemsNull())
    newOrderRow.items = calclineRow.items;  
else
    newOrderRow.SetitemsNull();

if (!calclineRow.IsdebcodeNull()) 
    newOrderRow.debcode = calclineRow.debcode; 
else
    newOrderRow.SetdebcodeNull();

また、これは自動的に行われないDataRowため、ループ内のテーブルに新しいものを追加する必要があります。NeworderrowsRow

myDataSet.orderrows.AddNeworderrowsRow(newOrderRow);

例外が発生した行 (MyDataSet.Designer.cs:line 21680) は、DataSetこのプロパティを読み取る の自動生成されたメソッドから例外が発生したことを示唆しています。使用SetdebcodeNullしていないため、それが null であることを認識せず、StrongTypingException読み取ろうとすると がスローされます。

于 2013-03-12T15:14:58.737 に答える
0

解決しました。すみません、悪いです。

DataTable の OnColumnChanging イベント ハンドラで「debcode」列を操作していたことを忘れていました。それを無効にすると、すべて正常に機能しました。

とにかくありがとう!

于 2013-03-12T17:38:40.330 に答える
0

これを試すことができます:

if (!calclineRow.IsdebcodeNull()) 
    newOrderRow["debcode"] = calclineRow.debcode;

あまり意味がないことは認めますが、SetnewOrderRow.debcode に対して を呼び出すと、 を呼び出す効果があるようにGet見えます。

于 2013-03-12T15:27:57.473 に答える