0

英語が下手で申し訳ありません。コードに問題があります。

Dim sq As String = "SELECT username FROM standing WHERE username = @user"
            Dim con As New SqlConnection(Sql.ConnectionString)
            Dim cmd As New SqlCommand(sq, con)
            cmd.Parameters.Add("@user", SqlDbType.VarChar)
            cmd.Parameters("@user").Value = "contesttest"
            con.Open()
            Dim index As Integer = cmd.ExecuteNonQuery
            con.Close()
            If (index > 0) Then
                'Something..
            Else
                'Something else..
            End If

私のコードでは、"contesttest" がデータベースに存在し、返された行 (インデックス) は 0 より大きい必要があります。しかし、インデックスは-1です!何が問題なのですか? 私の接続文字列は正しいです。
C# か VB.Net かは関係ありません。

4

4 に答える 4

2

ユーザー名フィールドが一意のインデックスである場合 (同じ値を持つ 2 つのユーザー名がないことを意味します)、SqlDataReader を使用せずにクエリを書き換えることができます。

Dim sq As String = "SELECT username FROM standing WHERE username = @user"
Using con SqlConnection(Sql.ConnectionString)
Using cmd As New SqlCommand(sq, con)
    cmd.Parameters.Add("@user", SqlDbType.VarChar)
    cmd.Parameters("@user").Value = "contesttest"
    con.Open()
    Dim username = cmd.ExecuteScalar
    If userName IsNot Nothing Then
        'Something..
    Else
       'Something else..
    End If
End Using
End Using 

ExecuteScalarは、コマンドによって取得された最初の行の最初の列を返します。列が一意のインデックス/主キーである場合、行は 1 つだけで、ユーザー名だけを返します。したがって、何かが返された場合、ユーザーが見つかりました

于 2013-06-07T08:53:55.877 に答える
1

からMSDN;

UPDATE、INSERT、および DELETE ステートメントの場合、戻り値はコマンドの影響を受けた行数です。挿入または更新されるテーブルにトリガーが存在する場合、戻り値には、挿入操作または更新操作の両方によって影響を受ける行の数と、トリガーまたはトリガーによって影響を受ける行の数が含まれます。他のすべてのタイプのステートメントの場合、戻り値は -1 です。ロールバックが発生した場合、戻り値も -1 です。

これは問題ではありません。メソッドの定義ですExecuteNonQuery

于 2013-06-07T08:46:27.650 に答える
1

ある種のリーダー (SqlDataReader など) を使用して、SELECTステートメントから返される行数をExecuteScalar取得するか、単一の戻り値を取得します。Usingは、ステートメントExecuteNonQueryで使用されたときに影響を受ける行の数のみを返します。SELECT

UPDATE、INSERT、および DELETE ステートメントの場合、戻り値はコマンドによって影響を受けた行の数です。挿入または更新されるテーブルにトリガーが存在する場合、戻り値には、挿入操作または更新操作の両方によって影響を受ける行の数と、トリガーまたはトリガーによって影響を受ける行の数が含まれます。他のすべてのタイプのステートメントの場合、戻り値は -1 です。ロールバックが発生した場合、戻り値も -1 です。

  • MSDNでそれについて読んでください。
于 2013-06-07T08:47:38.633 に答える
0

私はSqlDbType.VarChar1文字だけを許可すると思います..varcharにlengthも渡す必要があります。

例えば:-

  cmd.Parameters.Add("@user", SqlDbType.VarChar,80)
于 2013-06-07T08:46:57.240 に答える