1

以下は、 というボタン イベント ハンドラPassword_Clickです。このボタンをクリックすると、データベースに入り、 というテーブルが見つかりますTblMaintenance。テーブルに入ると、フィールドPatrol= True または 1であるテーブル内のすべてのレコードが検索Passwordされ、システムが生成した 4 桁の乱数でフィールド (テーブル内) が更新されます。

私の問題は、各行が同じランダムガードパスワードで更新されることです。各行に異なる4桁の乱数を持たせたい。現時点では、これを実行したくありません。

SITE パスワードパトロール CEP 5405 1 GNK 5405 1 ILT 5405 1 KHA 5405 1

しかし、代わりにこれを行いたい:

SITE パスワードパトロール 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

1つのDMLステートメントでそれを保持したい場合は、以下を使用できます。

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

whereステートメントに準拠する行ごとに新しい4桁の数字を生成する必要があります。

于 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) を使用する場合、SQL ではなく LINQ を使用してレコードを取得し、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
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 に答える
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

これにより、一致するすべてのレコードが1 つのランダム値で更新されます。

もっと分かりやすく説明できる方法があれば、そうします。ここでは、1 つの固定値を持つ 1 つの SQL ステートメントのみを生成しているとだけ言っておきましょう。

于 2012-12-18T16:17:12.677 に答える