2010-05-14 5 views
0

J'utilise un sqlDataReader pour obtenir des données et le définir comme variable de session. Le problème est qu'il ne veut pas travailler avec des expressions. Je peux référencer n'importe quelle autre colonne dans la table, mais pas les expressions. Le SQL fonctionne. Le code est ci-dessous. Merci à l'avance, AnthonyJ'ai des problèmes avec sqlDataReader

Using myConnectionCheck As New SqlConnection(myConnectionString) 
    Dim myCommandCheck As New SqlCommand() 
    myCommandCheck.Connection = myConnectionCheck 
    myCommandCheck.CommandText = "SELECT Projects.Pro_Ver, Projects.Pro_Name, Projects.TL_Num, Projects.LP_Num, Projects.Dev_Num, Projects.Val_Num, Projects.Completed, Flow.Initiate_Date, Flow.Requirements, Flow.Req_Date, Flow.Dev_Review, Flow.Dev_Review_Date, Flow.Interface, Flow.Interface_Date, Flow.Approval, Flow.Approval_Date, Flow.Test_Plan, Flow.Test_Plan_Date, Flow.Dev_Start, Flow.Dev_Start_Date, Flow.Val_Start, Flow.Val_Start_Date, Flow.Val_Complete, Flow.Val_Complete_Date, Flow.Stage_Production, Flow.Stage_Production_Date, Flow.MKS, Flow.MKS_Date, Flow.DIET, Flow.DIET_Date, Flow.Closed, Flow.Closed_Date, Flow.Dev_End, Flow.Dev_End_Date, Users_1.Email AS Expr1, Users_2.Email AS Expr2, Users_3.Email AS Expr3, Users_4.Email AS Expr4, Users_4.FNAME, Users_3.FNAME AS Expr5, Users_2.FNAME AS Expr6, Users_1.FNAME AS Expr7 FROM Projects INNER JOIN Users AS Users_1 ON Projects.TL_Num = Users_1.PIN INNER JOIN Users AS Users_2 ON Projects.LP_Num = Users_2.PIN INNER JOIN Users AS Users_3 ON Projects.Dev_Num = Users_3.PIN INNER JOIN Users AS Users_4 ON Projects.Val_Num = Users_4.PIN INNER JOIN Flow ON Projects.id = Flow.Flow_Pro_Num WHERE id = " 
    myCommandCheck.CommandText += QSid 
    myConnectionCheck.Open() 
    myCommandCheck.ExecuteNonQuery() 
    Dim count As Int16 = myCommandCheck.ExecuteScalar 
    If count = 1 Then 
     Dim myDataReader As SqlDataReader 
     myDataReader = myCommandCheck.ExecuteReader() 
     While myDataReader.Read() 
      Session("TL_email") = myDataReader("Expr1").ToString() 
      Session("PE_email") = myDataReader("Expr2").ToString() 
      Session("DEV_email") = myDataReader("Expr3").ToString() 
      Session("VAL_email") = myDataReader("Expr4").ToString() 
      Session("Project_Name") = myDataReader("Pro_Name").ToString() 
     End While 
     myDataReader.Close() 
    End If 
End Using 
+0

vous en train de revenir plus Pouvez-vous expliquer ce que vous voulez dire par là que cela ne fonctionne pas? Vous voyez une erreur? –

+0

En note, vous pouvez paramétrer votre requête. Il est simplement ouvert à l'injection SQL car vous concaténéz QSID qui provient peut-être de l'entrée de l'utilisateur. – Jon

+0

Raj, je n'ai qu'un seul enregistrement. Ce que je veux dire par cela ne fonctionne pas, c'est que les variables de session sont vides quand je les appelle. La seule erreur que j'obtiens est quand j'essaye d'envoyer un email et utilise les variables de session en tant que paramètres pour le et de. Il dit que le paramètre ne peut pas être vide – Anthony

Répondre

0

Cela peut être parce que les noms de colonnes doivent être uniques pour le SqlDataReader pour pouvoir les indexer en utilisant un nom de chaîne pour la colonne.

+0

Ok. Alors avez-vous une suggestion sur la façon dont je le répare? – Anthony

0

Quelques choses:

1) Vous exécuter la requête 3 fois. Vous pouvez perdre les appels ExecuteNonQuery et ExecuteScalar et remplacer la boucle while par "if myDataReader.Read()/end if" pour obtenir les valeurs de données pour le premier enregistrement résultant. Si aucun enregistrement n'est trouvé, aucune variable de session n'est définie, comme dans votre code actuel.

2) Il semble plutôt que le problème réside dans votre gestion de session (ie obtenir les valeurs de Session) plutôt que votre requête SQL, ce qui me semble correct.

Vérifier:

  • que vous avez sessionState activé dans votre fichier web.config,
  • que vous ne pas réinitialiser les valeurs de session nulle part, et
  • que vous demandez le même champ de session nom lorsque vous essayez d'envoyer l'e-mail. (Par exemple, sont session paramètre que vous ("DEV_Email"), mais demandant session ("DEV e-mail") (espace au lieu de underscore)?
0

tout le monde Désolé. Le code fonctionne très bien. Le SQLDataReader acceptera des expressions comme colonne noms.

la raison pour laquelle je recevais une erreur indiquant que la valeur de la provenance et aux paramètres ne peut être nulle. Il n'y avait pas de données dans cette colonne pour l'un des enregistrements dans ma table.