【问题标题】:Having problems with sqlDataReadersqlDataReader 出现问题
【发布时间】:2010-05-15 02:23:58
【问题描述】:

我正在使用 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

【问题讨论】:

  • 您获得的记录不止一条吗?你能解释一下你的意思是它不起作用吗?您看到错误了吗?
  • 附带说明,您可能需要对查询进行参数化。目前它对 SQL 注入开放,因为您正在连接可能来自用户输入的 QSID。
  • Raj,我只得到一张唱片。我的意思是它不起作用是当我调用它们时会话变量是空白的。我得到的唯一错误是当我尝试发送电子邮件并将会话变量用作 from 和 to 的参数时。它说参数不能为空
  • 乔恩,我不知道你在说什么。但 QSID 包含查询字符串的值。
  • 除了 executereader 之外,不要 NOT 调用 executenonquery 和 executescalar。

标签: asp.net vb.net sqldatareader


【解决方案1】:

这可能是因为列名需要是唯一的,SqlDataReader 才能使用列的字符串名称对它们进行索引。

【讨论】:

  • 好的。那么你对我如何解决它有什么建议吗?
【解决方案2】:

有几点:

1) 您正在执行查询 3 次。您可能会丢失 ExecuteNonQuery 和 ExecuteScalar 调用,并将 while 循环替换为“if myDataReader.Read() / end if”以获取第一个结果记录的数据值。如果没有找到记录,则不会设置会话变量,就像在您当前的代码中一样。

2) 问题看起来更像是您的会话管理(即从 会话中获取值)而不是您的 sql 查询,这对我来说看起来不错。

检查:

  • 您在 web.config 文件中启用了 sessionState,
  • 您不会在任何地方重置 Session 值,并且
  • 您在尝试发送电子邮件时要求相同的会话字段名称。 (例如,您是否设置 Session("DEV_Email") 但要求 Session("DEV Email") (空格而不是下划线)?

【讨论】:

    【解决方案3】:

    对不起大家。代码工作得很好。 sqlDataReader 将接受表达式作为列名。

    我收到错误消息的原因是 from 和 to 参数的值不能为空。我的表中的任何记录在该列中都没有数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多