Как назначить запрашиваемое мной значение в строку, которая является аргументом в процедуре, если тип данных аргумента - объект? - PullRequest
0 голосов
/ 05 декабря 2011

Я сделал эту процедуру, чтобы помочь мне повторно использовать запрос выбора:

Private Sub selectQry(ByVal myColumn As String, ByVal myTable As String, ByVal myFilter As String, ByVal myObjectOne As Object, ByVal myObj As Object)
    Dim qrySlctCaldate As String = "SELECT " + myColumn + " FROM " + myTable + " WHERE " + myFilter + " = '" & Replace(myObjectOne, "'", "''") & "'"
    Dim cmdSlct As New SqlCommand(qrySlctCaldate, transConn.Connection)


    Dim readSCalDate As SqlDataReader
    readSCalDate = cmdSlct.ExecuteReader

    While readSCalDate.Read
        If TypeOf (myObj) Is TextBox Or TypeOf (myObj) Is ComboBox Then
            myObj.Text = readSCalDate.Item(myColumn).ToString
        Else
            myObj = readSCalDate.Item(myColumn).ToString

        End If
    End While
    readSCalDate.Close()

И я использую его следующим образом, если я хочу, чтобы выбранное значение помещалось в текстовое поле, и оно отлично работает

selectQry("ProcConvDescription", "Line", "LineCode", nameValue.Value, txtProcess)

Однако, если я хочу, чтобы значение передавалось в строке, например:

 selectQry("LastCalibrationDate", "EquipmentItem", "ControlNo", txtControlNo.Text, strCalDate)

Строка заканчивается пустым значением строки. Как назначить запрашиваемое значение этой строке?

Ответы [ 2 ]

2 голосов
/ 05 декабря 2011

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

Private Function selectQry(ByVal myColumn As String, ByVal myTable As String, 
                           ByVal myFilter As String, ByVal myObjectOne As Object
                          ) As String
    Dim qrySlctCaldate As String = _
        String.Format("SELECT {0} FROM {1} WHERE {2} = '{3}'",
                      myColumn, myTable, myFilter,
                      Replace(myObjectOne, "'", "''"))
    Dim cmdSlct As New SqlCommand(qrySlctCaldate, transConn.Connection)

    Using readSCalDate As SqlDataReader = cmdSlct.ExecuteReader
        While readSCalDate.Read
            Return readSCalDate.Item(myColumn).ToString
        End While
    End Using
End Sub

txtProcess.Text = selectQry("ProcConvDescription", "Line", "LineCode", nameValue.Value)
strCalDate = selectQry("LastCalibrationDate", "EquipmentItem", "ControlNo", txtControlNo.Text)

Кроме того, я бы настоятельно рекомендовал включить Option Strict, чтобы повысить безопасность типов.

1 голос
/ 05 декабря 2011

Попробуйте передать myObj по ссылке:

ByRef myObj As Object)

... и посмотрите, поможет ли это.

И хотя я вижу ценность возможности динамически создавать этот запрос, вы должны действительно настроить предложение WHERE, чтобы вместо этого использовать параметры sql (защищает от внедрения SQL).

" WHERE " + myFilter + " = @objectOne "
cmdSlct.Parameters.Clear()
cmdSlct.Parameters.AddWithValue("objectOne",myObjectOne)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...