2017-08-29 7 views
1

Est-ce que quelqu'un peut m'aider à comprendre ce qui se passe? J'essaie d'obtenir leUtilisation de variables par rapport à SQL Server dans l'instruction

  1. SAQA ID
  2. CNQ Niveau
  3. Crédits

d'un cours, mais il y a quelque chose que je ne comprends pas.

Si je crée une variable avec ma requête telle que

public Int32 T_Course_Id = 0, T_Company_Id = 0, T_Nqf = 0, T_Credit = 0; 

string queryTaskId = "SELECT [course_saqa_id] FROM"+ 
        "[sta].[dbo].[Courses]"+ 
        "WHERE course_name = '" + _Coursename + "'"; 

string queryNqf = "SELECT [course_nqf]"+ 
        "FROM [sta].[dbo].[Courses]"+ 
        "WHERE course_saqa_id = '" + T_Course_Id + "'"; 

using (SqlConnection Conn = new SqlConnection(ConnString)) 
{ 
    Conn.Open(); 

    using (SqlCommand command = new SqlCommand(queryTaskId, Conn)) 
    { 
     using (SqlDataReader reader = command.ExecuteReader()) 
     { 
      if (reader.HasRows) 
      { 
       reader.Read(); 
       // Call Read before accessing data. 
       T_Course_Id = reader.GetInt32(0); 
      } 

      // Call Close when done reading. 
      reader.Close(); 
     } 
    } 

    using (SqlCommand command = new SqlCommand(queryCredit, Conn)) 
    { 
     using (SqlDataReader reader = command.ExecuteReader()) 
     { 
      if (reader.HasRows) 
      { 
       reader.Read(); 

       // Call Read before accessing data. 
       T_Credit = reader.GetInt32(0); 
      } 

      // Call Close when done reading. 
      reader.Close(); 
     } 
    }      

    Conn.Close(); 
} 

Si je le fais de cette façon que je reçois une valeur 0 pour la variable T_Credit, mais si je le fais comme ça (c'est seulement le dernier partie)

using (SqlCommand command = new SqlCommand("SELECT [course_nqf] FROM [sta].[dbo].[Courses] WHERE course_saqa_id = '" + T_Course_Id + "'", Conn)) 
{ 
    using (SqlDataReader reader = command.ExecuteReader()) 
    { 
     if (reader.HasRows) 
     { 
      reader.Read(); 
      // Call Read before accessing data. 
      T_Credit = reader.GetInt32(0); 
     } 

     // Call Close when done reading. 
     reader.Close(); 
    } 
}      

puis-je obtenir la valeur correcte, comme vous pouvez le voir je passe la commande SQL directement au lieu d'une variable

using (SqlCommand command = new SqlCommand("SELECT [course_nqf] FROM [sta].[dbo].[Courses] WHERE course_saqa_id = '" + T_Course_Id + "'", Conn)) 

Pourquoi une variable ne fonctionnera-t-elle pas ici?

+0

Avez-vous essayé d'utiliser des chaînes de modèle? C# 6 De plus, pourquoi appelez-vous close lorsque vous utilisez déjà le style 'using() {...}'? –

+1

Il semble que c'est juste une faute de frappe, vous utilisez la mauvaise variable dans votre premier cas. Vous devriez utiliser 'queryNqf' au lieu de' queryCredit'. – Alisson

+0

[Alerte d'injection SQL] (http://msdn.microsoft.com/fr-fr/library/ms161953%28v=sql.105%29.aspx) - vous ne devez pas ** concaténer ensemble vos instructions SQL - utilisez ** requêtes paramétrées ** à la place pour éviter l'injection SQL - consultez [Little Bobby Tables] (https://xkcd.com/327/) –

Répondre

4

L'ordre des opérations est important.

Dans votre premier exemple: Vous définissez la valeur de votre T_Course_ID = 0, puis en créant une chaîne de requête immédiatement après. À ce moment-là, la valeur T_Course_ID est évaluée à 0 et oubliée. La concaténation de chaîne N'EST PAS évaluée chaque fois qu'elle est utilisée. Seulement à l'affectation.

Dans votre deuxième exemple: T_Course_ID est attribué une nouvelle valeur par votre recherche initiale. Puisque le SQLCommand est exécuté après la réaffectation de variable, il est évalué en utilisant la nouvelle valeur à chaque fois.

Voici un exemple en utilisant javascript, de même il y avait bien:

var T_Course_Id = 0; 
 

 
var queryNqf = 
 
    "SELECT [course_nqf]" + 
 
    "FROM [sta].[dbo].[Courses]" + 
 
    "WHERE course_saqa_id = '" + T_Course_Id + "'"; 
 

 
// Query displays initialized value 
 
console.log(queryNqf); 
 

 
// Variable is changed 
 
T_Course_Id = 'I Will NOT CHANGE'; 
 

 
// Try to log the updated value but it doesn't work because queryNqf was assigned too early 
 
console.log(queryNqf); 
 

 
// Reassign with the new value 
 
queryNqf = 
 
    "SELECT [course_nqf]" + 
 
    "FROM [sta].[dbo].[Courses]" + 
 
    "WHERE course_saqa_id = '" + T_Course_Id + "'"; 
 

 
// Retrieve the expect result. 
 
console.log(queryNqf);

0

Il semble que vous n'utilisiez pas la bonne chaîne de commande, queryNqf dans votre instruction using.

vôtre: en utilisant (SqlCommand commande = new SqlCommand (queryCredit, Connecticut))

Peut-être: en utilisant (SqlCommand commande = new SqlCommand (queryNqf, Connecticut))