【问题标题】:checking for duplicate values before attempting insert (ASP.NET)在尝试插入之前检查重复值(ASP.NET)
【发布时间】:2011-04-14 22:27:01
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    此错误表示 myValue 变量的内容为空。如果它为空,则不能在其上使用 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 应该返回一个值,而您的选择查询返回两个(前缀和 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 语句中。

    【讨论】:

    • 试过了,和上面的一样发生了,没有错误了,但是当我输入重复值时它并没有阻止我。
    • 这意味着您用于检查重复值的查询是错误的。它返回 null,正如您期望它返回其他内容一样。解决这个问题,它会解决你的问题
    • 哦当然错了!看看你是怎么传参数的!您实际上并没有传递它们,它们是您编写的方式,它们只是文字,是字符串的一部分!
    • 好的,谢谢,我在原始帖子中对其进行了编辑,但我认为我做得不对。我现在所拥有的仍然无法正常工作。我需要使用吗?代替@checkPrefix 和@checkNum?
    • 你放在最后的看起来是正确的,但你说它仍然不起作用。您的数据库是什么,您可以 a) 尝试直接针对数据库运行此查询,b) 查看从您的应用程序到数据库的实际查询是什么?
    【解决方案2】:

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

    if String.IsNullOrEmpty(myValue) Then
    ...
    

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

    【讨论】:

      【解决方案3】:

      如果没有重复,myValue 为 null,因此您必须仅在 myValue 不为 null 时应用 .Length(这意味着仅检查 null 就足够了;没有 .Length

      If Not string.IsNullOrEmpty(myValue) Then
      

      【讨论】:

      • Not String.IsNullOrEmpty 中没有隐含的 Length > 0 吗?
      • 谢谢,试过了,我没有再收到错误但是当我输入重复值时它并没有阻止我......
      【解决方案4】:

      试试这样的东西(你必须适应 VB.Net)DBNull 与 Null 或 Nothing 不同,所以你必须将它与两者进行比较

      If myValue <> DBNull and not myvalue is nothing Then
      

      【讨论】:

        猜你喜欢
        • 2014-07-22
        • 2023-04-02
        • 2021-01-20
        • 1970-01-01
        • 2012-11-18
        • 1970-01-01
        • 1970-01-01
        • 2011-12-04
        • 1970-01-01
        相关资源
        最近更新 更多