c# - soporta - optimizar consultas lentas mysql
Verifique si existe un registro en la base de datos (11)
El método ExecuteScalar se debe usar cuando esté realmente seguro de que su consulta solo arroja un valor como el siguiente:
SELECT ID FROM USERS WHERE USERNAME = ''SOMENAME''
Si desea toda la fila, entonces el siguiente código debería ser más apropiado.
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
}
Estoy usando estas líneas de código para verificar si el registro existe o no.
SqlCommand check_User_Name = new SqlCommand("SELECT * FROM Table WHERE ([user] = ''" + txtBox_UserName.Text + "'') ", conn);
int UserExist = (int)check_User_Name.ExecuteScalar();
Pero estoy recibiendo un error:
Object reference not set to an instance of an object.
Quiero hacer:
if (UserExist > 0)
// Update record
else
// Insert record
Me estaba haciendo la misma pregunta y no encontré respuestas claras, así que creé una prueba simple.
Traté de agregar 100 filas con claves primarias duplicadas y medí el tiempo necesario para procesarlo. Estoy usando SQL Server 2014 Developer y Entity Framework 6.1.3 con un repositorio personalizado.
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 segundos
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 segundos
Puedes escribir de la siguiente manera:
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
}
}
Usaría el "recuento" para tener siempre un número entero como resultado
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
}
Use ''Int.Parse ()'' en su lugar. Funciona.
Utilice 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
}
prueba esto
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
}
}
}
}
ExecuteScalar
devuelve la primera columna de la primera fila. Otras columnas o filas son ignoradas. Parece que su primera columna de la primera fila es null
, y es por eso que obtiene NullReferenceException
cuando intenta utilizar el método ExecuteScalar
.
De MSDN ;
Valor de retorno
La primera columna de la primera fila en el conjunto de resultados, o una referencia nula si el conjunto de resultados está vacío .
Es posible que deba usar COUNT
en su extracto en su lugar, que devuelve el número de filas afectadas ...
El uso de consultas parametrizadas siempre es una buena práctica. Evita los ataques de inyección SQL .
Y Table
es una palabra clave reservada en T-SQL. Debe usarlo entre corchetes, como [Table]
también.
Como sugerencia final, use la instrucción using
para desechar su SqlConnection
y 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.
}
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>");
}
}
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");
}
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();