2014-01-23 2 views
5

Я использую эти строки кода, чтобы проверить, существует ли запись.Проверьте, существует ли запись в базе данных

SqlCommand check_User_Name = new SqlCommand("SELECT * FROM Table WHERE ([user] = '" + txtBox_UserName.Text + "') ", conn); 

int UserExist = (int)check_User_Name.ExecuteScalar(); 

Но я получаю сообщение об ошибке:

Object reference not set to an instance of an object. 

я хочу сделать:

if (UserExist > 0) 
    // Update record 

else 

    // Insert record 
+0

Что exac Это не объект? –

+0

Когда эта ошибка отображается, если имя пользователя в таблице или нет? –

+0

Ваш запрос должен быть: Выберите счетчик (1) из таблицы, где ... – Dannydust

ответ

12

ExecuteScalar возвращает первый столбец первой строки. Другие столбцы или строки игнорируются. Похоже, что ваш первый столбец первого ряда - null, и именно поэтому вы получаете NullReferenceException, когда пытаетесь использовать метод ExecuteScalar.

От MSDN;

Return Value

The first column of the first row in the result set, or a null reference if the result set is empty.

Вам может понадобиться использовать COUNT в своем заявлении, вместо которой возвращает количество строк, ...

Использование parameterized queries всегда хорошая практика. Он предотвращает атаки SQL Injection.

И Table - reserved keyword в T-SQL. Вы должны использовать его с квадратными скобками, например [Table].

В качестве последнего предложения, используйте using statement для утилизации вашего SqlConnection и SqlCommand:

SqlCommand check_User_Name = new SqlCommand("SELECT COUNT(*) FROM [Table] WHERE ([user] = @user)" , conn); 
check_User_Name.Parameters.AddWithValue("@user", txtBox_UserName.Text); 
int UserExist = (int)check_User_Name.ExecuteScalar(); 

if(UserExist > 0) 
{ 
    //Username exist 
} 
else 
{ 
    //Username doesn't exist. 
} 
+2

Я проверил значение int «UserExist» в текстовом поле и его значение -1, даже если запись существует. Я не знаю, в чем проблема. – Kamran

+0

@ Downvoter Да, через 14 месяцев вы первый, кто понимает, что мой ответ не будет работать вообще. Спасибо. Я починил это. –

+1

С точки зрения базы данных вы должны использовать: SELECT top 1 1 FROM [Table] WHERE ([user] = @user) и проверьте, является ли ExecuteScalar нулевым или нет. Он работает лучше, чем счет (*) –

0

Используйте метод Int.Parse() вместо этого. Это будет работать.

+0

. Как это может быть полезно для OP? –

+0

Я попробовал это, и кажется, что объект не является действительно нулевым, но имеет некоторую проблему кастования akward. Разборные работы – shirbr510

0

Использование попытка поймать:

try 
{ 
    SqlCommand check_User_Name = new SqlCommand("SELECT * FROM Table WHERE ([user] = '" + txtBox_UserName.Text + "') ", conn); 

    int UserExist = (int)check_User_Name.ExecuteScalar(); 
    // Update query 
} 
catch 
{ 
    // Insert query 
} 
0

Я хотел бы использовать «подсчет» за то, что всегда целое число в результате

SqlCommand check_User_Name = new SqlCommand("SELECT count([user]) FROM Table WHERE ([user] = '" + txtBox_UserName.Text + "') " , conn); 

int UserExist = (int)check_User_Name.ExecuteScalar(); 

if (UserExist == 1) //anything different from 1 should be wrong 
{ 
    //Username Exist 
} 
3

Метод ExecuteScalar следует использовать, когда вы действительно уверены, что ваш запрос возвращает только одно значение, как показано ниже:

SELECT ID FROM USERS WHERE USERNAME = 'SOMENAME' 

Если вам нужна целая строка, более подходящий ниже код.

SqlCommand check_User_Name = new SqlCommand("SELECT * FROM Table WHERE ([user] = @user)" , conn); 
check_User_Name.Parameters.AddWithValue("@user", txtBox_UserName.Text); 
SqlDataReader reader = check_User_Name.ExecuteReader(); 
if(reader.HasRows) 
{ 
    //User Exists 
} 
else 
{ 
    //User NOT Exists 
} 
+0

