проверка на наличие дублирующихся значений перед попыткой вставки (ASP.NET) - PullRequest
2 голосов
/ 15 апреля 2011

У меня есть форма, в которой два поля на первой странице формы составляют первичный ключ. Я хочу проверить наличие повторяющихся значений, прежде чем пытаться вставить запись, поскольку я не хочу, чтобы пользователь прошел через форму только для того, чтобы узнать, что он не может ее отправить. Поэтому я пытаюсь проверить наличие дублирующихся значений, когда пользователь пытается перейти на следующую страницу формы. Я не совсем знал, как это сделать, и, конечно, я получаю сообщение об ошибке. («Ссылка на объект не установлена ​​для экземпляра объекта.») Проблема, по-видимому, заключается в моем операторе if «If myValue.Length> 0 Then», но я не уверен, что должно быть вместо этого.

Protected Sub CustomValidator1_ServerValidate(ByVal source As Object, ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles CustomValidator1.ServerValidate

    'get values
    Dim checkPrefix = txtCoursePrefix.Text
    Dim checkNum = txtCourseNum.Text

    'db connectivity
    Dim myConn As New OleDbConnection
    myConn.ConnectionString = AccessDataSource1.ConnectionString
    myConn.Open()

    'select records
    Dim mySelect As New OleDbCommand("SELECT prefix, course_number FROM tableCourse WHERE prefix='checkPrefix' AND course_number='checkNum'", myConn)

    'execute(Command)
    Dim myValue As String = mySelect.ExecuteScalar()
    'check if record exists
    If myValue.Length > 0 Then
        CustomValidator1.ErrorMessage = "some exp text"
        CustomValidator1.SetFocusOnError = "true"
        CustomValidator1.IsValid = "false"
    End If

End Sub

Думал, что выложу окончательное решение:

'select records
    Dim mySelect As New OleDbCommand("SELECT 1 FROM tableCourse WHERE prefix=? AND course_number=?", myConn)
    mySelect.Parameters.AddWithValue("@checkPrefix", checkPrefix)
    mySelect.Parameters.AddWithValue("@checkNum", checkNum) 

    'execute(Command)
    Dim myValue = mySelect.ExecuteScalar()

    'check if record exists
    If myValue IsNot Nothing Then
        CustomValidator1.SetFocusOnError = True
        args.IsValid = False
    End If

Ответы [ 4 ]

1 голос
/ 15 апреля 2011

Эта ошибка указывает, что содержимое переменной myValue равно нулю. Если оно пустое, вы не можете использовать свойство Length (или любое другое свойство в этом отношении) для него. Вы должны проверить на ноль явно:

If myValue IsNot Nothing Then

РЕДАКТИРОВАТЬ 1 Ваш SQL-запрос неверен. Я не знаю, какой будет правильный запрос, поскольку я не знаю вашу базу данных, но я думаю, что вы намереваетесь написать это:

Dim mySelect As New OleDbCommand("SELECT prefix, course_number FROM tableCourse WHERE prefix=" + checfkPreix + " AND course_number=" + checkNum, myConn)

или что-то на этот счет. Возможно, вы захотите использовать string.Format функцию для формирования строки. И вам также необходимо убедиться, что существует какая-то защита от SQL-инъекции , поскольку вы формируете свой запрос из пользовательского ввода. В вашем случае целесообразно использовать OleDbParameter .

Редактировать 2

Вы также вправе упомянуть, что может быть проблема с ExecuteScalar. ExecuteScalar должен возвращать одно значение, а ваш запрос на выборку возвращает два (префикс и номер_курса). Измените его так, чтобы он возвращал один параметр SELECT prefix FROM или просто SELECT 1 FROM, а затем оставшуюся часть запроса:

Dim mySelect As New OleDbCommand("SELECT 1 FROM tableCourse WHERE prefix=? AND course_number=?", myConn)
    mySelect.Parameters.AddWithValue("@checkPrefix", checkPrefix)
    mySelect.Parameters.AddWithValue("@checkNum", checkNum)

Редактировать 3 Вы неправильно настраиваете неудачную проверку в вашем валидаторе. Добавить

 args.IsValid = False 

внутри вашего оператора if.

0 голосов
/ 15 апреля 2011

вместо этого попробуйте что-то подобное (вам придется адаптировать его к VB.Net). DBNull отличается от Null или Nothing, поэтому вы должны сравнить его с обоими

If myValue <> DBNull and not myvalue is nothing Then
0 голосов
/ 15 апреля 2011

First ExecuteScalar вернет только одно значение, поэтому в этом случае вы только получите столбец prefix из результата. Во-вторых, если нет совпадения с вашим запросом, он вернет null, поэтому следующая проверка длины должна учитывать этот сценарий:

if String.IsNullOrEmpty(myValue) Then
...

Ссылка: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar.aspx

0 голосов
/ 15 апреля 2011

myValue равно нулю, если нет дубликатов, поэтому вы должны применять .Length только в том случае, если myValue не равно нулю (что означает, что достаточно проверить только null; без .Length)

If Not string.IsNullOrEmpty(myValue) Then
...