web-dev-qa-db-fra.com

Vérifier si un enregistrement existe dans la base de données

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

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.
}
16
Soner Gönül

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
}
4
Cem Sönmez
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();
1
Singh Kailash
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
    }
}
0
Chirag

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

Utilisez la méthode Int.Parse() à la place. Ça va marcher.

0
shirbr510

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
}
0
r.vengadesh

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

0
Ondřej

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