Это не сработает, потому что вы даже не добавили параметр в 'SqlCommand'. –

+0

О, да, извините, я забыл, что сейчас редактирую :) –

+0

с помощью ExecuteScalar() - это самый короткий путь. –

0

Вы можете написать следующим образом:

SqlCommand check_User_Name = new SqlCommand("SELECT * FROM Table WHERE ([user] = '" + txtBox_UserName.Text + "') ", conn); 
if (check_User_Name.ExecuteScalar()!=null) 
{ 
    int UserExist = (int)check_User_Name.ExecuteScalar(); 
    if (UserExist > 0) 
    { 
     //Username Exist 
    } 
} 
+2

Что делать, если первый столбец первой строки не является именем пользователя? Вы просто догадываетесь. 'ExecuteNonQuery' - лучший подход в этом случае IMO .. –

+0

Да. вы абсолютно правы @ SonerGönül, но с его реализованным кодом я дал это решение. – Chirag

0

Я задавал себе тот же вопрос, и я не нашел никаких четких ответов, поэтому я создал простой тест.

Я попытался добавить 100 строк с повторяющимися первичными ключами и измерил время, необходимое для его обработки. Я использую SQL Server 2014 Developer и Entity Framework 6.1.3 с пользовательским репозиторием.

Dim newE As New Employee With {.Name = "e"} 
For index = 1 To 100 
    Dim e = employees.Select(Function(item) item.Name = "e").FirstOrDefault() 
    If e Is Nothing Then 
    employees.Insert(newE) 
    End If 
Next 

2.1 секунды

Dim newE As New Employee With {.Name = "e"} 
For index = 1 To 100 
    Try 
    employees.Insert(newE) 
    Catch ex As Exception 
    End Try 
Next 

3,1 секунды

0
sda = new SqlCeDataAdapter("SELECT COUNT(regNumber) AS i FROM tblAttendance",con); 
sda.Fill(dt); 

string i = dt.Rows[0]["i"].ToString(); 
int bar = Convert.ToInt32(i); 

if (bar >= 1){ 

    dt.Clear(); 
    MetroFramework.MetroMessageBox.Show(this, "something"); 
} 
else if(bar <= 0) { 

    dt.Clear(); 
    MetroFramework.MetroMessageBox.Show(this, "empty"); 
} 
1
sqlConnection.Open(); 
using (var sqlCommand = new SqlCommand("SELECT COUNT(*) FROM Table WHERE ([user] = '" + txtBox_UserName.Text + "'", sqlConnection)) 
{ 

    SqlDataReader reader = sqlCommand.ExecuteReader(); 
    if (reader.HasRows) 
    { 
     lblMessage.Text ="Record Already Exists."; 

    } 
    else 
    { 
     lblMessage.Text ="Record Not Exists."; 
    } 

    reader.Close(); 
    reader.Dispose(); 
} 

sqlConnection.Close(); 
0

попробовать этот

public static bool CheckUserData(string phone, string config) 
    { 
     string sql = @"SELECT * FROM AspNetUsers WHERE PhoneNumber = @PhoneNumber"; 
     using (SqlConnection conn = new SqlConnection(config) 
      ) 
     { 
      conn.Open(); 
      using (SqlCommand cmd = new SqlCommand(sql, conn)) 
      { 
       cmd.Parameters.AddWithValue("@PhoneNumber", phone); 
       SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); 
       if (reader.HasRows) 
       { 
        return true; // data exist 
       } 
       else 
       { 
        return false; //data not exist 
       } 
      } 
     } 
    } 
