检查数据库中是否存在记录

我正在使用这些代码行来检查记录是否存在。

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 

ExecuteScalar返回第一行的第一列。 其他列或行将被忽略。 看起来你的第一行的第一列是null ,这就是你尝试使用ExecuteScalar方法时得到NullReferenceException的原因。

来自MSDN ;

回报价值

结果集中第一行的第一列, 如果结果集为空,则为空引用

您可能需要在语句中使用COUNT而不是返回受影响的行数…

使用参数化查询始终是一种很好的做法。 它可以防止SQL注入攻击。

Table是T-SQL中的保留关键字 。 您应该使用方括号,如[Table]

作为最后的建议,使用using语句来处置你的SqlConnectionSqlCommand

 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. } 

当您确定查询只返回如下所示的值时,应使用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 } 
 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(); 

我会使用“count”来得到一个整数作为结果

 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 } 

使用try catch:

 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 } 

您可以写如下:

 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 } } 

我问自己同样的问题,我没有找到明确的答案,所以我创建了一个简单的测试。

我尝试使用重复的主键添加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秒

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

试试这个

  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 } } } } 
 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 } 

请改用Int.Parse()方法。 它会工作。

 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(""); } else { Response.Write(""); } } 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(""); } }