VB.Net不在代码行上求值

VB.Net不在代码行上求值,vb.net,visual-studio-2017,Vb.net,Visual Studio 2017,最近我在一个VB.Net小程序中遇到了一个问题。该程序使用OleDb来控制Excel电子表格,我们用它来跟踪工作中的每周检查。OleDb部分工作正常,但是我添加了几个RegEx语句来验证一些输入,其中一个语句不工作。RegEx定义为 Private ReadOnly rgxTM As New Regex("^[T][M][ ]\d{4}$")` 并被评估为 If Not rgxTM.IsMatch(tm) Then MessageBox.Show("The tape measure n

最近我在一个VB.Net小程序中遇到了一个问题。该程序使用OleDb来控制Excel电子表格,我们用它来跟踪工作中的每周检查。
OleDb
部分工作正常,但是我添加了几个
RegEx
语句来验证一些输入,其中一个语句不工作。
RegEx
定义为

Private ReadOnly rgxTM As New Regex("^[T][M][ ]\d{4}$")`
并被评估为

If Not rgxTM.IsMatch(tm) Then
    MessageBox.Show("The tape measure number you entered is invalid.", "Invalid Tape Measure", MessageBoxButtons.OK, MessageBoxIcon.Error)
    Tb.Text = ""
    Exit Sub
End If
tm
定义为
tm=newForm.tmTb.Text.ToUpper

比较
RegEx
后,它有一个
OleDb.OleDbCommand
,用于更新
CommandText
,清除
参数并为新的
CommandText
设置它们,打开
OleDb.OleDbConnection
,执行
UPDATE
语句,然后关闭连接。这里的一切都在运行,我可以看到新值正在输入Excel电子表格live

起初我认为这些语句从未被输入,但是看到电子表格中的数据更新证明它正在通过嵌套的这一部分。我放置了一个
MessageBox.Show
并在
rgxTM.IsMatch(tm)
对话框中传递,而
MessageBox
从未显示。此外,如果我在嵌套的这一部分中设置了任何断点,即使我在
cmd.ExecuteNonQuery()
上设置了断点,这些断点也不会被命中,这显然是在更新我的电子表格

我已经检查了我的调试配置(调试,任何CPU),编译配置(我尝试过调试和发布,每个都选择了任何CPU和x86),检查和取消检查了“要求源文件与原始版本完全匹配”,就我所知,自第一次启动VS 2017以来,我没有改变任何主要的实际设置

代码片段

Option Explicit On

Imports System.Data.OleDb
Imports System.Text.RegularExpressions    

Private ReadOnly conStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & path & ";Extended Properties=""Excel 12.0 Xml;HDR=YES"""
Private ReadOnly con As New OleDbConnection With {
        .ConnectionString = conStr
    }
Private ReadOnly rgxTM As New Regex("^[T][M][ ]\d{4}$")
Private response As String

Dim cmdStr As String = "SELECT name, [Tape Measure Number], [Date Calibrated], [New Tape Measure Number] FROM [TAPE MEASURE LIST$] WHERE [Employee Number] = @gage"
Dim cmd As New OleDbCommand With {
    .CommandText = cmdStr,
    .Connection = con
}

Dim newForm As New NewForm("Please scan your new tape measure.")
response = newForm.ShowDialog()
If response <> vbOK Then
    Tb.Text = ""
    Exit Sub
