0

私はこの Update メソッドを持っています。SQL ステートメントが正しいかどうかを修正してください。ID 番号を更新して、データベース内の既存の ID 番号に変更しようとしたため、エラー トラップを試みることなく更新されます。

私のコードは次のとおりです。

    public void Update()
    {
        sc.Open();

        try
        {
            using (cmd = new SqlCommand(@"UPDATE TableVotersInfo SET Education=@ed, idnum=@idnum, FirstName=@firstname, MiddleName=@middlename, LastName=@lastname, SchoolYear=@schoolyear, ControlNum=@controlnum WHERE id=@id
                                    SELECT @ed, @idnum, @firstname, @middlename, @lastname, @schoolyear, @controlnum
                                    WHERE @id NOT IN (SELECT idNum FROM TableVotersInfo);", sc))
            {
                cmd.Parameters.AddWithValue("@id", _id);
                cmd.Parameters.AddWithValue("@ed", _ed);
                cmd.Parameters.AddWithValue("@idnum", _idnum);
                cmd.Parameters.AddWithValue("@firstname", _firstname);
                cmd.Parameters.AddWithValue("@middlename", _middlename);
                cmd.Parameters.AddWithValue("@lastname", _lastname);
                cmd.Parameters.AddWithValue("@schoolyear", _schoolyear);
                cmd.Parameters.AddWithValue("@controlnum", _controlnum);

                SqlDataReader reader = cmd.ExecuteReader();
                if(reader.Read())
                {
                    MessageBox.Show("ID number already exist!");
                    FAddVoters._cleardata = "0";
                    FAddVoters._checkID = checkID;
                }
                else
                {
                    MessageBox.Show("Data Successfully Updated!");
                    FAddVoters._cleardata = cleardata;
                    FAddVoters._checkID = "0";
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        {
            sc.Close();
        }
    }

どこで何が間違っているのか教えてください。

(編集)

主キー
(出典: akamaihd.net )

4

1 に答える 1

1

このUPDATEコマンドは にレコードを返しません。 はコマンドReadExecuteReaderのみ使用されSELECTます。通常どおり更新して、何か問題があるかどうかを知るためにExecuteNonQuery使用できます。try-catch

public void Update()
{
    sc.Open();
    try {
        using (cmd = new SqlCommand(@"UPDATE TableVotersInfo SET Education=@ed, idnum=@idnum, FirstName=@firstname, MiddleName=@middlename, LastName=@lastname, SchoolYear=@schoolyear, ControlNum=@controlnum WHERE id=@id
                                SELECT @ed, @idnum, @firstname, @middlename, @lastname, @schoolyear, @controlnum
                                WHERE @id NOT IN (SELECT idNum FROM TableVotersInfo);", sc))
        {
            cmd.Parameters.AddWithValue("@id", _id);
            cmd.Parameters.AddWithValue("@ed", _ed);
            cmd.Parameters.AddWithValue("@idnum", _idnum);
            cmd.Parameters.AddWithValue("@firstname", _firstname);
            cmd.Parameters.AddWithValue("@middlename", _middlename);
            cmd.Parameters.AddWithValue("@lastname", _lastname);
            cmd.Parameters.AddWithValue("@schoolyear", _schoolyear);
            cmd.Parameters.AddWithValue("@controlnum", _controlnum);

            cmd.ExecuteNonQuery();// <-- this is what you want
            MessageBox.Show("Data Successfully Updated!");
            FAddVoters._cleardata = cleardata;
            FAddVoters._checkID = "0";
        }
    } catch (SqlException ex) {
        if(ex.Number == 2627)//duplicated primary key 
        {
           MessageBox.Show("ID number already exist!");
           FAddVoters._cleardata = "0";
           FAddVoters._checkID = checkID;
        } else {
           MessageBox.Show("There was some error while attempting to update!\nTry again later.");
        }
    }
    finally {
        sc.Close();
    }
}

アップデート

主キーとして作成できない場合idnum(何らかの設計上の理由により)、次のようなクエリを実行して存在を確認する必要があります。

public bool ExistsKey(string keyField, string table, string value, SqlConnection con){      
  try {
   if(con.State != ConnectionState.Open) con.Open();
   using(SqlCommand com = new SqlCommand(
                string.Format("IF EXISTS(SELECT * FROM {0} WHERE {1}='{2}') SELECT 1 ELSE SELECT 0", 
                             table, keyField, value), con)){
     var result = com.ExecuteScalar();
     return result != null && (int)result == 1;
   }
  } catch {
    return false;
  }
  finally {
    con.Close();
  }      
}
//Then use that method in your code like this:

if(ExistsKey("idnum", "TableVotersInfo", _idnum.ToString(), sc)){
  MessageBox.Show("ID number already exist!");
  FAddVoters._cleardata = "0";
  FAddVoters._checkID = checkID;
} else {
  //perform your update here ...
}
于 2013-10-30T20:41:19.033 に答える