2013-10-30 230 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的基础知识,并且你会明白我们两个查询之间的区别是什么。 –

相关问题