2010-05-14 3 views
0

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

вы получаете назад больше чем одна запись? Можете ли вы объяснить, что вы подразумеваете под этим, не работает? Вы видите ошибку? –

+0

В качестве побочного примечания вы можете параметризовать ваш запрос. ntly он открыт для SQL-инъекции, потому что вы объединяете QSID, который может поступать с пользовательского ввода. – Jon

+0

Радж, я получаю только одну запись. Я имею в виду, что это не работает, так как переменные сеанса пусты, когда я их вызываю. Единственная ошибка, которую я получаю, - это когда я пытаюсь отправить электронное письмо и использовать переменные сеанса в качестве параметров для параметров from и to. Он говорит, что параметр не может быть пустым. – Anthony

ответ

0

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

+0

Хорошо. Итак, есть ли у вас предложение о том, как я это исправить? – Anthony

0

Пара вещей:

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

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

Проверил:

  • , что вы включили sessionState в файле web.config,
  • , что вы не сбросить значения Session в любом месте, и
  • , что вы просите же поле Session когда вы пытаетесь отправить электронное письмо. (Например, вы настройки сеанса («DEV_Email»), но просить сессии («DEV e-mail») (пробел вместо подчёркивания)?
0

К сожалению все. Код работает нормально. SqlDataReader будет принимать выражения, как колонки имена.

причина я получаю сообщение об ошибке говорящее значение от и до параметров не может быть пустым. Там не было никаких данных в этом столбце для любой из записей в моей таблице.

Смежные вопросы