2

エラーが発生しました。以下の関数から値を返すことができません。助けていただければ幸いです。

private void UserExiest(string username)
{
    SqlConnection myConnection = new SqlConnection("user id=test;" +
            "password=test;" +
            "server=.;" +
            "Trusted_Connection=yes;" +
            "database=DB; " +
            "MultipleActiveResultSets=True;" +
            "connection timeout=30");

    myConnection.Open();
    SqlCommand CHECKNPC = new SqlCommand("select struserid from USERDATA where strUserId = '" + username + "'", myConnection);
    SqlDataReader NpcReader = CHECKNPC.ExecuteReader();
    if (NpcReader.HasRows)
    {
        return "1";
    }
    else
    {
        return "0";
    }
    myConnection.Close();
}
4

6 に答える 6

4

関数の戻り値の型はvoidです。そこから文字列を返すことはできません。関数の署名を次のように変更します。

private string UserExist(string username)

true の場合と false の場合にかどうかをboolチェックしてから返すため、 return の方が適切です。また、値を返す前に接続を閉じたほうがよいでしょう。NpcReader.HasRows"1""0"

常にSqlParameterまたは Parameterized query を使用してください。現在のクエリはSQL インジェクションに対して開かれています。

于 2013-04-26T12:10:50.450 に答える
3

メソッドのシグネチャに戻り値の型がありません:

private void UserExist(string username)

おそらくブール値を返したい

private bool UserExist(string username)

return true;
// or
return false;
于 2013-04-26T12:11:24.887 に答える
3
private bool UserExist(string username)
{
    using (var con = new SqlConnection("..."))
    {
        con.Open();
        using (var cmd = new SqlCommand("...", con))
        {
            using (var r = cmd.ExecuteReader())
            {
                return r.HasRows;
            }
        }
    }
}

元の関数が値を返さず、接続を閉じないという事実にもかかわらず、不要なロジックを実装しようとしています (reader.HasRows式の結果である bool 値を使用する準備ができている代わりに文字列フラグを返します)。最後に、アンマネージ リソースの解放、解放、またはリセットに関連するアプリケーション定義のタスクの実行を保証する、 をusing実装する型を操作する際のステートメントについて思い出してください ( msdnを参照)。IDisposable

于 2013-04-26T12:21:32.897 に答える
1
private void UserExiest(string username)

これを次のように変更します。

private string UserExiest(string username)

文字列を返しているように見えます...

于 2013-04-26T12:10:50.930 に答える
0

メソッドで return ステートメントを使用していますが、その定義は void を返す必要があることを示していますか? 定義方法を次のように変更します。

private string UserExiest(string username)
于 2013-04-26T12:12:20.670 に答える
0

ここでの多くの回答で示唆されているように、関数に戻り値の型を追加する必要があります。値を返すように を変更しvoidます。string値が1orであるため、 or0を返す方がよい場合があります。truefalse

また、リターン後に接続クローズステートメントがあります。このステートメントは、アプリケーションの通常のフローではトリガーされません。以下を試してください:

private bool UserExiest(string username)
{
    SqlConnection myConnection = new SqlConnection("user id=test;" +
            "password=test;" +
            "server=.;" +
            "Trusted_Connection=yes;" +
            "database=DB; " +
            "MultipleActiveResultSets=True;" +
            "connection timeout=30");
    try
    {
        myConnection.Open();
        SqlCommand CHECKNPC = new SqlCommand("select struserid from USERDATA where strUserId = '" + username + "'", myConnection);
        SqlDataReader NpcReader = CHECKNPC.ExecuteReader();
        return NpcReader.HasRows;
    }
    finally
    {
        if (myConnection.State != System.Data.ConnectionState.Closed)
        {
            myConnection.Close();
        }

    }
}

接続が確実に閉じられるようにブロックを追加しfinally、戻り値の型をboolean trueおよびに変更しただけfalseです。

于 2013-04-26T12:18:07.490 に答える