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