C# 用随机数字更新多行

C# 用随机数字更新多行,c#,.net,sql,database,C#,.net,Sql,Database,下面是一个名为Password\u Click的按钮事件处理程序。当您单击此按钮时,它进入数据库并找到一个名为tblmainment的表。一旦进入表中,它会在表中找到字段Patrol=True或1的所有记录,并使用系统生成的随机4位数字更新字段Password(也在表中) 我的问题是,每一行都将使用相同的随机保护密码进行更新。我希望每行有一个不同的随机4位数字。现在它正在做我不想做的事情: 现场密码巡逻 CEP 5405 1 GNK 5405 1 ILT 5405 1 KHA 5405 1 pr

下面是一个名为
Password\u Click
的按钮事件处理程序。当您单击此按钮时,它进入数据库并找到一个名为
tblmainment
的表。一旦进入表中,它会在表中找到字段
Patrol
=True或1的所有记录,并使用系统生成的随机4位数字更新字段
Password
(也在表中)

我的问题是,每一行都将使用相同的随机保护密码进行更新。我希望每行有一个不同的随机4位数字。现在它正在做我不想做的事情:

现场密码巡逻 CEP 5405 1 GNK 5405 1 ILT 5405 1 KHA 5405 1

protected void lnkPassword_Click(object sender, EventArgs e)
{
    var random = new Random();
    var i = random.Next(1000, 9999);

    SqlHelper.ExecuteSqlNonQuery(@"update Tblmaintenance set
                                   GuardPassword = @newPassword
                                   WHERE Patrol = 1",
                                   "newPassword", i);                        
}
但我希望它能做到这一点:

现场密码巡逻 CEP45671 GNK 9000 1 ILT 4345 1 KHA 1278 1

protected void lnkPassword_Click(object sender, EventArgs e)
{
    var random = new Random();
    var i = random.Next(1000, 9999);

    SqlHelper.ExecuteSqlNonQuery(@"update Tblmaintenance set
                                   GuardPassword = @newPassword
                                   WHERE Patrol = 1",
                                   "newPassword", i);                        
}

问题在于您的SQL语句。它正在更新ManagedGuardPatrol值等于1的所有记录。每次调用click事件时,它们都将具有相同的GuardPassword值。您需要使用YardCode来标识要更新的记录

为了澄清这一点,随机数在C#中生成,并传递到SQL语句中一次。此相同的值通过所有匹配行传播

i = 4505; // a number that was randomly generated ONCE.
您的SQL语句变为:

update T2_SecurityKeyHolder 
set GuardPassword = 4501
WHERE ManagedGuardPatrol = 1
它使用一个随机值更新所有匹配记录


如果我能想出更清楚的解释方法,我会的。目前,只需说,您只生成了一个具有一个固定值的SQL语句。

问题在于您的SQL语句。它正在更新ManagedGuardPatrol值等于1的所有记录。每次调用click事件时,它们都将具有相同的GuardPassword值。您需要使用YardCode来标识要更新的记录

为了澄清这一点,随机数在C#中生成,并传递到SQL语句中一次。此相同的值通过所有匹配行传播

i = 4505; // a number that was randomly generated ONCE.
您的SQL语句变为:

update T2_SecurityKeyHolder 
set GuardPassword = 4501
WHERE ManagedGuardPatrol = 1
它使用一个随机值更新所有匹配记录

如果我能想出更清楚的解释方法,我会的。目前,只需说,您只生成了一个具有固定值的SQL语句。

如果您使用DataContext(VisualStudio中的dbml),您可以使用LINQ而不是SQL返回记录,并使用C代码编辑它们

如果您使用DataContext(VisualStudio中的dbml),则可以使用LINQ而不是SQL返回记录并使用C#代码编辑它们


解决您的问题的一个小方法可能是:

