Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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# 使用客户编号SQL防止双重投票_C#_Sql Server - Fatal编程技术网

C# 使用客户编号SQL防止双重投票

C# 使用客户编号SQL防止双重投票,c#,sql-server,C#,Sql Server,我正在制作一个投票系统,用户可以对sql数据库中的其他用户条目进行上下投票。每个用户都会收到一个唯一的8位客户编号,他们可以使用该编号进行投票,因为该客户编号是表中的主键 我试图通过在已投票栏中输入用户的客户编号来防止用户对同一条目进行两次投票。但是,我不知道如何继续将客户编号添加到同一投票列中,并通过查找客户编号是否包含在下面代码中的投票列中来防止双重投票。您将看到,我已尝试CHARINDEX查找投票列中是否已存在8位客户编号,但这不起作用 我的代码: this.companyName = C

我正在制作一个投票系统,用户可以对sql数据库中的其他用户条目进行上下投票。每个用户都会收到一个唯一的8位客户编号,他们可以使用该编号进行投票,因为该客户编号是表中的主键

我试图通过在已投票栏中输入用户的客户编号来防止用户对同一条目进行两次投票。但是,我不知道如何继续将客户编号添加到同一投票列中,并通过查找客户编号是否包含在下面代码中的投票列中来防止双重投票。您将看到,我已尝试CHARINDEX查找投票列中是否已存在8位客户编号,但这不起作用

我的代码:

this.companyName = Convert.ToString(e.CommandArgument);
string upvoteUpdateQuery = "UPDATE dbo.clientDataTable SET upvote = upvote + 1 WHERE compName = @compName";

SqlCommand Upvote = new SqlCommand(upvoteUpdateQuery, voteDb);
Upvote.Parameters.AddWithValue("@compName", this.companyName);

string insertQuery = "IF CHARINDEX ('voted','@voted') != 8 UPDATE dbo.clientDataTable SET voted += @voted)"
+ "WHERE compName = @compName ELSE PRINT 'Error, duplicate vote'"; //prevents double voting by seeing if all 8 digits by customer number match, if they don't it works else print
//checks if voted customers id exists using charindex, if it doesn't then vote will happen

SqlCommand insertVoterDetailsUpvote = new SqlCommand(insertQuery, voteDb); //inserts voter information into specific entries table
insertVoterDetailsUpvote.Parameters.AddWithValue("@voted", custVoteTextBox.Text);
insertVoterDetailsUpvote.Parameters.AddWithValue("@compName", this.companyName);

voteDb.Open();
Upvote.ExecuteNonQuery();
voteDb.Close(); 

您绝对不应该将任意数量的ID打包到单个字符列中


更好的模式是一个投票表,例如dbo.Vots,其中列用于引用条目和投票用户,例如EntryId、VoterUserId,以及一个投票列,例如vote。在条目和投票用户上包含唯一约束,以防止重复和使用。。。EXISTS从dbo中选择*进行投票,其中EntryId=@EntryId和VoterUserId=@VoterUserId检查用户是否已对条目进行投票。

您可以尝试EXISTS关键字。如果存在,请从表中选择*,其中articleID=x和VotedUser=Y开始…结束您可以在表上的voted和compName上创建一个唯一索引,并在2次投票时捕获异常。围绕更新和插入创建一个事务,如果两者都没有问题,则提交它,如果发生异常,则回滚它并向用户返回错误消息。您不能使用来实现此效果吗?向我们显示您的表定义。这就是问题所在。请在sql模式中提供DDL。