none
請問如何用遞迴將 資料庫的某一傳銷會員所有下線資料全部撈出 並轉成文字檔或excel RRS feed

  • 問題

  • 各位應該對 傳銷制度有上下線關係有點概念 我想要找出例如:會員號碼:0003 的所有下線 但是不知該如何做 請各位高手幫幫忙 感激!!
    以下是部份程式

     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
                   search(aa)
                  End Sub

        Private Sub search(ByVal aa())

            Dim begin As String = Me.TextBox1.Text
            
            Dim conn As New SqlConnection()
            conn.ConnectionString = "Data Source=(local);initial catalog=nhi;user id=test;password=test;persist security info=True;workstation id=testuser;"
            Dim selectquery As String = "select dist_id, dis_dist_id, dist_name from dist where dis_dist_id='" & begin & "'"

            'dist_id 會員號碼 ,  dis_dist_id上線號碼(也就是推薦人代號)

            Dim cmd As New SqlCommand(selectquery, conn)
            selectquery = "select sum(1) FROM dist where dis_dist_id='" & begin & "'"
            Dim cmd1 As New SqlCommand(selectquery, conn)
            Dim reader As SqlDataReader
            Dim previousConnectionState As ConnectionState = conn.State
            Dim rowcounts As Integer


            Try
                If conn.State = ConnectionState.Closed Then
                    conn.Open()
                End If
                rowcounts = cmd1.ExecuteScalar()
                If rowcounts = 0 Then
                    Return
                End If

            Catch ex As Exception
            End Try
          
            Dim alist(rowcounts) As List
            Try
                If conn.State = ConnectionState.Closed Then
                    conn.Open()
                End If
                reader = cmd.ExecuteReader()
                Dim i As Integer = 0

                Dim t As ArrayList
                Using reader
                    While reader.Read

                        t.Add(reader(0))//這裡會出現錯誤訊息
                                           
                    End While
                End Using

            Finally
                If previousConnectionState = ConnectionState.Closed Then
                    conn.Close()
                End If
            End Try

         Dim i As Integer = 0
            For i = 0 To rowcounts
                If i > rowcounts - 1 Then
                    Return
               Else : Return search(aa(i))))//這裡會出現錯誤訊息

               End If
            Next
           

        End Sub

    2009年6月4日 上午 11:26

解答

  • debralin:
        我試過是正常的啊
        MyCmd.Parameters.AddWithValue("@dis_list_id", strID) ==>就是傳入的上線ID
        TextBox2.Text &= MydataReader("d_list_id")  =>這個則是取得的下線,我試過三層都沒問題
        example:
        假設第一層是 A 
        A的直接下線有 B, C ,D
        B的直接下線有 E, G
        C的直接下線有 H
        所以現在查 A的所有下線, 在TextBox1輸入 A =>傳入 SearchNode(ByVal strID As String)
        DataReader(第一個,條件為A) 會先找到第一筆 B ,列入 TextBox2中,然後就把 B 傳給 SearchNode(ByVal strID As String)
        DataReader(第二個,條件為B) 會先找到 E ,然後把E 傳給 SearchNode(ByVal strID As String) 
        DataReader(第三個,條件為E)  因為沒有下線,所以回到第二個DataReader(第二個,條件為B) ,找下一筆,就會找到G ,然後把G 傳給 SearchNode(ByVal strID As String) 
         DataReader(第四個,條件為G),因為沒有下線,所以回到第二個DataReader(第二個,條件為B) ,因為沒有下一筆了,所以會回到 第一個DataReader(第一個,條件為A),找到下一筆 C ...就這樣一直到結束.

      程式下載:http://files.dotblogs.com.tw/billchung/0906/200965143728400.rar
      <資料表的圖片>
    2009年6月5日 上午 06:29
    版主