Else
    tm = newForm.tmTb.Text.ToUpper
    MessageBox.Show(rgxTM.IsMatch(tm))
    If Not rgxTM.IsMatch(tm) Then
        MessageBox.Show("The tape measure number you entered is invalid.", "Invalid Tape Measure", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Tb.Text = ""
        Exit Sub
    End If
    cmd.CommandText = "UPDATE [TAPE MEASURE LIST$] SET [NEW TAPE MEASURE NUMBER] = @tm, [DATE OF CHANGE] = @date WHERE [EMPLOYEE NUMBER] = @empnum"
    cmd.Parameters.Clear()
    cmd.Parameters.AddWithValue("@tm", tm)
    cmd.Parameters.AddWithValue("@date", DateTime.Now.ToShortDateString)
    cmd.Parameters.AddWithValue("@empnum", gage)
    con.Open()
    cmd.ExecuteNonQuery()
    con.Close()
    Tb.Text = ""
End If
选项显式打开
导入System.Data.OleDb
导入System.Text.RegularExpressions
Private ReadOnly conStr As String=“Provider=Microsoft.ACE.OLEDB.12.0;Data Source=“&path&“Extended Properties=”“Excel 12.0 Xml;HDR=YES”“”
专用只读con作为新的OLEDB连接与{
.ConnectionString=conStr
}
私有只读rgxTM作为新正则表达式(“^[T][M][]\d{4}$”)
作为字符串的私有响应
Dim cmdStr As String=“从[卷尺列表$]中选择名称[卷尺编号],[校准日期],[新卷尺编号],其中[员工编号]=@gage”
Dim cmd作为新的OLEDB命令,带有{
.CommandText=cmdStr,
.Connection=con
}
将newForm变暗为newForm(“请扫描您的新卷尺”)
response=newForm.ShowDialog()
如果响应vbOK,则
Tb.Text=“”
出口接头
其他的
tm=newForm.tmTb.Text.ToUpper
MessageBox.Show(rgxTM.IsMatch(tm))
如果不是rgxTM.IsMatch(tm),则
MessageBox.Show(“您输入的卷尺编号无效。”,“无效卷尺”,MessageBoxButtons.OK,MessageBoxIcon.Error)
Tb.Text=“”
出口接头
如果结束
cmd.CommandText=“更新[卷尺列表$]设置[新卷尺编号]=@tm,[变更日期]=@DATE WHERE[员工编号]=@empnum”
cmd.Parameters.Clear()
cmd.Parameters.AddWithValue(“@tm”,tm)
cmd.Parameters.AddWithValue(“@date”,DateTime.Now.ToShortDateString)
cmd.Parameters.AddWithValue(“@empnum”,gage)
con.Open()
cmd.ExecuteNonQuery()
con.Close()
Tb.Text=“”
如果结束
else
语句中输入的任何断点都将被忽略;我使用的任何其他断点都会正常命中。我知道它正在输入
else
语句,因为执行了
UPDATE


我正在使用Office 2010和Visual Studio 2017在Windows 7 Professional 64上运行此程序。

我给您的第一个提示(不是阅读其余内容):请用value替换add。。。这是一个糟糕的方法。您是否尝试在函数的第一个命令处设置断点?也许一步一步地告诉你问题出在哪里。如果你可以正常地点击任何其他断点,如果你中断
If
语句,然后单步执行,会发生什么?你还可以使用一些额外的策略:
Debug.Assert
来验证程序状态(请注意,断言中的表达式不会编译为发布程序,因此请确保它不会更改程序状态!);在极端情况下,有一个Windows API函数
DebugBreak
,它将导致代码中出现一个硬断点。@muffi我很乐意听到一个更好的处理方法,尽管我没有那么特别,因为我使用的是
OleDb
而不是
SQL
。我在每一行上都设置了一个断点,在块上也设置了断点is在内部并逐步通过它,而逐步通过似乎命中了行,但它们永远不会计算。设置断点可以让我逐行移动,直到命中此代码块。@Craig我在
MessageBox.Show(rgxTM.IsMatch(tm))之后添加了
Debug.Assert(rgxTM.IsMatch(tm))
它确实弹出了一个窗口,如果我理解正确,这是所需的行为,因为语句使用字符串
5101
计算为
False
。因此,它似乎在计算代码中的一些行,但我仍然不清楚为什么没有计算每一行。我给你的第一个提示(没有读其余的):请用value替换AddWithValue…这是一个糟糕的方法。您是否尝试在函数的第一个命令处设置断点?可能会逐步向您显示问题所在。如果您可以正常命中任何其他断点,如果您中断
If
语句,然后逐步执行,会发生什么情况?还有一些额外的stra您可以使用:
Debug.Assert
来验证程序状态(请注意,Assert中的表达式不会编译成发布程序,因此请确保它不会更改程序状态!);在极端情况下,有一个Windows API函数
Debug