我正在努力编写可以在工作中使用的东西,并且正在自行学习。我遇到了一个我找不到解决方案的问题,虽然我很可能只是不熟悉正确的术语。Visual Studio 2012中的SQL查询错误
我已将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
每当我测试,我收到以下错误:
Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.
我看过的所有列的属性,它们都可以包含空值。我查看了并确保我的桌子上没有外键约束。为了解决这个问题,我很困惑,为了解决这个问题,我在这段代码中进行的其他三项搜索工作得很好,并且他们有非常相似的查询。
任何帮助你可以提供将是很棒!谢谢!!
是的,有。我的目标是用户将能够使用一个或多个字段进行搜索,但不必使用所有字段。 – Jerrbert
@uniqueID是通过什么数据类型?我知道它是我可以看到的部分中的字符串,但是如果它在应用之前转换为int,那么这可能会有问题,但我会期望得到一个不同的错误。否则,确保任何绑定不会导致uniqueID重复或为空,如果它实际上被约束为唯一的(因为afaik,没有null的唯一约束将允许null,但只有一个null) – ZhiHeather
@uniqueID的数据类型是varchar(12)。它是这样设置的,因为偶尔ID会写一封信。 它恰好是我正在使用的表的主键,但我只是选择行而不是添加行,所以独特属性不会发挥作用,因为该列的所有内容在数据库中已经是唯一的。 我离开那个基地吗? – Jerrbert