2013-10-30 144 views
0

我有這個代碼插入數據到數據庫。我想檢查要插入的ID是否已經在數據庫中。但是如果它不在數據庫中,它應該被插入。但有一些錯誤,你能幫我解決嗎?現在如何檢查ID是否已存儲在數據庫中?

public void Add() 
    { 
     sc.Open(); 
     try 
     { 
      cmd = new SqlCommand("Select idnum from TableVotersInfo Where [email protected]", sc); 

      cmd.Parameters.AddWithValue("@idnum", _idnum); 

      SqlDataReader rd = cmd.ExecuteReader(); 
      if (rd.Read() == true) 
      { 
       MessageBox.Show("ID number already exist!"); 
       rd.Close(); 
      } 
      else 
      { 
       cmd = new SqlCommand("INSERT INTO TableVotersInfo (Education, idnum, FirstName, MiddleName, LastName, SchoolYear, ControlNum, VResult) VALUES (@ed, @idnum, @firstname, @middlename, @lastname, @schoolyear, @controlnum, 'Not Voted');", 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(); 
       MessageBox.Show("Data Stored Successfully!"); 
       FAddVoters._cleardata = cleardata; 
      } 

     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
     finally 
     { 
      sc.Close(); 
     } 
    } 

編輯 我的錯誤是There is already an open DataReader associated with this command which must be closed first.

更新

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

     try 
     { 
      cmd = new SqlCommand("UPDATE TableVotersInfo SET [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected] WHERE [email protected]", 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); 

      int res = cmd.ExecuteNonQuery(); 
      if (res > 0) 
      { 
       MessageBox.Show("Successfully Updated!"); 
       FAddVoters._cleardata = cleardata; 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
     finally 
     { 
      sc.Close(); 
     } 
    } 
+0

這個答案顯示了「INSERT如果不存在」最好的做法 - http://stackoverflow.com/questions/5288283/sql-server-insert-if-not-exists-best-practice –

+1

只是刪除單來自idnum ='@ idnum'的引用是idnum = @ idnum –

+0

我編輯了我的代碼。對不起,我搞砸了,我以爲我剛剛複製了添加方法。我在if(rd.Read()== true)之後複製了add和update方法lol –

回答

2

嘗試刪除查詢單引號這樣

cmd = new SqlCommand("Select idnum from TableVotersInfo Where [email protected]", sc); 

和變更類型從字符串變量_idnum的爲int

爲解決插入錯誤試試這個代碼

public void Add() 
{ 
    sc.Open(); 
    try 
    { 
     cmd = new SqlCommand("Select idnum from TableVotersInfo Where [email protected]", sc); 
     cmd.Parameters.AddWithValue("@idnum", _idnum); 

     if (cmd.ExecuteScalar() != null) 
     { 
      MessageBox.Show("ID number already exist!"); 
     } 
     else 
     { 
      cmd = new SqlCommand("INSERT INTO TableVotersInfo (Education, idnum, FirstName, MiddleName, LastName, SchoolYear, ControlNum, VResult) VALUES (@ed, @idnum, @firstname, @middlename, @lastname, @schoolyear, @controlnum, 'Not Voted');", 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(); 
      MessageBox.Show("Data Stored Successfully!"); 
      FAddVoters._cleardata = cleardata; 
     } 

    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
    finally 
    { 
     sc.Close(); 
    } 
} 
+0

像這樣'int check = Convert.ToInt32(_idnum);'?要麼? –

+0

現在我有一個錯誤'已經有一個打開的DataReader與這個命令相關聯,必須先關閉.' –

+0

有錯誤,'對象引用沒有設置爲對象的一個​​實例.' –

0

嘗試cmd.Dispose(); in else {}再次初始化命令對象。 這應該適用於你的情況。

0

關閉DataReader對象else

1

相反的兩個查詢,你可以通過改變valuesselect並添加where條款做於一體。完成之後,您只需檢查返回值ExecuteNonQuery()以查看01行是否已更新。

public void Add() 
{ 
    sc.Open(); 
    try 
    { 
     using(cmd = new SqlCommand(@"INSERT INTO TableVotersInfo (Education, idnum, FirstName, MiddleName, LastName, SchoolYear, ControlNum, VResult) 
             SELECT @ed, @idnum, @firstname, @middlename, @lastname, @schoolyear, @controlnum, 'Not Voted' 
             WHERE @idNum 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); 

      var rowsAffected = cmd.ExecuteNonQuery(); 
      if(rowsAffected == 0) 
      { 
       MessageBox.Show("ID number already exist!"); 
      } 
      else 
      { 
       MessageBox.Show("Data Stored Successfully!"); 
       FAddVoters._cleardata = cleardata; 
      } 
     } 

    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
    finally 
    { 
     sc.Close(); 
    } 
} 
+0

我編輯了我的帖子。你能幫我更新嗎?如果同樣的事情發生,如果idnum已經在數據庫中,它只是增加了。 –

+0

@LyndonBrozTonelete你沒有和我做同樣的查詢,你需要學習SQL的基礎知識,並且你會明白我們兩個查詢之間的區別是什麼。 –

相關問題