1

これは非常に緊急です。このアプリケーションを3時間半で提示する必要があります。

私のアプリケーションはデータソースをチェックして、データベースに値が存在するかどうかを確認し、問題の値が見つかったかどうかに応じて値を変更します。問題は、SSMSで問題の値を使用してSQLクエリを実行しましたが、行が返されないことですが、DataReaderには行があると表示されます。

これは、私のアプリケーションが不正確に報告していることを意味します。これが私のコードです:

Using conn As New SqlConnection("Data Source=.\SQLEXPRESS; Initial Catalog=Testing;       Integrated Security=True;")
    Dim cmd As New SqlCommand(sql, conn)

    conn.Open()
    Dim reader As SqlDataReader = cmd.ExecuteReader

    If reader.HasRows Then
       Value = True
       AcctNumber = reader(1)
    End If

    reader.Close()
End Using

この投稿に関係のないコードを削除しましたが、知りたいことは次のとおりです。

値はブール値ですAcctNumberは文字列です

これは仕事用のアプリケーションなので、SQLクエリは含めたくありません。問題は読者です。コメントアウトするValue = Trueと、正しい情報が得られますが、それを省略すると、ValueがTrueである必要がある場合に、レポートも不正確になります。

前もって感謝します!

編集:完全なソースコード:

Case "Business"
    ' Change the number format to local because that's what it is in the db
    If Microsoft.VisualBasic.Left(NumberToCheck, 2) = "27" Then
        NumberToCheck = NumberToCheck.Replace(Microsoft.VisualBasic.Left(NumberToCheck, 2), "0")
    End If

    Dim sql As String = "SELECT a.TelNumber, c.AccountNumber " & _
            "FROM TelInfo a " & _
            "INNER JOIN Customers b ON a.CustID = b.pkguidId " & _
            "INNER JOIN Accounts c ON b.pkguidId = c.CustID " & _
            "WHERE a.TelNumber = '" & NumberToCheck & "'"
    Using conn As New SqlConnection("Data Source=.\SQLEXPRESS; Initial Catalog=Testing; Persist Security Info=True; " & _
        "User Id=JoeSoap; Password=paoseoj;")
        Dim cmd As New SqlCommand(sql, conn)

        conn.Open()
        Dim reader As SqlDataReader = cmd.ExecuteReader

        If reader.Read Then
            Value = True
            AcctNumber = reader(1)
         End If

        reader.Close()
    End Using

2010年8月2日(mm / dd / yy)より前に行われた以下のコメントについて:

ValueNumberToCheck検索された電話番号( )がデータベースに存在することを示すために関数によって返される単なるブール値です。

それで...

Private AcctNumber As String

Dim val As Boolean = False
val = CheckNumber("3235553469")
If val Then
    ' AcctNumber will have been set by CheckNumber
    Label1.Text = AcctNumber
End If

valNumberToCheck(この例では3235553469)がデータベースに存在する場合にのみTrueが返されます。

NumberToCheckの値をSSMSにコピーし、そこでクエリをテストした後、クエリが期待どおりに機能することを確認できます。

いいえ、テーブル内の情報量が多いため(+/- 9.5m行)、DataSetにデータを入力できません。'WHERE'フィルターを使用しても、クエリはリソースに負担がかかりすぎて、最終的には終了しOutOfMemory Exceptionます。そのため、DataReaderを使用しました。

ExecuteScalarDarrylの回答として提案されているオプションを試してみますが、結果が更新されます。

4

4 に答える 4

3

Try changing your If statement to

If reader.Read() Then
   Value = True
   AcctNumber = reader(1)  
End If

HasRows exhibits strange behavior in certain situations, so it's better to avoid it altogether.

于 2010-07-29T09:23:52.057 に答える
1

これで問題が解決するわけではありませんが、プレゼンテーションが完了する可能性があります。単一の値を返すときに機能する「ExecuteScalar」を使用します。

    AcctNumber = ""
    AcctNumber = cmd.ExecuteScalar
    If AcctNumber = "" Then
        Value = False
    Else
        Value = True
    End If
于 2010-07-29T12:32:46.873 に答える
0

データの問題ではないことを確認するために、SQLをパラメーター化してください。ステートメントを変更します。

Dim sql As String = "SELECT a.TelNumber, c.AccountNumber " & _
        "FROM TelInfo a " & _
        "INNER JOIN Customers b ON a.CustID = b.pkguidId " & _
        "INNER JOIN Accounts c ON b.pkguidId = c.CustID " & _
        "WHERE a.TelNumber = @telNumber"

次に、これを行います。

Dim cmd As New SqlCommand(sql, conn)
cmd.Parameters.AddWithValue("@telNumber", NumberToCheck) ' <==== added line

編集

私たちは間違った場所を見ていると思います。直前にこれを追加しますif reader.Read()

Value = false
AcctNumber = ""

これにより、可変スコープの問題が発生していないことを確認できます。(あなた使ってOption Strict Onいますよね?)

于 2010-07-29T09:58:00.500 に答える
0

ホーマーシンプソンの不滅の言葉で...「DOH!!」

アプリケーションが電話番号を検索するデータベースを調べたところ、どうしてそれを見逃したのかわかりませんが、検索している値は実際にはそこにあります。

したがって、問題は私のコードではなく、データに関係している可能性があります...

于 2010-08-02T07:57:10.650 に答える