SQL:如何删除&;更新表中的记录,同步';是否使用(Q)列表数据来减少数据库/表的负担?
我正在Windows7操作系统上使用Qt和MS Sql Server。SQL:如何删除&;更新表中的记录,同步';是否使用(Q)列表数据来减少数据库/表的负担?,sql,sql-server,list,qt,qsqlquery,Sql,Sql Server,List,Qt,Qsqlquery,我正在Windows7操作系统上使用Qt和MS Sql Server。 我拥有一个MS-SQL数据库,用于存储来自某些车辆上安装的设备的数据/信息。 数据库中有一个名为TransactionFilesInfo的表,该表用于存储设备连接到TCP服务器时的事务文件信息。 我们使用此表是为了避免重复文件。当远程设备在将事务文件发送到服务器后不删除事务文件时(有时)。因此,我使用表中的信息检查[大小和CRC]以避免下载重复项。 交易文件信息表的一些示例数据如下所示: [TransactionFilesI
我拥有一个MS-SQL数据库,用于存储来自某些车辆上安装的设备的数据/信息。
数据库中有一个名为
TransactionFilesInfo
的表,该表用于存储设备连接到TCP服务器时的事务文件信息。我们使用此表是为了避免重复文件。当远程设备在将事务文件发送到服务器后不删除事务文件时(有时)。因此,我使用表中的信息检查
[大小和CRC]
以避免下载重复项。交易文件信息表的一些示例数据如下所示:
[TransactionFilesInfo]:
DeviceID FileNo FileSequence FileSize FileCRC RecordTimeStamp
10203 2 33 230 55384 2015-11-26 14:54:15
10203 7 33 624 55391 2015-11-26 14:54:15
10203 2 34 146 21505 2015-11-26 14:54:16
10203 7 34 312 35269 2015-11-26 14:54:16
10203 2 35 206 23022 2015-11-26 15:33:22
10203 7 35 208 11091 2015-11-26 15:33:22
10203 2 36 134 34918 2015-11-26 15:55:44
10203 7 36 104 63865 2015-11-26 15:55:44
10203 2 37 140 35466 2015-11-26 16:20:38
10203 7 37 208 62907 2015-11-26 16:20:38
10203 2 38 134 17706 2015-11-26 16:38:33
10203 7 38 104 42358 2015-11-26 16:38:33
11511 2 21 194 29913 2015-12-02 16:22:59
11511 7 21 114 30038 2015-12-02 16:22:59
struct FileInfo
{
unsigned short FileNumber;
unsigned short FileSequence;
unsigned short FileCRC;
unsigned long FileSize;
};
另一方面,每次设备连接到服务器时,它首先发送一个文件信息列表。Qt应用程序会处理这个问题。列表包含如下元素:
[TransactionFilesInfo]:
DeviceID FileNo FileSequence FileSize FileCRC RecordTimeStamp
10203 2 33 230 55384 2015-11-26 14:54:15
10203 7 33 624 55391 2015-11-26 14:54:15
10203 2 34 146 21505 2015-11-26 14:54:16
10203 7 34 312 35269 2015-11-26 14:54:16
10203 2 35 206 23022 2015-11-26 15:33:22
10203 7 35 208 11091 2015-11-26 15:33:22
10203 2 36 134 34918 2015-11-26 15:55:44
10203 7 36 104 63865 2015-11-26 15:55:44
10203 2 37 140 35466 2015-11-26 16:20:38
10203 7 37 208 62907 2015-11-26 16:20:38
10203 2 38 134 17706 2015-11-26 16:38:33
10203 7 38 104 42358 2015-11-26 16:38:33
11511 2 21 194 29913 2015-12-02 16:22:59
11511 7 21 114 30038 2015-12-02 16:22:59
struct FileInfo
{
unsigned short FileNumber;
unsigned short FileSequence;
unsigned short FileCRC;
unsigned long FileSize;
};
因此,作为一个示例(受上表启发),连接的设备(DeviceID=10203
)可能会说它有以下文件:
QList<FileInfo> filesList;
// here is the log4qt output...
filesList[0] --> FileNo=2 FileSeq=33 FileSize=230 and FileCRC=55384
filesList[1] --> FileNo=2 FileSeq=34 FileSize=146 and FileCRC=21505
filesList[2] --> FileNo=7 FileSeq=33 FileSize=624 and FileCRC=55391
filesList[3] --> FileNo=7 FileSeq=34 FileSize=312 and FileCRC=35269 ...
QList文件列表;
//这是log4qt输出。。。
filesList[0]-->FileNo=2 FileSeq=33 FileSize=230和FileCRC=55384
filesList[1]-->FileNo=2 FileSeq=34 FileSize=146和FileCRC=21505
filesList[2]->FileNo=7 FileSeq=33 FileSize=624和FileCRC=55391
filesList[3]-->FileNo=7 FileSeq=34 FileSize=312和FileCRC=35269。。。
嗯,我需要的是一种方法来删除/删除,对于给定的DeviceID
,TransactionFilesInfo
表中的所有记录,这些记录不在远程设备发送的列表中。因此,我将能够减少数据库表的负担(大小)
备注:目前我只是根据RecordTimeStamp
字段删除(@午夜)所有超过10天的记录。因此,表的大小不会增加到令人震惊的程度:)
最后,澄清一下:我主要需要SQL方面的帮助。然而,我不会拒绝任何关于如何在Qt方面做一些相关事情/技巧的想法;) 删除这些记录的SQL可能如下所示:
DELETE FROM [SAMPLE DATA]
WHERE DeviceID = 10203
and 'File' + CONVERT(varchar(11),FileNo) + '_' +
RIGHT('000' + CONVERT(varchar(11),FileSequence),3)
NOT IN ('File2_033','File2_034','File7_033','File7_034',...)
如果要删除某个设备的所有文件,可以删除查看FileNo和FileSequence的代码,以便:
DELETE FROM [SAMPLE DATA]
WHERE DeviceID = 10203
您没有提供足够的信息来给出完整的答案,但是如果您正在寻找一些可以构建的SQL来删除这些记录,那么它可能是这样的:
delete FROM[SAMPLE DATA],其中DeviceID=10203和'File'+CONVERT(varchar(11),FileNo)+'''++RIGHT('000'+CONVERT(varchar(11),FileSequence),3)不在('File2_033'、'File2_034'、'File7_033'、'File7_034'、…)
为了提供完整的描述,我应该添加哪些其他信息?你的直觉很好:我的Qt技能还行,但我缺乏SQL和相关知识……所以,是的:你的答案很有用。为什么你把它作为评论而不喜欢答案?反正我投了赞成票,明天我会尝试在我的Qt应用程序中实现你的想法(我现在不在办公室……)。我想我只是不熟悉什么是QT,但它似乎是您的开发语言。在您的问题中,定义这其中的哪一部分需要帮助会很有帮助。例如,您是否需要一些SQL或代码来解析log4qt输出中的文本,然后将标记限制在这一范围内。如果您更具体,您将获得更多帮助请看这个链接。答案很简单:我主要需要SQL方面的帮助。但我不会拒绝任何关于如何在Qt方面做一些相关事情/技巧的想法。顺便说一句:Qt是一个跨平台应用程序框架,用于使用GUI(在C++中)开发应用程序软件.而且…log4qt只是一个愚蠢的日志记录器,不需要麻烦…当列表为空时,我假设您希望删除DeviceID的所有日志。在这种情况下,只需将SQL更改为只使用其中DeviceID=???
。