2

DB 内の名前エントリの数をカウントする SQL 集計関数。

string cnnStr = ConfigurationManager.ConnectionStrings["LGFConnectionString"].ConnectionString;
string mySQL = "SELECT COUNT(*) FROM  " + which.table + " WHERE " + which.column + " = ?pram;";
string value = null;

using (MySqlConnection cnn = new MySqlConnection(cnnStr))
{
        using (MySqlCommand cmd = new MySqlCommand(mySQL, cnn))
        {
            MySqlParameter param = new MySqlParameter("?pram", MySqlDbType.VarChar, 128);
            param.Value = which.text;
            cmd.Parameters.Add(param);

            cnn.Open();

            value = cmd.ExecuteScalar() as string;
            value = cmd.ExecuteScalar().ToString();

            cnn.Close();
        }
}

cmd.ExecuteScalar2 回電話をかけたことに注意してください。興味深い部分は、クエリが異なる結果を返すことです。

value = cmd.ExecuteScalar() as string;

正しい値を返しません。name 列に name が存在するか存在しない場合は、両方に対して null を返します。

value = cmd.ExecuteScalar().ToString();

正しく戻ります。これは、存在する場合は「1」を返し、存在しない場合は「0」を返します。

Web を検索しても、わかりやすい説明は見つかりませんでした。

name 列に name がない場合、cmd.ExecuteScalarが返されることを読みましたnull

違いは何ですか:

value = cmd.ExecuteScalar() as string;
value = cmd.ExecuteScalar().ToString();

ありがとう、deDogs

4

3 に答える 3

3

asドキュメント

as 演算子は、互換性のある型間の変換を実行するために使用されます。

as 演算子はキャストに似ていますが、例外を発生させるのではなく、変換の失敗時に null を生成する点が異なります。

// if cmd.ExecuteScalar() is string then return string
// if not then return null
// this will return null, because cmd.ExecuteScalar() won't return string
// for your code it should return Int32
value = cmd.ExecuteScalar() as string;

ToString()ドキュメント

ToString は、.NET Framework の主要な書式設定メソッドです。オブジェクトを表示に適した文字列表現に変換します。(.NET Framework での書式設定のサポートについては、「型の書式設定」を参照してください。)

// return a string that represents the current object
// will return correct value because it casts Int32 value to string value
value = cmd.ExecuteScalar().ToString();
于 2012-06-23T14:34:45.537 に答える
0

上記の2つの異なることを行っています。コードを次のように変更しましょう。

decimal value = cmd.ExecuteScalar();
string str1 = value as string;
string str2 = value.ToString();

10 進数は文字列にキャストできないため、str1 は null になります。10 進数で ToString() を呼び出すことができるため、str2 が値になります。

于 2012-06-23T14:34:13.560 に答える
0

オブジェクトの型がキャストしようとしているものと一致しない場合、「as」キーワードは null を返します。

あなたの場合、返されたオブジェクトは int であり、これに対して toString を呼び出すと、整数の文字列表現が得られます。それに対して as を使用すると、null が返されます。

于 2012-06-23T14:40:03.570 に答える