Возникли проблемы с sqlDataReader - PullRequest
0 голосов
/ 14 мая 2010

Я использую sqlDataReader для получения данных и установки в них переменных сеанса. Проблема в том, что он не хочет работать с выражениями. Я могу ссылаться на любой другой столбец в таблице, но не на выражения. SQL работает. Код ниже. Заранее спасибо, Энтони

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

Ответы [ 3 ]

0 голосов
/ 14 мая 2010

Пара вещей:

1) Вы выполняете запрос 3 раза. Вы можете потерять вызовы ExecuteNonQuery и ExecuteScalar и заменить цикл while на «if myDataReader.Read () / end if», чтобы получить значения данных для первой результирующей записи. Если записи не найдены, переменные сеанса не устанавливаются, как в текущем коде.

2) Больше похоже, что проблема заключается в вашем управлении сессиями (то есть получении значений из Session), а не в вашем sql-запросе, который мне подходит.

Проверка:

  • что у вас включен sessionState в вашем файле web.config,
  • что вы нигде не сбрасываете значения Session, а
  • что вы запрашиваете одно и то же имя поля сеанса при попытке отправить электронное письмо. (например, вы устанавливаете Session ("DEV_Email"), но запрашиваете Session ("DEV Email") (пробел вместо подчеркивания)?
0 голосов
/ 14 мая 2010

Извините всех. Код работает просто отлично. SqlDataReader примет выражения как имена столбцов.

Причина, по которой я получаю сообщение о том, что значение параметров from и to не может быть нулевым. В этом столбце не было данных ни для одной из записей в моей таблице.

0 голосов
/ 14 мая 2010

Это может быть связано с тем, что имена столбцов должны быть уникальными, чтобы SqlDataReader мог индексировать их, используя строковое имя для столбца.

...