-1
protected void btnsubmit_Click(object sender, EventArgs e) 
{ 

     string s = @"SELECT * FROM tbl1 WHERE CodNo = @CodNo"; 
    SqlCommand cmd1 = new SqlCommand(s, con); 
    cmd1.Parameters.AddWithValue("@CodNo", txtid.Text); 
    con.Open(); 
    int records = (int)cmd1.ExecuteScalar(); 

    if (records > 0) 
    { 

     Response.Write("<script>alert('Record not Exist')</script>"); 

    } 
    else 
    { 
     Response.Write("<script>alert('Record Exist')</script>"); 
    } 
    } 
     private void insert_data() 
{ 

     SqlCommand comm = new SqlCommand("Insert into tbl1(CodNo,name,lname,fname,gname,EmailID,PhonNo,gender,image,province,district,village,address,phonNo2,DateOfBirth,school,YearOfGraduation,exlanguage,province2,district2,village2,PlaceOfBirth,NIDnumber,IDchapter,IDpage,IDRecordNumber,NIDCard,Kankur1Year,Kankur1ID,Kankur1Mark,Kankur2Year,Kankur2ID,Kankur2Mark,Kankur3Year,Kankur3ID,Kankur3Mark) values(@CodNo,N'" + txtname.Text.ToString() + "',N'" + txtlname.Text.ToString() + "',N'" + txtfname.Text.ToString() + "',N'" + txtgname.Text.ToString() + "',N'" + txtemail.Text.ToString() + "','" + txtphonnumber.Text.ToString() + "',N'" + ddlgender.Text.ToString() + "',@image,N'" + txtprovince.Text.ToString() + "',N'" + txtdistrict.Text.ToString() + "',N'" + txtvillage.Text.ToString() + "',N'" + txtaddress.Value.ToString() + "','" + txtphonNo2.Text.ToString() + "',N'" + txtdbo.Text.ToString() + "',N'" + txtschool.Text.ToString() + "','" + txtgraduate.Text.ToString() + "',N'" + txtexlanguage.Text.ToString() + "',N'" + txtprovince1.Text.ToString() + "',N'" + txtdistrict1.Text.ToString() + "',N'" + txtvillage1.Text.ToString() + "',N'" + txtpbirth.Text.ToString() + "','" + txtNIDnumber.Text.ToString() + "','" + txtidchapter.Text.ToString() + "', '" + txtidpage.Text.ToString() + "','" + txtrecordNo.Text.ToString() + "',@NIDCard,'" + txtkankuryear1.Text.ToString() + "','" + txtkankurid1.Text.ToString() + "','" + txtkankurscore1.Text.ToString() + "','" + txtkankuryear2.Text.ToString() + "','" + txtkankurid2.Text.ToString() + "','" + txtkankurscore2.Text.ToString() + "','" + txtkankuryear3.Text.ToString() + "','" + txtkankurid3.Text.ToString() + "','" + txtkankurscore3.Text.ToString() + "')", con); 

     flpimage.SaveAs(Server.MapPath("~/File/") + flpimage.FileName); 
     string img = @"~/File/" + flpimage.FileName; 
     flpnidcard.SaveAs(Server.MapPath("~/Tazkiera/") + flpnidcard.FileName); 
     string img1 = @"~/Tazkiera/" + flpnidcard.FileName; 

     comm.Parameters.AddWithValue("CodNo", Convert.ToInt32(txtid.Text)); 
     comm.Parameters.AddWithValue("image", flpimage.FileName); 
     comm.Parameters.AddWithValue("NIDCard", flpnidcard.FileName); 

     comm.ExecuteNonQuery(); 
     con.Close(); 

     Response.Redirect("~/SecondPage.aspx"); 
     //Response.Write("<script>alert('Record Inserted')</script>"); 

     } 
    } 
0
private void GvOpStock_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
    { 
     try 
     { 
      if (e.ColumnIndex != 0) 

       for (int row = 0; row < GvOpStock.Rows.Count - 1; row++) 
       { 

        if (GvOpStock.Rows[row].Cells[1].Value != null && 
         row != e.RowIndex && 
         GvOpStock.Rows[row].Cells[1].Value.Equals(GvOpStock.Rows[e.RowIndex].Cells[e.ColumnIndex].Value)) 
        { 

         MessageBox.Show("Duplicate"); 
         return; 

        } 
        else 
        { 

         //Add To datagridview 

        } 

       } 
     } 
     catch (Exception ex) 
     { 

     } 
    } 
0
MySqlCommand cmd = new MySqlCommand("select * from table where user = '" + user.Text + "'", con); 
MySqlDataAdapter da = new MySqlDataAdapter(cmd); 
DataSet ds1 = new DataSet(); 
da.Fill(ds1); 
int i = ds1.Tables[0].Rows.Count; 
if (i > 0) { 
    // Exist 
} 
else { 
    // Add 
} 
Смежные вопросы