2012-12-20 49 views
2

因此,我的編碼有問題,想知道是否有人可以幫助我。查找給定範圍內的數字缺失

基本上我使用VB.NET和MSSQL在用戶設置的給定範圍之間查找缺少數字的程序。該程序將從表中讀取並在文本框中輸出結果。上面的代碼到目前爲止我可以想出。但問題是,我得到錯誤的輸出,而不是我想要的。這是輸出的image

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」。問題是我出錯了?

回答

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) 

從列表上方的創建

strString = String.Join(",", missingList.Select(x => x.ToString()).ToArray()) 
+0

我以前從未使用LINQ CSV串,u能指導我嗎? –

+0

我應該聲明「x」爲什麼? –

+0

不需要聲明x –