2012-12-18 55 views
1

下面是一個名爲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);       
} 
+0

你必須記得在你完成測試後給你的隨機數發生器播種 –

+1

由於你正在生成密碼,你應該使用一個密碼強的隨機生成器,而不是'Random'。 – Servy

回答

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語句。

+0

可否請給我寫一個例子來幫助我理解請。如果你不介意請 – john

1

如果您在Visual Studio中使用DataContext(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(); 
+0

爲什麼'ToList'?沒有必要急切地評估整個查詢到一個單獨的數據結構來對其進行處理。 – Servy

+0

非常感謝James的回覆 – john

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

這將首先獲得所有yardcodes(假定它們是唯一的),然後設置一個隨機爲每個yardcode。

+0

如果您有很多條目,這並不能很好地擴展,您可能需要對響應進行批處理以減少網絡流量。對於較小的數據集,這是很好的。 – Servy

+0

感謝您的回覆,最有幫助!你們是偉大的 – john

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

如果你想與您可以使用下面的一個DML語句留着,

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

應該產生的每一行新的四指數遵守where語句。

+0

這很棒。你的方法完美運作。非常感謝你。你介意給我解釋代碼的含義嗎?我在 – john

+0

之前沒有使用過這種說法。 NewID() - 生成唯一標識符 - 然後我將其轉換爲VARBINARY,然後轉換爲INT。 Rand() - 生成0到1之間的隨機數(帶浮點數)。 我乘以9000的原因是因爲我需要得到浮點數 - 0.xxxxxxxx - 形式爲xxxx.xxxxxxx。它應該是10000,但我已經將它更改爲9000,並添加了1000,以確保結果編號在1000和9999之間。 希望能幫到:) –