2011-11-05 3 views
1

que j'ai rencontré cette situation dans laquelle cette instruction SQL ne fonctionne pas ..C# requête de sélection ne fonctionne pas avec les paramètres

command.Parameters.AddWithValue("@OA_Name", obj.GEToperatingauthority()); 
command.CommandText = "SELECT [OA_ID] FROM [Operating_Authority_Table] WHERE [OA_Name] = [@OA_Name]"; 

mais cette instruction SQL fonctionne quand j'ai changé le [ « @OA_Name »] simplement un valeur trouvée dans le tableau.

command.CommandText = "SELECT [OA_ID] FROM [Operating_Authority_Table] WHERE [OA_Name] = ['OA 101']"; 

J'ai testé la valeur que je suis arrivé du obj.GetOperatingauthority() et il est exactement le même que celui de la base de données. Je l'ai utilisé reader.hasrows pour vérifier s'il y a des lignes retournées ..

BTW je suis en utilisant C# et base de données d'accès 2010 ..

edit: je l'ai mis dans la majeure partie du code ci-dessous:

 using (var command = connection.CreateCommand()) 
     { 
      connection.Open(); 
      command.CommandType = CommandType.Text; 

      command.Parameters.AddWithValue("@NRIC", obj.GETnricfinnumber()); 
      command.Parameters.AddWithValue("@Participant_Name", obj.GETname()); 
      command.Parameters.AddWithValue("@Gender", obj.GETgender()); 
      command.Parameters.AddWithValue("@DOB", obj.GETdateofbirth()); 
      command.Parameters.AddWithValue("@Nationality", obj.GETnationality()); 
      command.Parameters.AddWithValue("@Race", obj.GETrace()); 
      command.Parameters.AddWithValue("@Residential_Address", obj.GETresidentialaddress()); 
      command.Parameters.AddWithValue("@Contact_Number", obj.GETcontactnumber()); 
      command.Parameters.AddWithValue("@Email_Address", obj.GETemailaddress()); 

      command.CommandText = "SELECT [NRIC] FROM [Participant_Table] WHERE [NRIC] = [@NRIC]"; 
      using (var reader = command.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        if (reader.GetString(0).ToLower().Equals(obj.GETnricfinnumber().ToLower())) 
        { 
         message.show(1, "", "exists"); 
         //return false; 
        } 
       } 
      } 

      command.CommandText = "SELECT [OA_ID] FROM [Operating_Authority_Table] WHERE [OA_Name] = @OA_Name"; 
      command.Parameters.AddWithValue("@OA_Name", obj.GEToperatingauthority()); 

      using (var reader = command.ExecuteReader()) 
      { 
       if (!reader.HasRows) 
       { 
        message.show(1, "", "no rows!"); return false; //to test whether has rows or no rows 
       } 

edit 2: l'instruction getOperatingAuthority ne peut pas être erronée car il s'agit essentiellement d'un système en "boucle fermée" par lequel OA_Name sont utilisés pour remplir une zone de liste déroulante, et les valeurs sélectionnées dans cette zone de liste déroulante sont renvoyées à la table obtenir l'ID.

+0

est votre paramètre @OA_Name retournant 'OA 101' ou simplement OA 101? –

+0

'OA 101' est le nom exact de l'école et j'essaie de retourner son identifiant (PK). en utilisant ce 'OA 101', reader.hasrows m'a retourné vrai – user776914

+0

pour l'enregistrement dans le code ci-dessus, je déplacerais "command.Parameters.AddWithValue (" @ OA_Name ", obj.GEToperatingauthority());" sauvegarder en haut, et assurez-vous d'inclure le [] autour de votre @OA_Name. Je ne vois aucune raison qui ne devrait pas fonctionner si les autres travaillent ... –

Répondre

0

Modifier à ceci:

Essayez de tester d'abord si votre obj.GEToperatingauthority() a une valeur.

command.CommandText = "SELECT [OA_ID] FROM [Operating_Authority_Table] WHERE [OA_Name] = @OA_Name"; 

    var getoperation = Convert.ToString(obj.GEToperatingauthority()); 
    command.Parameters.AddWithValue("@OA_Name", getoperation); 
//use this for checking  

    var dt = new DataTable(); 

    var da = new SqlDataAdapter(command); 

    connection.Open(); 

    da.Fill(dt); 

    if(dt.Rows.Count > 0) 
    { 
    //records found 
    } 
    else 
    { 
     //No records Found 
    } 

Cordialement

+0

cela retourne toujours zéro rangées pour moi .. – user776914

+0

cela ne devrait pas importer, vous pouvez ajouter les paramètres avant ou après. –

+0

Yup @Dylan Hayes ur correct mais il est très bien de le lire si les paramètres sont en dessous du texte de la commande .. – Crimsonland

0

test Essayez:

command.CommandText = "SELECT [OA_ID] FROM [Operating_Authority_Table] WHERE [OA_Name] = [" + obj.GEToperatingauthority() + "]"; 

Pas aussi élégant, mais il travaillerait, si elle ne marche pas, alors il est certainement un problème avec

command.Parameters.AddWithValue("@OA_Name", obj.GEToperatingauthority()); 

EDIT - OK en réponse à votre commentaire: maintenant essayez ceci:

command.CommandText = "SELECT [OA_ID] FROM [Operating_Authority_Table] WHERE [OA_Name] = [" + "'" + obj.GEToperatingauthority() + "'" + "]"; 

si cela fonctionne alors son manque de « »

+0

cela ne marche pas aussi, mais j'ai testé la valeur de obj.Getoperatingauthoity() avec celui dans la base de données et il n'y a pas de différences, même le boîtier sont tous identiques – user776914

+0

Pour moi cela me ramène à penser que c'est juste à cause de la différence entre quand vous avez tapé manuellement 'OA 101' et votre paramètre que je devine est juste OA 101 pas 'OA 101' –

+0

ne peut pas travailler, j'ai essayé de supprimer le signe @, il a fait des lignes mais des lignes vides .. – user776914

1

Essayez en retirant les accolades enserrant de @OA_Name.

command.CommandText = "SELECT [OA_ID] FROM [Operating_Authority_Table] WHERE [OA_Name] = @OA_Name"; 
command.Parameters.AddWithValue("@OA_Name", obj.GEToperatingauthority()); 
+0

Il l'avait déjà dans son code d'origine, ce n'est pas le problème. –

Questions connexes