【问题标题】:Error in SQL query in Visual Studio 2012Visual Studio 2012 中的 SQL 查询错误
【发布时间】:2013-05-17 21:53:45
【问题描述】:

我正在尝试写一些可以在工作中使用并且正在自学的东西。我遇到了一个我找不到解决方案的问题,尽管我很可能只是不熟悉正确的术语。

我已将 Visual Studio 项目附加到 SQL 数据库,并尝试执行搜索,我可以在三个文本框中的任何一个中输入信息,它会相应地过滤返回的结果。这是用户搜索查询:

SELECT        First_Name AS [First Name], Middle_Name AS [Middle Name], Last_Name AS [Last Name], Users_ID AS [Unique ID]
FROM            Users
WHERE        (First_Name LIKE '%' + @firstName + '%') AND (Last_Name LIKE '%' + @lastName + '%') AND (Users_ID LIKE '%' + @uniqueID + '%')
ORDER BY [Last Name]

这是我用来调用搜索的 SUB。我唯一遇到的问题是用户搜索。

Private Sub searchButton_Click(sender As Object, e As EventArgs) Handles searchButton.Click
    'Clear all variables when the search button is clicked.  This allows Search to start with a clean'
    'slate and gather new or changed variables again.'
    addRemoveValue = Nothing
    jobTitle = Nothing
    jtLocation = Nothing
    jtDepartment = Nothing
    loc = Nothing
    lComments = Nothing
    department = Nothing
    fname = Nothing
    lname = Nothing
    uID = Nothing

    'Gather variables.'
    addRemoveValue = TryCast(addRemoveComboBox.SelectedItem, String)
    jobTitle = TryCast(jobTitleTextBox.Text, String)
    jtLocation = TryCast(jtLocationComboBox.Text, String)
    jtDepartment = TryCast(jtDepartmentComboBox.Text, String)
    loc = TryCast(locationTextBox.Text, String)
    lComments = TryCast(lCommentsTextBox.Text, String)
    department = TryCast(departmentTextBox.Text, String)
    fname = TryCast(firstNameTextBox.Text, String)
    lname = TryCast(lastNameTextBox.Text, String)
    uID = TryCast(uniqueIDTextBox.Text, String)

    'I added this in order to troubleshoot the search feature for the Users search.'
    'If uID = Nothing Then'
    '    uID = "%"'
    'End If'

    'Change the visible buttons in the event of a Search.'
    disableButton.Visible = True
    addButton.Visible = False

    'Populate the Data Grid based on the item the user selects.'
    If addRemoveValue = "Job Title" Then
        With Me.DataGridView1
            .AutoGenerateColumns = True
            .DataSource = RoleTableAdapter.GetDataByTitle(jobTitle, jtLocation, jtDepartment)
            .AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders
            .AutoSizeColumnsMode = DataGridViewAutoSizeColumnMode.DisplayedCells
            .BorderStyle = BorderStyle.Fixed3D
            .EditMode = DataGridViewEditMode.EditOnEnter
        End With
    End If

    If addRemoveValue = "Location" Then
        With Me.DataGridView1
            .AutoGenerateColumns = True
            .DataSource = LocationTableAdapter.GetDataByLoc(loc)
            .AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders
            .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells
            .BorderStyle = BorderStyle.Fixed3D
            .EditMode = DataGridViewEditMode.EditOnEnter
        End With
    End If

    If addRemoveValue = "Department" Then
        With Me.DataGridView1
            .AutoGenerateColumns = True
            .DataSource = DepartmentTableAdapter.GetDataByDept(department)
            .AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders
            .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells
            .BorderStyle = BorderStyle.Fixed3D
            .EditMode = DataGridViewEditMode.EditOnEnter
        End With
    End If

    If addRemoveValue = "User" Then
        With Me.DataGridView1
            .AutoGenerateColumns = True
            .DataSource = UsersTableAdapter.GetDataByName(uID, fname, lname)
            .AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders
            .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells
            .BorderStyle = BorderStyle.Fixed3D
            .EditMode = DataGridViewEditMode.EditOnEnter
            .Columns("Unique ID").DisplayIndex = 0
            .Columns("Last Name").DisplayIndex = 1
            .Columns("First Name").DisplayIndex = 2
            .Columns("Middle Name").DisplayIndex = 3
        End With
    End If
End Sub

每当我对此进行测试时,都会收到以下错误:

未能启用约束。一行或多行包含值 违反非空、唯一或外键约束。

我查看了所有列的属性,所有列都可以包含 NULL 值。我已经查看并确保我的任何表上都没有外键约束。我不知道接下来要寻找什么来解决这个问题,因为我在这段代码中的其他三个搜索工作得很好,而且他们有非常相似的查询。

您能提供的任何帮助都会很棒!谢谢!!

【问题讨论】:

    标签: sql vb.net visual-studio-2012 sql-server-2008-r2


    【解决方案1】:

    是否存在名字、姓氏和/或用户 ID 可能为空的情况?

    如果您更改数据库中的列长度但不更新数据集,有时也会弹出此错误。

    【讨论】:

    • 是的,有。我的目标是用户将能够使用一个或多个字段进行搜索,但不必使用所有字段。
    • 你的@uniqueID 是什么数据类型?我知道它是我可以看到的部分中的字符串,但如果它在应用之前被转换为 int ,那么这可能会出现问题,尽管我预计会出现不同的错误。否则,请确保任何绑定都不会导致 uniqueID 重复或为空,如果它实际上被约束为唯一(因为 afaik,没有非空的唯一约束将允许空,但只有一个空)
    • @uniqueID 的数据类型是 varchar(12)。之所以这样设置,是因为有时 ID 中会包含一个字母。它确实是我正在使用的表的主键,但我只是选择行,而不是添加行,因此唯一属性不会发挥作用似乎是合乎逻辑的,因为该列的所有内容已经在数据库中是唯一的。我是不是在这个基础上?
    • 好吧,有点。可能有几个你没有预料到的不稳定来源。首先,数据集(确保您没有更改任何内容的大小并且没有刷新它)可以对允许的内容和不允许的内容有自己的想法。其次,如果您使用绑定,控件也可以知道什么是允许的,什么是不允许的。我想在这一点上,我会尝试以下操作:1)将您的选择复制粘贴到服务器的查询空间(您需要定义变量)并查看它是否在那里工作,2)删除 where 子句并将它们添加回来一个一个看看有什么问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    相关资源
    最近更新 更多