9

したがって、C#では、MSSQLデータベースからtinyintを取得するたびに、次のキャストを使用しました。

(int)(byte)reader["MyField"];

ただし、そのキャストはMySQLでは機能しないようです。

私が試したこと

(byte)reader["MyField"];

そしてただ

(int)reader["MyField"];

編集1

例外

The specified cast is not valid.

編集2

これはデータ型です。

{Name = "SByte" FullName = "System.SByte"}
4

3 に答える 3

10

適切なタイプを決定するには、の値を見てください

reader["MyField"].GetType()

デバッガーで。

于 2012-06-06T22:01:25.497 に答える
10

問題は、キャストと明示的な演算子が原因であるということです。

(byte)objectExpressionと同じではありません(byte)sbyteExpression

1つ目は、[直接]キャストsbyteです。これは、実際のオブジェクトタイプがであり、ではないために失敗しますbyte。後者は、たまたま明示的な演算子を使用する変換(「明示的な変換」)を実行ますが、残念ながら、上記のように[直接]キャストのように見えます。sans-databaseが失敗した例を次に示します。

var obj = (object)(sbyte)0;
var i1 = (int)(sbyte)obj;  // okay: object (cast)-> sbyte (conversion)-> int
var i2 = (int)obj;         // fail: sbyte (cast)-> int (but sbyte is not int!)

(sbyte)objectExpression実際のオブジェクトタイプに有効なキャストを使用するか、またはConvert.ToInt32(objectExpression)を使用してそれをintに変換するobjectための魔法を実行します。(を使用すると、オーバーフロー時に例外がスローされる可能性があります。)Convert.ToByte

ハッピーコーディング!

于 2012-06-06T22:07:39.920 に答える
0

システムをそれ自体に対して機能させることを提案できますか?DataReaderクラスは、正しいタイプの値を取得するための機能を提供します。

reader.GetInt32("id");
reader.GetByte("MyByteField");

このようにして、リーダーは期待するタイプを提供します。

于 2021-02-23T14:53:45.473 に答える