Accediendo a valores de clases parciales

¡Por favor ayuda! Todavía estoy aprendiendo, por lo que esto podría estar completamente mal. He creado una aplicación web multiusuario para fines internos. He dividido mi código para hacerlo más manejable y me he encontrado con algunos problemas. ¡Sospecho que he hecho algo muy tonto!

Tengo una clase en un archivo separado (quoteStatus.vb) en App_Code aquí está:

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

Utilizo esto para disparar el código desde otro archivo:

quoteStatusHelper.GetQuoteStatus(QuoteID)

Luego toma el resultado con

Dim returnedStatus = quoteStatusHelper.QuoteStatus

Esto parece realmente incorrecto, ya que el valor parece mantenerse en la clase parcial después de la primera ejecución. Entonces, si tengo dos usuarios accediendo a la clase, ¡el dim público compartido se cambia para ambos usuarios! Debe haber una mejor manera de hacer esto. He mirado por todas partes y ahora estoy más confundido que cuando empecé ...

¿Cómo puedo hacer que QuoteStatus en la clase parcial sea único para cada usuario y acceder a él desde mi código? No puedo entenderlo :( por favor ayuda

Muchas gracias de antemano.

preguntado el 02 de septiembre de 11 a las 14:09

¿Qué sucede si el QuoteID pasado al método GetQuoteStatus es "1; Delete From Quote donde QuoteID> 1"? Nota: No lo intente, solo advierta contra los ataques de inyección de SQL. -

Hola, gracias por el aviso. La inyección es algo de lo que soy consciente, pero todavía no he aprendido cómo evitarlo. Aunque esta aplicación será un sistema abierto solo para personas específicas a través de restricciones de IP en IIS, estoy ansioso por saber qué puedo hacer para evitar esto en el futuro. Muchas gracias -

Es la linea quoteSelectHelper.GetQuoteInfo(QuoteID) en realidad eso o debería ser quoteStatusHelper.GetQuoteInfo(QuoteID)? -

Hola @Chris, sí, lo siento, fue un error tipográfico ... ¡bien visto! -

2 Respuestas

Una opción sería usar una variable local en su método para quoteStatus y usándolo como valor de retorno de GetQuoteStatus. Entonces no usarías más el miembro compartido QuoteStatus

EDITAR

Se agregó un ejemplo de función. Deberías eliminar tu miembro compartido QuoteStatus de tu clase. No uso VB en mi trabajo diario, así que espero no haber cometido ningún error de sintaxis estúpido.

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

Respondido el 02 de Septiembre de 11 a las 19:09

Hola Claudio, Gracias por tu ayuda. ¿Me puede dar un ejemplo de cómo hacer esto? Lo siento, todavía estoy en las primeras etapas de aprendizaje ... - Mr-Fácilmente-Confundido

El problema es que tu QuoteStatus la variable es compartida / estática. No es necesario que hagas eso aquí. Declararlo como público lo hará visible para otras clases. Eliminar Shared del método y el QuoteStaus variable, y todo debería estar bien.

Una vez que eliminas Shared será una clase de instancia, lo que significa que deberá inicializarla en su código:

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

EDITAR

Echando un vistazo más de cerca a su código, parece que podría hacer GetQuoteStatus una función que devuelve el QuoteStatus como una cadena, como sugirió @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

Haciendo GetQuoteStatus una función, podrá obtener el valor de esta manera:

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

Respondido el 02 de Septiembre de 11 a las 19:09

Hola James. ¡Gracias por editar mi mala charla de inglés y programación para principiantes! No estaba seguro de qué 'compartido' eliminar, así que los probé uno por uno y obtengo: La referencia a un miembro no compartido requiere una referencia de objeto Gracias por su ayuda - Mr-Fácilmente-Confundido

Eliminar Shared from the QuoteStatus variable también. - James Johnson

Ahh ok. He cambiado todos los públicos compartidos a solo públicos en el archivo, pero ahora tengo otro problema ... Cuando uso 'dim something = quoteStatusHelper.QuoteStatus' en otro archivo, aparece un error: 'La referencia a un miembro no compartido requiere un referencia de objeto. ' ¿Cómo puedo superar esto? ¡Muchas gracias! - Mr-Fácilmente-Confundido

Vea mi respuesta editada. Incluí código para mostrarte cómo inicializar una instancia de quoteStatusHelper. - James Johnson

AHA! Gracias por explicármelo James ... ¡Funciona perfectamente! 6 horas tratando de resolverlo yo mismo y solo unos minutos aquí y todo está resuelto. ¡Muchas gracias! - Mr-Fácilmente-Confundido

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.