2

だから私は私のコーディングに問題があり、誰かが私を助けることができるかどうか疑問に思っていました。

基本的に、私はVB.NETとMSSQLを使用して、ユーザーが設定した特定の範囲の間にある欠落している数値を見つけるプログラムを作成しています。プログラムはテーブルから読み取り、テキストボックスに出力を提供します。そして、上記のコードはこれまでのところ私が思いつくことができるものです。しかし、問題は、私が望むものではなく、間違った出力を取得することです。これが出力の画像です。

Function FindingMissingNumber() As String

    Dim intX As Integer = Nothing
    Dim intY As Integer = Nothing
    Dim strSting As String = Nothing
    Dim strSqlQUery As String = Nothing
    Dim cmdSqlCommand As Data.SqlClient.SqlCommand = Nothing
    Dim rdrDataReader As Data.SqlClient.SqlDataReader = Nothing

    '------------------------------------------------------------------------------------------------------------------------
    '-> Process
    '------------------------------------------------------------------------------------------------------------------------
    strSqlQUery = "Select ExReportPolicyNo From DBReport Order by ExReportPolicyNo"
    Dim msSqlConnection As New Data.SqlClient.SqlConnection()
    'NOTE - You may need to CHECK your connection string!!! in the line below
    msSqlConnection.ConnectionString = "Data Source=SISBSQL\SISBSQL;Initial Catalog=ExceptionReport;User ID=sa;Password=123;"
    cmdSqlCommand = New Data.SqlClient.SqlCommand(strSqlQUery, msSqlConnection)
    If cmdSqlCommand.Connection.State = Data.ConnectionState.Closed Then cmdSqlCommand.Connection.Open()
    rdrDataReader = cmdSqlCommand.ExecuteReader()
    If rdrDataReader.HasRows Then
        Do While rdrDataReader.Read()
            intX = txtRangeLeft.Text
            intY = txtRangeRight.Text
            'intY = rdrDataReader.GetValue(rdrDataReader.GetOrdinal("ExReportPolicyNo"))

            Do While intX <> intY
                intX = intX + 1
                If intX <> intY Then
                    strSting = strSting & intX & ", "    'if it is not, then record the non sequential number into the string
                Else
                    Exit Do
                End If
            Loop
        Loop
    End If
    If cmdSqlCommand.Connection.State = Data.ConnectionState.Open Then cmdSqlCommand.Connection.Close()
    'return string
    Return strSting
    'tidy up
    intX = Nothing
    intY = Nothing
    strSting = Nothing
    strSqlQUery = Nothing
    cmdSqlCommand = Nothing
    rdrDataReader = Nothing

End Function

ご覧のとおり、プログラムはそれを複数回ループし、間違った出力を出します。出力は「286118、286120、286121」のみを読み取る必要があります。質問はどこで間違ったのですか?

4

1 に答える 1

1

これを試してください(linqを使用)

開始値と終了値の間の行を返すようにクエリを変更します

Select distinct ExReportPolicyNo From DBReport 
Where ExReportPolicyNo between @start and @end  
Order by ExReportPolicyNo

クエリからリストを作成します。

Dim originalList as List(Of Integer)
If rdrDataReader.HasRows Then
Do While rdrDataReader.Read()
originalList.Add(rdrDataReader.GetInt(0))
Loop
End If

開始番号と終了番号から範囲のリストを作成します

//Dim rangeList = Enumerable.Range(286117, 286121 - 286117 + 1).ToList()
Dim starti = Int32.Parse(txtRangeLeft.Text)
Dim endi = Int32.Parse(txtRangeRight.Text)
Dim rangeList = Enumerable.Range(starti, endi - starti + 1).ToList()

不足している番号をすべて検索

Dim missingList = originalList.Except(rangelist)

上記のリストからCSV文字列を作成します

strString = String.Join(",", missingList.Select(x => x.ToString()).ToArray())
于 2012-12-20T04:51:04.933 に答える