Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: как заполнить массив из dataset Добавлено: 06.06.07 13:43  

Автор вопроса:  angelnl
есть fill query "select f_id,ip from table"
я создаю массив
как его заполнить этими данными?

Ответить

  Ответы Всего ответов: 23  

Номер ответа: 1
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #1
Добавлено: 06.06.07 14:16
Dim arr(ds.Tables("Имя таблицы в ds";).Rows.Count) As String

For i As Int32 = 0 To ds.Tables("Имя таблицы в ds";).Rows.Count - 1
  Dim dr As DataRow = ds.Tables("Имя таблицы в ds";).Rows(i)
  Dim ip As String = CType(dr("ip";), String)
  arr(i) = ip
Next


Здесь ds - это ваш DataSet, Имя таблицы в ds - имя таблицы, которое
указано в параметре метода Fill экземпляра DataAdapter.

Ответить

Номер ответа: 2
Автор ответа:
 angelnl



Вопросов: 17
Ответов: 33
 Профиль | | #2 Добавлено: 06.06.07 14:36
спасибо большое только у меня Table - это представление, и ds.tables() не действует. И еще хотела просить почему в объявлении массива не вычитается единица. Сорри за глупые вопросы я совсем новичок

Ответить

Номер ответа: 3
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #3
Добавлено: 06.06.07 14:45
Кстати с объявлением массива я напутал немого. Надо было единицу
отнять. Т.к. указывается не кол-во элементов, а верхняя граница
массива, которая на еиницу меньше количества, т.к. индексация с нуля
начинается. Т.е. правильно так:

Dim arr(ds.Tables("Имя таблицы в ds";).Rows.Count - 1) As String


Насчет table я вас не понял. Покажите код, которым вы заполняете
DataSet из БД.

Ответить

Номер ответа: 4
Автор ответа:
 angelnl



Вопросов: 17
Ответов: 33
 Профиль | | #4 Добавлено: 06.06.07 15:04
значит так. есть ipview (select f_id,ip from ipview)
a=count(ip) from ipview

dim dip(a-1,1) as string
for i as int=0 to a-1
dim dr as datarow=dataset.tables("ipview";).rows(i)
dim ip as string=ctype(dr("ip";),string)
dim fid as integer=ctype(dr("f_id";),integer)
dip(i,0)=cstr(fid)
dip(i,1)=ip
next i

Мне выдается следующее сообщение
There is now row at position 0

Ответить

Номер ответа: 5
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #5
Добавлено: 06.06.07 15:11
Отправьте мне весь код, погляжу.
pavel@vbnet.ru

Ответить

Номер ответа: 6
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #6
Добавлено: 06.06.07 15:38
Так вам в массив что надо положить? Все записи из ipview?
Тогда надо делать из базы выборку всех записей ipview, а не кол-ва
записей.


        Dim mycommand As New SqlClient.SqlCommand
        mycommand.Connection = SqlConnection1
        mycommand.CommandText = "select f_id, ip from ipview"

        Dim dt As New DataTable()
        Dim da As new SqlDataAdapter(mycommand)
        da.Fill(dt)

        SqlConnection1.Close()

        'создаем массив f_id,ip

        Dim dip(dt.Rows.Count - 1, 1) As String
        For i As Integer = 0 To dt.Rows.Count - 1
            Dim myreader As SqlClient.SqlDataReader
            
            Dim dr As DataRow = dt.Rows(i)
            Dim ip As String = CType(dr("ip";), String)
            Dim fid As Integer = CType(dr("f_id";), Integer)
            dip(i, 0) = CStr(fid)
            dip(i, 1) = ip
        Next i



А вообще какая у вас конечная цель? Если нужно получить массив данных,
то лучше делать это не через DataSet/DataAdapter, а через
SqlDataReader.
А если массив не нужен, а нужно просто эти данные кк-то обработать, то
и работать с DataTable, без всяких массивов.
Какая цель?

Ответить

Номер ответа: 7
Автор ответа:
 angelnl



Вопросов: 17
Ответов: 33
 Профиль | | #7 Добавлено: 06.06.07 15:51
да.мне нужно эти данные обработать и выдать f_id, для тех, у которых найдена зависимость.Но для обработки мне нужны именно строки, чтобы их сравнивать

Ответить

Номер ответа: 8
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #8
Добавлено: 06.06.07 16:12
Ну так и делайте эти вычисления внутри цикла, перебирающего DataRow:

        For i As Integer = 0 To dt.Rows.Count - 1
            Dim dr As DataRow = dt.Rows(i)
            Dim ip As String = CType(dr("ip";), String)
            Dim fid As Integer = CType(dr("f_id";), Integer)

            'Здесь вычисляем то, что надо
        Next i

Ответить

Номер ответа: 9
Автор ответа:
 angelnl



Вопросов: 17
Ответов: 33
 Профиль | | #9 Добавлено: 06.06.07 16:34
спасибо вам большое)) но мне их надо между собой сравнивать , эти значения ip.Тогда лучше массив или просто запоминать их в переменные?

Ответить

Номер ответа: 10
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #10
Добавлено: 06.06.07 16:55
Вы лучше обрисуйте полностью, какая задача стоит.

Ответить

Номер ответа: 11
Автор ответа:
 angelnl



Вопросов: 17
Ответов: 33
 Профиль | | #11 Добавлено: 06.06.07 17:01
