J'utilise ces lignes de code pour vérifier si le dossier existe ou non.
SqlCommand check_User_Name = new SqlCommand("SELECT * FROM Table WHERE ([user] = '" + txtBox_UserName.Text + "') ", conn);
int UserExist = (int)check_User_Name.ExecuteScalar();
Mais je reçois une erreur:
Object reference not set to an instance of an object.
Je veux faire:
if (UserExist > 0)
// Update record
else
// Insert record
ExecuteScalar
retourne la première colonne de la première ligne. Les autres colonnes ou lignes sont ignorées. Il semble que votre première colonne de la première ligne soit null
, et c’est pourquoi vous obtenez NullReferenceException
lorsque vous essayez d’utiliser la méthode ExecuteScalar
.
De MSDN ;
Valeur de retour
La première colonne de la première ligne du jeu de résultats, ou une valeur null référence si le jeu de résultats est vide.
Vous devrez peut-être utiliser COUNT
dans votre instruction à la place, ce qui renverra le nombre de lignes affectées ...
Utiliser requêtes paramétrées est toujours une bonne pratique. Il empêche les attaques de {SQL Injection _.
Et Table
est un mot clé réservé - dans T-SQL. Vous devriez l'utiliser avec des crochets, comme [Table]
également.
En guise de suggestion finale, utilisez l’énoncé using
pour disposer vos SqlConnection
et 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.
}
La méthode ExecuteScalar doit être utilisée lorsque vous êtes vraiment sûr que votre requête ne renvoie qu'une seule valeur, comme ci-dessous:
SELECT ID FROM USERS WHERE USERNAME = 'SOMENAME'
Si vous voulez toute la ligne, le code ci-dessous devrait être plus approprié.
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();
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
}
Vous pouvez écrire comme suit:
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
}
}
essaye ça
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
}
}
}
}
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");
}
Utilisez la méthode Int.Parse()
à la place. Ça va marcher.
Utilisez 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
}
Je me posais la même question et je n’ai trouvé aucune réponse claire; j’ai donc créé un test simple.
J'ai essayé d'ajouter 100 lignes avec des clés primaires en double et de mesurer le temps nécessaire pour le traiter. J'utilise SQL Server 2014 Developer et Entity Framework 6.1.3 avec un référentiel personnalisé.
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 secondes
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 secondes
J'utiliserais le "compte" pour avoir toujours un entier comme résultat
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
}