所有回覆

  • debralin1:
        我試著寫了一段供你參考,資料庫只有兩個欄位dist_id , dis_dist_id(上線號碼) ,兩個攔位都是VarChar
        其中TextBox2的multiline屬性為True
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            TextBox2.Text = ""
            If Len(TextBox1.Text) > 0 Then
                SearchNode(TextBox1.Text)
            End If
        End Sub
        Private Sub SearchNode(ByVal strID As String)
            Dim strConn As String = "Server=LocalHost\SQLExpress;Database=_testDB;User ID=abc;password=abc"
            Dim MyConn As SqlConnection = New SqlConnection(strConn)
            Dim MydataReader As SqlDataReader
            Dim mySQLCmd As String = "Select d_list_id from Table_03 Where dis_list_id=@dis_list_id"
            Dim MyCmd As New SqlClient.SqlCommand(mySQLCmd, MyConn)
            MyCmd.Parameters.Clear()
            MyCmd.Parameters.AddWithValue("@dis_list_id", strID)
            MyConn.Open()
            MydataReader = MyCmd.ExecuteReader()
            While MydataReader.Read()
                TextBox2.Text &= MydataReader("d_list_id") & vbCrLf
                SearchNode(MydataReader("d_list_id"))
            End While
            MydataReader.Close()
            MyConn.Close()
        End Sub
       
        
    2009年6月4日 下午 01:21
    版主
  • Bill 您好~請問一下 您程式中的textbox1  和textbox2分別是放了什麼值進去
    這個部份有點看不董 請幫忙說明一下吧 感謝唷~
    2009年6月5日 上午 02:34
  • TextBox1是要搜尋的上線號碼,TextBox2是找到的下線會員號碼
    2009年6月5日 上午 02:41
  • Victor:
       Joe大已經幫我答了,哈,先謝謝Joe大.
       你如果要自己測試的話,可以在資料庫開一個資料表,具備兩個欄位
       dist_id : varchar(50) :代表本會員的代碼
       dis_dist_id : varchar(50) :代表本會員的上線代碼 ,若是無上線者則為空白
       假設有一個會員 A ,他的直接下線是 B,C,D ,然後B的下線是 E,F
       你在TextBox1輸入 A後執行就會得到 B,E,F,C,D的結果
       

    2009年6月5日 上午 02:58
    版主
  • Bill 大
    謝謝你的回覆 但是我試過 依然只能跑出第一層的直接下線,再往下的不行.麻煩再幫幫忙 謝謝
    另外想確認以下幾個變數
    MyCmd.Parameters.AddWithValue("@dis_list_id", strID)-->@dis_list_id是下線會員代碼嗎?

    TextBox2.Text &= MydataReader("d_list_id") & vbCrLf-->d_list_id是下線會員代碼嗎?
                SearchNode(MydataReader("d_list_id"))
    2009年6月5日 上午 06:15
  • debralin:
        我試過是正常的啊
        MyCmd.Parameters.AddWithValue("@dis_list_id", strID) ==>就是傳入的上線ID
        TextBox2.Text &= MydataReader("d_list_id")  =>這個則是取得的下線,我試過三層都沒問題
        example:
        假設第一層是 A 
        A的直接下線有 B, C ,D
        B的直接下線有 E, G
        C的直接下線有 H
        所以現在查 A的所有下線, 在TextBox1輸入 A =>傳入 SearchNode(ByVal strID As String)
        DataReader(第一個,條件為A) 會先找到第一筆 B ,列入 TextBox2中,然後就把 B 傳給 SearchNode(ByVal strID As String)
        DataReader(第二個,條件為B) 會先找到 E ,然後把E 傳給 SearchNode(ByVal strID As String) 
        DataReader(第三個,條件為E)  因為沒有下線,所以回到第二個DataReader(第二個,條件為B) ,找下一筆,就會找到G ,然後把G 傳給 SearchNode(ByVal strID As String) 
         DataReader(第四個,條件為G),因為沒有下線,所以回到第二個DataReader(第二個,條件為B) ,因為沒有下一筆了,所以會回到 第一個DataReader(第一個,條件為A),找到下一筆 C ...就這樣一直到結束.

      程式下載:http://files.dotblogs.com.tw/billchung/0906/200965143728400.rar
      <資料表的圖片>
    2009年6月5日 上午 06:29
    版主
  • 感謝 Bill 大大 !!
    已經試成功了 謝謝!!
    2009年6月5日 上午 08:07