在尝试插入之前检查重复值(ASP.NET)

时间:2011-04-14 22:27:02

标签: asp.net vb.net validation select duplicates

我有一个表单,其中表单第一页上的两个字段构成主键。我想在尝试插入记录之前检查重复值,因为我不希望用户一直浏览表单,只是发现他们无法提交。因此,当用户尝试转到表单的下一页时,我正在尝试检查重复值。我不太清楚该怎么做,果然我得到了一个错误。 (“对象引用未设置为对象的实例。”)问题显然在我的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 个答案:

答案 0 :(得分:1)

此错误表示myValue变量的内容为null。如果它为null,则不能在其上使用Length属性(或任何其他属性)。您必须明确检查null:

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 Injection提供某种保护,因为您是根据用户输入形成查询的。在您的情况下,使用OleDbParameter可能是合适的。

修改2

您还有权提及ExecuteScalar可能存在问题。 ExecuteScalar应该返回一个值,你的select查询返回两个(前缀和course_number)。更改它以便它返回单个参数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语句中

答案 1 :(得分:0)

如果没有重复,则

myValue为空,因此仅当.Length不为空时才必须应用myValue(这意味着只检查null就足够了;没有.Length

If Not string.IsNullOrEmpty(myValue) Then

答案 2 :(得分:0)

首先ExecuteScalar只返回一个值,因此在这种情况下,您只会从结果中获取列prefix。第二,如果与您的查询不匹配,它将返回null,因此您的下一次长度检查应考虑该情况:

if String.IsNullOrEmpty(myValue) Then
...

参考:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar.aspx

答案 3 :(得分:0)

尝试这样的事情(你必须将它改编为VB.Net)DBNull与Null或Nothing不同,所以你必须将它与两者进行比较

If myValue <> DBNull and not myvalue is nothing Then