1

文字列 (ネットワーク ID) を比較しようとしていて、SQL Like コマンドを使用して、影響を受けた行の数を返します (ユーザー名が見つかったかどうかにかかわらず)。ただし、コードでは常に " -1 " を取得しています。理由が見つかりません。ユーザー名は正しく、SQL Server Mgt でクエリを実行すると SQL テーブルで見つかります。

Try
        Dim Con As New SqlConnection
        Con.ConnectionString = "Data Source=WCRDUSMJEMPR9\SQLEXPRESS;Initial Catalog=MicroDB;Integrated Security=True"
        Con.Open()
        Dim SQL2 As String
        SQL2 = "SELECT * from MicroDB_Users WHERE Users LIKE '+@Usercheck+'"
        Dim cmd2 As New SqlCommand(SQL2, Con)
        cmd2.Parameters.AddWithValue("@Usercheck", TextBox1.Text)
        Dim obj2 = cmd2.ExecuteNonQuery
        Con.Close()
        If obj2 > 0 Then
            MsgBox(obj2)
            Response.Redirect("~\ControlCharts\AddData_Control.aspx")
            Label7_Control.Visible = False
        Else
            MsgBox(obj2)
            Label7_Control.Text = ("You are not authorized to Add Data")
            Label7_Control.Visible = True
        End If
    Catch ex As Exception
        MsgBox(Err.Description)

ご覧のとおり、IF を使用して、ユーザーが見つかった (1 行が影響を受ける) か、見つからなかった (0 行が影響を受ける) かを比較しています。

4

3 に答える 3

4

ExecuteNonQuery挿入、更新、または削除クエリにのみ使用されます。したがってCOUNT、クエリで使用して使用するExecuteScalarExecuteReader、リーダーの HasRowsプロパティを使用する必要があります。

Using var reader = cmd2.ExecuteReader()
    If reader.HasRows Then
        ' ...
    Else
        ' ...
    End If
End Using

ExecuteNonQuery :

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

更新:それとは別に、LIKE演算子とパラメーターを間違って使用しています。それ以外の

SQL2 = "SELECT * from MicroDB_Users WHERE Users LIKE '+@Usercheck+'"
cmd2.Parameters.AddWithValue("@Usercheck", TextBox1.Text)

このアプローチを使用する

SQL2 = "SELECT * from MicroDB_Users WHERE Users LIKE @Usercheck"
cmd2.Parameters.AddWithValue("@Usercheck", string.Format("%{0}%", TextBox1.Text))
于 2013-01-22T22:56:54.510 に答える
0

INSERT UPDATE行数は、DELETEスクリプトを作成するときに影響を受けますが、 SELECT..SQL2 = "SELECT * from MicroDB_Users WHERE Users LIKE '+@Usercheck+'"代わりに使用し、cmd2.ExecuteScalar()

SQL2 = "SELECT COUNT(*) from MicroDB_Users WHERE Users LIKE '%" + TextBox1.Text + "%'";
        Dim cmd2 As New SqlCommand(SQL2, Con)
        cmd2.Parameters.AddWithValue("@Usercheck", TextBox1.Text)
        Dim obj2 As Int32 = 0
        obj2 = Convert.ToInt32(cmd2.ExecuteScalar())
于 2013-01-22T23:00:42.630 に答える
0

影響を受ける行の数は、INSERT、DELETE、および UPDATE を実行した場合にのみ返されます。

ExecuteNonQuery

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

行数を取得するには、次を使用しますSELECT count(*) FROM myTable

ExecuteNonQueryその名前から明らかなように、行を返さないクエリを対象としていますNonQuery

結果を返すクエリの場合は、代わりにこれらを使用してください

  • ExecuteReader() - 複数の行が返される場合
  • ExecuteScalar() - 1 つの行と 1 つの列が返される場合。これはあなたの場合に最適です
于 2013-01-22T22:57:56.923 に答える