![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Всем доброго времени суток.
Вот какая проблема: Работаю в delphi 7 данные хранятся в файле .mdb, через ADOgrid, ADOTable и остальные компоненты ADO. в таблице rss есть поле link мне нужно чтобы по этому полю искались дубликаты, проще говоря чтобы в этой таблице не было повторяющихся записей, а проверять это получится только по полю link, потому что ссылка уникальна, а остальные поля, такие как Тема - не уникальны Не могу понять как это сделать помогите... толи свойство для таблицы задать нужно, толи запрос какой написать... не понимаю я... в программе просто этот кусок кода не мой, я ни с Адо, ни с запросами не знаком... |
|
#2
|
||||
|
||||
|
Отобрать все дубликаты в таблице rss можно так:
Код:
select Link from rss group by link having Count(Link)>1 Код:
delete Link where id in (select Max(id) from rss group by Link having Count(Link)>1) |
|
#3
|
|||
|
|||
|
Огромное мерси, сейчас попробую что нить сотворить с этим
|
|
#4
|
|||
|
|||
|
блин, не получается....
Как написать нужно? ADOTable1.SQL := select Link from rss group by link having Count(Link)>1 или как? |
|
#5
|
||||
|
||||
|
Ну вы хоть с синтаксисом немножко ознакомьтесь.
Код:
ADOTable1.SQL.text := 'select Link from rss group by link having Count(Link)>1'; ADOTable1.Open; |
|
#6
|
|||
|
|||
|
неа, в обоих примерах выдает ошибку
[Error] Unit1.pas(362): Incompatible types: 'TStrings' and 'String' Пишу так: Код:
ADOQuery1.SQL := 'delete Link where id in (select Max(id) from rss group by Link having Count(Link)>1)'; ADOTable1.Open; |
|
#7
|
||||
|
||||
|
Вы сравните, то что вы написали и что я предложил. Найдите отличие.
|
|
#8
|
|||
|
|||
|
А у меня по другому не работает,
когда я пишу ADOTable1.SQL.text дельфи выдает ошибку, что SQL необъявленная переменная, а как ее объявить я не знаю, ничего похожего на ADOSQL нет, зато есть ADOQuery... |
|
#9
|
||||
|
||||
|
Давайте так. Вы сюда код свой выложите и содержимое dfm-файла. Тогда будем дальше разбираться.
|
|
#10
|
|||
|
|||
|
Хорошо =)
код: Код:
adotable1.Insert;
title.value:=_node.selectnodes('//item').item[i].selectSingleNode('title').Text;
link.value:=_node.selectnodes('//item').item[i].selectSingleNode('link').Text;
description.Value:=_node.selectnodes('//item').item[i].selectSingleNode('description').Text;
pubDate.Value:=_node.selectnodes('//item').item[i].selectSingleNode('pubDate').Text;
adotable1.Post;
countF := ADOTable1.RecordCount; // подсчет
label1.caption := IntToStr(countF) // сообщений
dfm Код:
object DBMemo1: TDBMemo
Left = 0
Top = 360
Width = 640
Height = 97
Align = alBottom
DataField = 'description'
DataSource = DataSource1
ReadOnly = True
TabOrder = 2
end
object DataSource1: TDataSource
DataSet = ADOTable1
Left = 480
Top = 56
end
object ADOTable1: TADOTable
Active = True
ConnectionString =
'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=rssbase.mdb;Persist' +
' Security Info=False'
CursorType = ctStatic
TableName = 'rss'
Left = 512
Top = 56
object title: TWideStringField
DisplayLabel = #1058#1077#1084#1072
DisplayWidth = 48
FieldName = 'title'
Size = 100
end
object link: TWideStringField
DisplayLabel = #1057#1089#1099#1083#1082#1072
DisplayWidth = 48
FieldName = 'link'
Size = 50
end
object description: TMemoField
DisplayLabel = #1054#1087#1080#1089#1072#1085#1080#1077
FieldName = 'description'
Visible = False
BlobType = ftMemo
end
object author: TWideStringField
DisplayLabel = '/'
FieldName = 'author'
Size = 15
end
object pubDate: TWideStringField
DisplayLabel = #1044#1072#1090#1072
FieldName = 'pubDate'
Size = 50
end
object ADOTable1id: TAutoIncField
FieldName = 'id'
ReadOnly = True
Visible = False
end
end
object ADOConnection1: TADOConnection
Connected = True
ConnectionString =
'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=rssbase.mdb;Persist' +
' Security Info=False'
LoginPrompt = False
Mode = cmShareDenyNone
Provider = 'Microsoft.Jet.OLEDB.4.0'
Left = 552
Top = 56
end
object ADOQuery1: TADOQuery
Parameters = <>
Left = 584
Top = 56
end
end
|
|
#11
|
|||
|
|||
|
Всем спокойной ночи! До завтра
|
|
#12
|
||||
|
||||
|
1. Ваш AdoQuery1 надо связать с ADOConnection1
2. В вашей ADOTable1 вы используете ConnectionString, у вас есть уже один AdoConnection1 его и надо использовать для ADOTable1. Так у вас получается запрос в одной сессии, а таблица в другой. 3. Мой косяк - скопировал неглядя. Вместо ADOTable1.SQL.text надо писать ADOQuery1.SQL.Text |
|
#13
|
|||
|
|||
|
Спасибо, сейчас исправлю и отпишусь
|
|
#14
|
|||
|
|||
|
Вот что получилось:
1. Сначала я понял, что, как вы написали (и я сам тоже заметил), АДОТаблица уже использует параметры подключения, значит АДОКоннект вообще не нужен. Проверил - удалил АДОКоннект - программа осталась в работоспособности. Значит он ни на что не влиял. Мой косяк - видимо когда-то добавил коннект и забыл зачем добавил... 2. Добавляю на форму программы ADOQuery из вкладки АДО. - В свойствах АДОзапроса нахожу параметр connection и настраиваю его (Provider=Microsoft.Jet.OLEDB.4.0;Data Source=rssbase.mdb;Persist Security Info=False) - Теперь в коде вставляю после ADOTable1.Post; Код:
ADOQuery.SQL.Text := 'select Link from rss group by link having Count(Link)>1'; ADOQuery.Open; Пробую по другому запросу: Код:
ADOQuery.SQL.Text := 'delete Link where id in (select Max(id) from rss group by Link having Count(Link)>1)'; ADOQuery.Open; Но еще и ошибку выдает при выполнении программы: Цитата:
Что тут может быть не так? (я использую ваш второй запрос "delete Link where id in (select Max(id) from rss group by Link having Count(Link)>1)") |
|
#15
|
||||
|
||||
|
Цитата:
Код:
ADOQuery.SQL.Text := 'select Link from rss group by link having Count(Link)>1'; ADOQuery.Open; Что-бы удалить уже имеющиеся дубликаты я вам дал второй код: Код:
ADOQuery.SQL.Text := 'delete Link where id in (select Max(id) from rss group by Link having Count(Link)>1)'; ADOQuery.ExecSQL; Теперь вы уже хотите проверять данные перед вставкой на дубликаты, а это уже третий запрос. Третьего запроса можно избежать, если вы на таблицу rss построите уникальный индекс по полю Link, но создать уникальный индекс на данные содержащие повторяющиеся значения невозможно, поэтому прежде чем его создать пропустите свои данные через запрос на удаление, о котором я писал чуть выше. Об этом я писал вам в теме из раздела БД. Последний раз редактировалось Страдалецъ, 05.04.2009 в 12:42. |