0

私の問題は、を除く単一のユーザーからすべてのデータを更新するとidnum、常にID番号が既に存在することを示していますか? ID番号を保持するにはどうすればよいですか?

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

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

    public void Update()
    {
        if (ExistsKey("idnum", "TableVotersInfo", _idnum.ToString(), sc))
        {
            MessageBox.Show("ID number already exist!");
            FAddVoters._cleardata = "0";
            FAddVoters._checkID = checkID;
        }
        else if (ExistsKey("idnum", "TableVotersInfo", _idnum.ToString(), sc))
        {

        }
        else
        {
            if (sc.State != ConnectionState.Open) 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();
            }
        }
    }

ID 番号を除く特定の行のすべての列を編集しても、「ID 番号は既に存在します!」と表示されます。それはあってはならないことです。

4

2 に答える 2

0

ExistsKey例外が発生したため、メソッドは常に false を返すと思います。

これを試して:

string.Format("IF EXISTS(SELECT * FROM {0} WHERE {1}='{2}') SELECT 1 ELSE SELECT 0", 
               table, keyField, value), con))
于 2013-10-31T06:38:52.183 に答える