Вобщем теперь у меня есть массив. A строк, 2 столбца. в первом столбце id во втором ip-адреса
Мне нужно теперь как-то сравнить все IP между собой и выдать id тех IP,которые равны или у которых равны цифры до первой точки или цифры до второй точки или цифры до третьей точки.

Ответить

Номер ответа: 12
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #12
Добавлено: 06.06.07 18:01
Тогда немного модифицируем тот код, сохранив еще для каждой строки
массив из 4-х отдельных байтов IP. А вообще вместо многомерного
массива лучше массив структур использовать. Объявить структуру:

Private Sturcture IPRecord
  Dim ID As int32
  Dim IP As String
  Dim IPBytes As String()
End Structure


Код чтения данных изменим так. Надеюсь, у вас VB 2005. Иначе придется
код немного изменить.

В начале модуля на всякий случай добавим Imports:

Imports System.Collections.Generic

         Dim Count As Int32 = dt.Rows.Count
        Dim dip As New List(Of IPRecord)
        For Each dr As DataRow In dt.Rows
            Dim rec As New IPRecord
            rec.IP = CType(dr("ip";), String)
            rec.ID = CType(dr("f_id";), Integer)

            rec.IPBytes = Split(rec.IP, ".";)

            dip.Add(rec)
        Next i


Далее обработка... Для хранения итогов работы сделаем вот такую штуку:

Dim Results As New Dictionary(Of Int32, List(Of List(Of IPRecord)))
Results.Add(1, New List(Of List(Of IPRecord)))
Results.Add(2, New List(Of List(Of IPRecord)))
Results.Add(3, New List(Of List(Of IPRecord)))
Results.Add(4, New List(Of List(Of IPRecord)))


В общем, это словарь, где ключ - Int32 (будет принимать 4 значения: 1,
2, 3, 4 - кол-во совпадающих байт IP адреса), значение - коллекция
коллекций IPRecord. В вложенной коллекции будут IPRecord с
совпадающими N первых байтов адреса, в внешнем - все наборы таких
коллекций (для разных IP-адресов).


Dim CheckedIPParts As New List(Of String)
Dim ResultsByIPPart As New Dictionary(Of String, List(Of IPRecord))

For i As Int32 = 0 To Count - 1
  Dim rec As IPRecord = dip(i)

  For j As Int32 = i + 1 To Count - 1
    Dim rec2 As IPRecord = dip(j)

    'Сравниваем rec и rec2

    'Получаем кол-во совпадающих групп
    Dim EqualBytesCount As Int32 = 0
    For k As Int32 = 0 To 3
      If rec.IPBytes(k) <> rec2.IPBytes(k) Then
        Exit For
      End If

      EqualBytesCount = k + 1
    Next

    'Если есть совпадения
    If EqualBytesCount > 0 Then
      'Получаем совпадающую часть адреса (например 234.54.76 если 3
      'группы совпали)
      Dim IPPart As String = String.Join(".", rec.IPBytes, 0, EqualBytesCount)

      'Если адреса с такими же совпадающими группами не добавлялись
      'в список, то сделать это
      If Not CheckedIPParts.Contains(IPPart) Then
        Dim ThisResults As List(Of IPRecord)
        If Not ResultsByIPPart.ContainsKey(IPPart) Then
          'Адреса с такими же совпадающими группами еще не учитывались.
          'Инициализируем список, добавляем туда rec
          ThisResults = New List(Of IPRecord)
          ThisResults.Add(rec)
          ResultsByIPPart.Add(IPPart, ThisResults)
          Results(EqualBytesCount).Add(ThisResults)
        Else
          ThisResults = ResultsByIPPart(IPPart)
        End If
        'Добавляем в список rec2
        ThisResults.Add(rec2)
      End If
    End If
  Next

  'Указываем, что поиск адресов, похожих на rec,
  'уже произведен, и сова искать такие же не нужно
  Dim Part As String = ""
  For j As Int32 = 0 To 3
    Part &= "." & rec.IPBytes(j)
    If Not CheckedIPParts.Contains(Part) Then
      CheckedIPParts.Add(Part)
    End If
  Next
Next


Дальше вывод результатов пользователю.

Dim sb As New System.Text.StringBuilder()
For i = 4 To 1 Step -1
  sb.AppendFormat("---Совпадают {0} групп", i)
  sb.Append(ControlChars.CrLf)
  sb.Append(ControlChars.CrLf)
  
  For Each ThisResults As List(Of IPRecord) In Results(i)
    For Each rec As IPRecord In ThisResults
      sb.Append(rec.ID.ToString())
      sb.Append(ControlChars.CrLf)
    Next
    sb.Append(ControlChars.CrLf)
    sb.Append(ControlChars.CrLf)
  Next
  
  sb.Append(ControlChars.CrLf)
  sb.Append(ControlChars.CrLf)
Next

MessageBox.Show(sb.ToString())




Код писал в блокноте, работает или нет - не проверял, могут быть
ошибки.

Ответить

Номер ответа: 13
Автор ответа:
 angelnl



Вопросов: 17
Ответов: 33
 Профиль | | #13 Добавлено: 06.06.07 20:00
АА!! вот здорово!! спасибо! вы молодец!!! я бы такое наверное через года 3 написала!!

Ответить

Номер ответа: 14
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #14
Добавлено: 06.06.07 20:13
Не за что. Курсовую пишете, или что по делу?

Ответить

Номер ответа: 15
Автор ответа:
 angelnl



Вопросов: 17
Ответов: 33
 Профиль | | #15 Добавлено: 06.06.07 20:17
диплом - между прочим это тоже дело))

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам