【问题标题】:Accessing values from partial classes从部分类访问值
【发布时间】:2011-09-02 14:47:40
【问题描述】:

请帮忙!我还在学习,所以这可能是完全错误的。我为内部目的构建了一个多用户 Web 应用程序。我已经拆分了我的代码以使其更易于管理并且遇到了一些问题。我怀疑我做了什么很傻的事情!

我在 App_Code 的单独文件 (quoteStatus.vb) 中有一个类:

Imports Microsoft.VisualBasic
Imports System.Data.SqlClient
Imports System.Data

Public Class quoteStatusHelper

 Public Shared QuoteStatus As String

    Public Shared Sub GetQuoteStatus(ByVal QuoteID As String)

        Dim con As New SqlConnection
        Dim cmd As New SqlCommand

        Try
            con.ConnectionString = ConfigurationManager.AppSettings("quotingSystemConnectionString")
            con.Open()
            cmd.Connection = con
            cmd.CommandText = "SELECT Status FROM Quote WHERE QuoteID =" & QuoteID & ";"
            Dim lrd As SqlDataReader = cmd.ExecuteReader()

            While lrd.Read()
                QuoteStatus = lrd("Status")
            End While

        Catch ex As Exception

        Finally
            con.Close()
        End Try


    End Sub
    End Class

我用它来触发另一个文件中的代码:

quoteStatusHelper.GetQuoteStatus(QuoteID)

然后用

抓取结果
Dim returnedStatus = quoteStatusHelper.QuoteStatus

这似乎真的错了,因为在第一次运行之后,该值似乎保存在部分类中。因此,如果我有两个用户访问该课程,则两个用户的公共共享昏暗都会更改!必须有更好的方法来做到这一点。到处看了看,现在比刚开始的时候更迷茫……

如何使分部类中的 QuoteStatus 对每个用户都是唯一的,并从我的代码中访问它。我想不通:(请帮忙

非常感谢。

【问题讨论】:

  • 如果传递给 GetQuoteStatus 方法的 QuoteID 是“1;从 QuoteID > 1 的报价中删除”会发生什么?注意:不要尝试,只是警告 SQL 注入攻击。
  • 您好,感谢您的提醒。注射是我知道的,但我还没有学会如何避免它。尽管此应用程序将是一个仅通过 IIS 上的 IP 限制对特定人员开放的系统,但我很想知道将来我能做些什么来避免这种情况。非常感谢
  • 这行quoteSelectHelper.GetQuoteInfo(QuoteID) 是真的还是应该是quoteStatusHelper.GetQuoteInfo(QuoteID)
  • 嗨 @Chris 是的,抱歉,这是一个错字……很好发现!

标签: asp.net vb.net class


【解决方案1】:

问题是您的QuoteStatus 变量是共享/静态的。你不需要在这里这样做。将其声明为 Public 将使其对其他类可见。从方法和QuoteStaus 变量中删除Shared,一切都应该很好。

一旦你删除Shared,它将是一个实例类,这意味着你需要在你的代码中初始化它:

Dim statusHelper As New quoteStatusHelper()
statusHelper.GetQuoteStatus("QuoteID")

编辑

仔细查看您的代码,您似乎可以将GetQuoteStatus 设为一个函数,该函数将QuoteStatus 作为字符串返回,正如@Claudio Redi 所建议的那样。

Public Function GetQuoteStatus(ByVal QuoteID As String) As String 

    Dim quoteStatus As String

    Dim con As New SqlConnection  
    Dim cmd As New SqlCommand  

    Try  
        con.ConnectionString = ConfigurationManager.AppSettings("quotingSystemConnectionString")  
        con.Open()  
        cmd.Connection = con  
        cmd.CommandText = "SELECT Status FROM Quote WHERE QuoteID =" & QuoteID & ";"  
        Dim lrd As SqlDataReader = cmd.ExecuteReader()  

        While lrd.Read()  
            quoteStatus = lrd("Status")  
        End While  

    Catch ex As Exception  

    Finally  
        con.Close()  
    End Try  

    Return quoteStatus

End Function

通过将GetQuoteStatus 设为函数,您将能够获得如下值:

Dim statusHelper As New quoteStatusHelper()
Dim quoteStatus As String = statusHelper.GetQuoteStatus("QuoteID")

【讨论】:

  • 嗨詹姆斯。感谢您编辑我糟糕的英语和新手编程演讲!我不确定要删除哪个“共享”,所以我一一尝试,我得到:对非共享成员的引用需要对象引用谢谢您的帮助
  • 也从QuoteStatus 变量中删除Shared
  • 嗯,好的。我已将文件中的所有公共共享更改为仅公共,但现在我遇到了另一个问题......当我在另一个文件中使用“dim something = quoteStatusHelper.QuoteStatus”时,我收到一个错误:“对非共享成员的引用需要一个对象参考。我该如何克服呢?非常感谢!
  • 查看我编辑的答案。我包含的代码向您展示了如何初始化quoteStatusHelper 的实例。
  • 啊哈!感谢您为我布置它,詹姆斯……效果很好! 6小时试图自己弄清楚,只需几分钟,一切都解决了。非常感谢!
【解决方案2】:

一个选项是在您的方法中使用局部变量 quoteStatus 并将其用作 GetQuoteStatus 的返回值。所以你不会再使用共享成员QuoteStatus

编辑

添加了一个函数示例。您应该从班级中删除您的共享成员 QuoteStatus。我在日常工作中不使用 VB,所以我希望我没有犯任何愚蠢的语法错误

Public Shared Function GetQuoteStatus(ByVal QuoteID As String) as String

    Dim con As New SqlConnection
    Dim cmd As New SqlCommand
    Dim quoteStatus As String

    Try
        con.ConnectionString = ConfigurationManager.AppSettings("quotingSystemConnectionString")
        con.Open()
        cmd.Connection = con
        cmd.CommandText = "SELECT Status FROM Quote WHERE QuoteID =" & QuoteID & ";"
        Dim lrd As SqlDataReader = cmd.ExecuteReader()

        While lrd.Read()
            quoteStatus = lrd("Status")
        End While

    Catch ex As Exception

    Finally
        con.Close()
    End Try

    return quoteStatus

End Function

【讨论】:

  • 您好克劳迪奥,感谢您的帮助。请你能给我一个如何做到这一点的例子吗?对不起,我还处于学习的早期阶段......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多