Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 合并数据库表唯一字段问题_C#_Winforms_Visual Studio_Ms Access - Fatal编程技术网

C# 合并数据库表唯一字段问题

C# 合并数据库表唯一字段问题,c#,winforms,visual-studio,ms-access,C#,Winforms,Visual Studio,Ms Access,我有一个程序(我无法更改,它是由其他开发人员编写的音乐应用程序),它使用两个access 97'数据库。其中一个数据库是“播放列表”数据库,有两个表“播放名称”和“播放歌曲” “PlayNames”表有一个自动递增的、唯一的、长类型的PrimaryKey“autoID”列、“PlayName”字符串列(保存每个播放列表的名称)和一个“isServerPlaylist”布尔列(定义播放列表是由用户创建的还是从服务器发送的) “PlaySongs”表有一个自动递增、唯一的PrimaryKey“aut

我有一个程序(我无法更改,它是由其他开发人员编写的音乐应用程序),它使用两个access 97'数据库。其中一个数据库是“播放列表”数据库,有两个表“播放名称”和“播放歌曲”

“PlayNames”表有一个自动递增的、唯一的、长类型的PrimaryKey“autoID”列、“PlayName”字符串列(保存每个播放列表的名称)和一个“isServerPlaylist”布尔列(定义播放列表是由用户创建的还是从服务器发送的)

“PlaySongs”表有一个自动递增、唯一的PrimaryKey“autoID”列、“PlayId”列是指向上一个表“autoID”字段的外键,“TrackID”列是指向保存歌曲信息的另一个表的外键

这是两个表中的记录的外观:

“播放名”

autoID:01播放名称:Rock IsServer播放列表:True

autoID:02播放名称:Pop IsServer播放列表:True

“播放歌曲”

自动识别码:01播放识别码:01轨迹识别码:100

自动识别码:02播放识别码:01轨迹识别码:101

自动识别码:03播放识别码:01曲目识别码:102

自动识别码:04播放识别码:02曲目识别码:103

自动识别码:05播放识别码:02曲目识别码:104

自动识别码:06播放识别码:02曲目识别码:105

这意味着有2个当前播放列表,摇滚和流行,每个由3首曲目组成

现在,有了数据库的客户端和服务器端副本。客户端数据库包含服务器的播放列表副本以及客户端将添加/创建的任何播放列表。服务器端的播放列表也会更新

假设服务器播放列表是这两个摇滚乐。如果用户添加/创建新的播放列表,则将在客户端数据库中添加播放名称表上的新记录,其中autoID=03,客户端将选择播放名称,isServerPlaylist字段=false。在播放列表中,将添加与客户端选择添加到播放列表中的歌曲数量相同的记录。playlid列将为03

服务器也会更新其播放列表,因此,在服务器上进行更新后,我可能会添加/创建一个新的播放列表,该列表将在播放列表名称表autoID=03中包含我将选择的播放列表名称,并且isServerSide列设置为true


我想做的是合并这些播放列表,这样当服务器端添加新的播放列表时,当客户端创建了自己的播放列表时,合并的播放列表名称表的AutoID主键列将具有唯一的值。这就是我被困的地方。你们能指出一个可以做到这一点的方法吗

我假设服务器端处理超出了您的能力范围?(即合并两个播放列表?)

在这种情况下,我建议,当用户离线创建播放列表时,它会自动检查服务器上是否已经有类似的播放列表。
从那里开始,您可以下载现有的serverplaylist,然后添加到其中。或者,您也可以检查服务器播放列表上的最高ID,并确保脱机播放列表从(maximumIDserverside+1)开始。

更简单。将isServerPlaylist字段添加到主键并播放。

感谢您的回复。是的,由于该问题,目前没有合并播放列表数据库,唯一的更新是在歌曲上进行的,这是一个硬编码更新,通过检查两个数据库是否有不同的记录计数来完成。如果是这样,将下载客户端数据库中丢失的歌曲,并删除表并使用新条目重新创建。不过,这种方法存在一个问题,该应用程序是一个用于咖啡店、酒吧等的连续音乐播放器。如果同时发生歌曲混音(当数据库被删除时,播放器中的下一首歌曲尝试播放),则删除和重新创建表格可能会导致播放器停止播放。到目前为止,这家公司还没有遇到过这样的问题,放弃和娱乐需要第二次考虑。但这并不是最好的方法。问题是播放列表是在其他开发人员创建的应用程序中创建/添加的,数据库也从该应用程序更新,这意味着我不能“播放”在任何一个表上使用自动递增步骤。我将尝试将两个表合并到一个表中,使播放列表歌曲表数据与它们所属的播放列表位于同一记录中。然后将数据再次拆分为两个表。对,我上一次说的没有多大意义,因为播放列表歌曲的数量不是静态的。一个播放列表可以有20首歌曲,另一个可以有更少或更多,所以我真的不知道要添加多少列到tmp表中,以保存这两个表中的所有数据。这可能有效,但不是最好的解决方案。当客户端试图在播放列表中添加比我在临时表中创建的列更多的歌曲来保存每个播放列表中的歌曲时,可能会出现问题。我明天试试。这是一个临时解决方案,我正在为该公司开发新的解决方案。你为什么要使用列将歌曲添加到播放列表中?我建议在播放列表和歌曲之间建立1-*关系,并在歌曲表中添加歌曲所属播放列表的ID。这样,您可以添加任意数量的歌曲。更多的歌曲=更多的行,而不是列。怎么会这样?对不起,我可能误解了你的建议。将主键添加到另一个字段是什么意思?你的意思是我应该将isServerSide设置为主键吗?不。你的主键应该是audioID和isServerPlaylist(两者都是),对,这里是数据库新手。我不知道我可以将两个字段设置为一个主键。我不明白这会有什么帮助。您能解释一下吗?您将有成对的audioID和isServerPlaylist,分别为[1,YES]和[1,NO]。换句话说,每个audioID可以在数据库中存在两次。