0

I have this code that Inserts data to database. I want to check if the ID going to be inserted is already in database. but if it is not in database it should be inserted. But has some errors, can you please help me out with it?

    public void Add()
    {
        sc.Open();
        try
        {
            cmd = new SqlCommand("Select idnum from TableVotersInfo Where idnum=@idnum", 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();
        }
    }

Edit My error now is There is already an open DataReader associated with this command which must be closed first..

Update

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

        try
        {
            cmd = new SqlCommand("UPDATE TableVotersInfo SET Education=@ed, idnum=@idnum, FirstName=@firstname, MiddleName=@middlename, LastName=@lastname, SchoolYear=@schoolyear, ControlNum=@controlnum WHERE id=@id", 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();
        }
    }

4 Answers4

2

try remove single quotes in query like this

cmd = new SqlCommand("Select idnum from TableVotersInfo Where idnum=@idnum", sc);

and change type of variable _idnum from string to int

for solve error in insert try this code

public void Add()
{
    sc.Open();
    try
    {
        cmd = new SqlCommand("Select idnum from TableVotersInfo Where idnum=@idnum", 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();
    }
}
Grundy
  • 13,356
  • 3
  • 35
  • 55
1

Instead of two queries you could do it in one by changing values to a select and adding a where clause. After doing that you just need to check the returned value of ExecuteNonQuery() to see if 0 or 1 row was updated.

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();
    }
}
Scott Chamberlain
  • 124,994
  • 33
  • 282
  • 431
  • I edited my post. Can you help me in my Update too? Coz if same thing happens, if idnum is already in database it just adds anyway. – Lyndon Broz Tonelete Oct 30 '13 at 07:19
  • @LyndonBrozTonelete You did not do the same query as me, you need to learn the basics of SQL and you will understand what the difference between our two queries are. – Scott Chamberlain Oct 30 '13 at 13:44
0

try cmd.Dispose(); in else {} before again initializing the command object. This should work in your case.

Vikash Singh
  • 804
  • 1
  • 10
  • 11
0

Close the datareader object in else also

R S P
  • 997
  • 5
  • 8