Ни один из приведенных вами примеров не создает QTextStream
то, что вы есть. QTextStream::QTextStream(QFile*, QIODevice::OpenModeFlag)
не существует, используйте QTextStream s1(&file)
, вы уже установили режим открытия в QFile
.
Кроме того, я заметил, что если я добавлю тест, чтобы проверить, было ли открытие файла успешным, я получу предупреждение «Отказано в доступе», даже если я просто читаю. Хотя я могу читать содержимое папки и даже заполнять QListWidget этими файлами без проблем.
Если у вас есть доступ к папке, это не значит, что вы можете прочитать содержимое файла. Если у вас есть права на чтение, и они представляют собой простые текстовые файлы, вы сможете открыть их в текстовом редакторе. Вы можете?
Добавьте первичный ключ (код ниже)
Выполните правильное удаление (код ниже)
Подумайте, ПОЧЕМУ вы не хотите сохранять этот первичный ключ.
Предполагая MSSQL. или совместимый:
ALTER TABLE Employee ADD EmployeeID int identity(1,1) PRIMARY KEY;
WHILE EXISTS (SELECT COUNT(*) FROM Employee GROUP BY EmpID, EmpSSN HAVING COUNT(*) > 1)
BEGIN
DELETE FROM Employee WHERE EmployeeID IN
(
SELECT MIN(EmployeeID) as [DeleteID]
FROM Employee
GROUP BY EmpID, EmpSSN
HAVING COUNT(*) > 1
)
END
Я не эксперт по SQL, так что несите меня . Я уверен, что вы скоро получите лучший ответ. Вот как можно найти повторяющиеся записи.
select t1.empid, t1.empssn, count(*)
from employee as t1
inner join employee as t2 on (t1.empid=t2.empid and t1.empssn = t2.empssn)
group by t1.empid, t1.empssn
having count(*) > 1
Удалить их будет сложнее, потому что в данных нет ничего, что можно было бы использовать в операторе удаления для различения дубликатов. Я подозреваю, что ответ будет включать row_number () или добавление столбца идентификаторов.
Вы можете создать временную таблицу #tempemployee
, содержащую выбрать отдельный
из вашей таблицы employee
.
Затем удалите из сотрудника
.
Затем вставьте в выбор сотрудника из #tempemployee
.
Как сказал Джош - даже если вы знаете дубликаты , их удаление будет невозможно, так как вы не можете ссылаться на конкретную запись, если это точная копия другой записи.
Используйте номер строки, чтобы различать повторяющиеся записи. Сохраните номер первой строки для EmpID / EmpSSN и удалите остальные:
DELETE FROM Employee a
WHERE ROW_NUMBER() <> ( SELECT MIN( ROW_NUMBER() )
FROM Employee b
WHERE a.EmpID = b.EmpID
AND a.EmpSSN = b.EmpSSN )
select t1.* from employee t1, employee t2 where t1.empid=t2.empid and t1.empname = t2.empname and t1.salary = t2.salary
group by t1.empid, t1.empname,t1.salary having count(*) > 1
Если вы не хотите создавать новый первичный ключ, вы можете использовать команду TOP в SQL Server:
declare @ID int
while EXISTS(select count(*) from Employee group by EmpId having count(*)> 1)
begin
select top 1 @ID = EmpId
from Employee
group by EmpId
having count(*) > 1
DELETE TOP(1) FROM Employee WHERE EmpId = @ID
end
create unique clustered index Employee_idx on Employee ( EmpId,EmpSSN ) with ignore_dup_key
Вы можете удалить индекс, если он вам не нужен.