使用随机数字更新多行

时间:2012-12-18 16:09:28

标签: c# .net sql database

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

我的问题是每行都会使用相同的随机保护密码进行更新。我希望每一行都有一个不同的随机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);                        
}

5 个答案:

答案 0 :(得分:2)

如果您想使用一个DML语句保留它,可以使用以下内容:

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

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

答案 1 :(得分: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();

答案 2 :(得分: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); 
    }                       
}

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

答案 3 :(得分:0)

问题是你的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语句。

答案 4 :(得分: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");                        
}