Страница: 1 | 2 |
Вопрос: как заполнить массив из dataset
Добавлено: 06.06.07 13:43
Автор вопроса: angelnl
есть fill query "select f_id,ip from table"
я создаю массив
как его заполнить этими данными?
Ответы
Всего ответов: 23
Номер ответа: 1
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #1
Добавлено: 06.06.07 14:16
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-сайт:
Профиль | | #3
Добавлено: 06.06.07 14:45
Кстати с объявлением массива я напутал немого. Надо было единицу
отнять. Т.к. указывается не кол-во элементов, а верхняя граница
массива, которая на еиницу меньше количества, т.к. индексация с нуля
начинается. Т.е. правильно так:
Насчет 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-сайт:
Профиль | | #5
Добавлено: 06.06.07 15:11
Отправьте мне весь код, погляжу.
pavel@vbnet.ru
Номер ответа: 6
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #6
Добавлено: 06.06.07 15:38
Так вам в массив что надо положить? Все записи из ipview?
Тогда надо делать из базы выборку всех записей ipview, а не кол-ва
записей.
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-сайт:
Профиль | | #8
Добавлено: 06.06.07 16:12
Ну так и делайте эти вычисления внутри цикла, перебирающего DataRow:
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-сайт:
Профиль | | #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-сайт:
Профиль | | #12
Добавлено: 06.06.07 18:01
Тогда немного модифицируем тот код, сохранив еще для каждой строки
массив из 4-х отдельных байтов IP. А вообще вместо многомерного
массива лучше массив структур использовать. Объявить структуру:
Dim ID As int32
Dim IP As String
Dim IPBytes As String()
End Structure
Код чтения данных изменим так. Надеюсь, у вас VB 2005. Иначе придется
код немного изменить.
В начале модуля на всякий случай добавим Imports:
Imports System.Collections.Generic
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
Далее обработка... Для хранения итогов работы сделаем вот такую штуку:
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
Дальше вывод результатов пользователю.
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-сайт:
Профиль | | #14
Добавлено: 06.06.07 20:13
Не за что. Курсовую пишете, или что по делу?
Номер ответа: 15
Автор ответа:
angelnl
Вопросов: 17
Ответов: 33
Профиль | | #15
Добавлено: 06.06.07 20:17
диплом - между прочим это тоже дело))