protected void lnkUpdateGuardPassword_Click(object sender, EventArgs e)
{ 
    //command = query to select all the yard codes.

    List<string> YardCodes = new List<string>();
    SqlDataReader reader = command.ExecuteReader();
    while (reader.Read())
    {
        YardCodes.Add(reader["YardCode"].ToString());
    }

    var random = new Random();
    foreach (var yardcode in YardCodes)
    {
        var i = random.Next(1000, 9999);
        SqlHelper.ExecuteSqlNonQuery(@"update T2_SecurityKeyHolder set
                               GuardPassword = @newPassword
                               WHERE YardCode = @yardcode",
                               "newPassword", yardcode, i); 
    }                       
}
protectedvoid lnkUpdateGuardPassword\u单击(对象发送方,事件参数e)
{ 
//命令=查询以选择所有车场代码。
列表码=新列表();
SqlDataReader=command.ExecuteReader();
while(reader.Read())
{
Add(reader[“YardCode”].ToString());
}
var random=新的random();
foreach(码码中的变量码码)
{
VarI=随机。下一个(10009999);
SqlHelper.ExecuteSqlNonQuery(@“更新T2_SecurityKeyHolder集
GuardPassword=@newPassword
其中YardCode=@YardCode“,
“新密码”,yardcode,i);
}                       
}

这将首先获取所有码码(假设它们是唯一的),然后为每个码码设置一个随机值。

解决问题的一个小方法可能是:

protected void lnkUpdateGuardPassword_Click(object sender, EventArgs e)
{ 
    //command = query to select all the yard codes.

    List<string> YardCodes = new List<string>();
    SqlDataReader reader = command.ExecuteReader();
    while (reader.Read())
    {
        YardCodes.Add(reader["YardCode"].ToString());
    }

    var random = new Random();
    foreach (var yardcode in YardCodes)
    {
        var i = random.Next(1000, 9999);
        SqlHelper.ExecuteSqlNonQuery(@"update T2_SecurityKeyHolder set
                               GuardPassword = @newPassword
                               WHERE YardCode = @yardcode",
                               "newPassword", yardcode, i); 
    }                       
}
protected void lnkPassword_Click(object sender, EventArgs e)
{
    SqlHelper.ExecuteSqlNonQuery(@"update Tblsecurity set
                                   Password = abs(checksum(NewId())) % 10000
                                   WHERE Patrol = 1");                        
}
protectedvoid lnkUpdateGuardPassword\u单击(对象发送方,事件参数e)
{ 
//命令=查询以选择所有车场代码。
列表码=新列表();
SqlDataReader=command.ExecuteReader();
while(reader.Read())
{
Add(reader[“YardCode”].ToString());
}
var random=新的random();
foreach(码码中的变量码码)
{
VarI=随机。下一个(10009999);
SqlHelper.ExecuteSqlNonQuery(@“更新T2_SecurityKeyHolder集
GuardPassword=@newPassword
其中YardCode=@YardCode“,
“新密码”,yardcode,i);
}                       
}
这将首先获取所有码码(假设它们是唯一的),然后为每个码设置一个随机值

protected void lnkPassword_Click(object sender, EventArgs e)
{
    SqlHelper.ExecuteSqlNonQuery(@"update Tblsecurity set
                                   Password = abs(checksum(NewId())) % 10000
                                   WHERE Patrol = 1");                        
}


如果要将其与一个DML语句一起保存,可以使用以下语句:

update tbl_Security set
                           GuardPassword = round(rand(CAST(CAST(NEWID() AS VARBINARY(4)) AS SMALLINT))* 9000,0) + 1000
                           WHERE Patrol = 1

它应该为符合where语句的每一行生成新的四位数字编号。

如果要将其保留为一个DML语句,可以使用以下命令:

update tbl_Security set
                           GuardPassword = round(rand(CAST(CAST(NEWID() AS VARBINARY(4)) AS SMALLINT))* 9000,0) + 1000
                           WHERE Patrol = 1

它应该为符合where语句的每一行生成新的四位数。

您必须记住,一旦您完成了随机数生成器的测试,就要为其设置种子,因为您正在生成密码,所以您应该使用加密功能强大的随机数生成器,不是
Random
。你必须记住,一旦你完成了随机数生成器的测试,就要为它设定种子,因为你正在生成密码,你真的应该使用加密功能强大的随机数生成器,不是
Random
。如果您有很多条目,那么它的扩展性就不太好,您可能需要批量响应以减少网络流量。对于较小的数据集,这是可以的。谢谢你的回复,非常有用!!。你们真是太棒了,如果你们有很多条目,那么这个条目的伸缩性就不太好,你们可能需要批量响应以减少网络流量。对于较小的数据集,这是可以的。谢谢你的回复,非常有用!!。你们真是太棒了为什么
ToList
?无需急于将整个查询计算到一个单独的数据结构中进行处理。感谢James的回复为什么
列表
?不需要急于在中计算整个查询