> 「苗字 IS NULL」は、レコードの苗字列の値がDbNullの場合はTrueを返すという事は理解していますが、「? = 1」の意味が解りません。
空文字列と NULL を区別するための措置です。
たとえば WHERE (? = 1 AND 苗字 IS NULL) OR (苗字 = ?) という部分を WHERE ([引数1] = 1 AND 苗字 IS NULL) OR (苗字 = [引数2]) のように読み替えてみます。
そのうえで、VB 側からは Dim 引数1 As Integer, 引数2 As String If NULLをセットしたい場合 Then 引数1 = 1 引数2 = Nothing '未使用 Else 引数1 = 0 引数2 = TextBox1.Text End If のような引数が渡されるイメージです。