1

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

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

站点密码巡逻 CEP 5405 1 GNK 5405 1 ILT 5405 1 KHA 5405 1

但我希望它这样做:

站点密码巡逻 CEP 4567 1 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);                        
}
4

5 回答 5

2

如果你想用一个 DML 语句保留它,你可以使用以下命令:

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

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

于 2012-12-18T16:42:50.257 回答
1

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

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); 
    }                       
}

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

于 2012-12-18T16:28:50.563 回答
1

如果您使用 DataContext(Visual Studio 中的 dbml),您可以使用 LINQ 而不是 SQL 来恢复记录并使用 C# 代码对其进行编辑。

DatabaseDataContext db = new DatabaseDataContext();

foreach(T2_keyHolderMaintenance t2 in (from t2 in db.T2_keyHolderMaintenances where t2.ManageGuardPatrol == true select t2).ToList())
{
   t2.GuardPassword = Math.Random() //or whatever you want to do
}

db.SubmitChanges();
于 2012-12-18T16:20:45.717 回答
0

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

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

i = 4505; // a number that was randomly generated ONCE.

您的 SQL 语句变为:

update T2_SecurityKeyHolder 
set GuardPassword = 4501
WHERE ManagedGuardPatrol = 1

它用一个随机值更新所有匹配的记录。

如果我能想到一个更清晰的方式来解释它,我会的。目前,可以说,您只生成了一个具有一个固定值的 SQL 语句。

于 2012-12-18T16:17:12.677 回答
0
protected void lnkPassword_Click(object sender, EventArgs e)
{
    SqlHelper.ExecuteSqlNonQuery(@"update Tblsecurity set
                                   Password = abs(checksum(NewId())) % 10000
                                   WHERE Patrol = 1");                        
}

或者

protected void lnkUpdateGuardPassword_Click(object sender, EventArgs e)
{
    SqlHelper.ExecuteSqlNonQuery(@"update Tblsecurity set
                                   Password = ROUND(((9999 - 1000 -1) * RAND() + 1000), 0)
                                   WHERE Patrol = 1");                        
}
于 2012-12-18T16:42:39.517 回答