Это не прямой ответ, но я хотел решить несколько проблем в исходном коде и мне нужно больше места, чем уместилось бы в комментарии. Некоторые изменения являются стилистическими c, но некоторые из этих изменений исправляют серьезные ошибки в исходном коде. Меня также поражает, как часто простое исправление таких вещей, чтобы использовать лучшие шаблоны, исправляет исходную проблему в вопросе.
Dim dt As New DataTable()
Dim sql As String = "
SELECT [geonameid], [name], [asciiname], [alternatenames], [latitude], [longitude], [timezone], [admin1 code], [code] , [Field2], [Field3]
FROM atlas_view a
LEFT JOIN Admin1CodesASCII d on a.code=d.Field1
WHERE 1=1"
If Not String.IsNullOrEmpty(Country) Then
sql += " AND [country code]= @Country"
End If
If Not String.IsNullOrEmpty(City) Then
sql += " AND ([alternatenames] like '%'+@City+'%' OR [Alt] like '%'+@City+'%')"
End If
' If the dboperation type manages your connections, it should implement IDisposable!
' Also, the official MS style guide now explicitly recommends NOT to use "obj" prefixes. That behavior died with vb6, more than 15 years ago.
Using db As New dboperation("2")
If Not String.IsNullOrEmpty(Country) Then
' Don't use AddWithValue! It can cause HUGE performance issues.
' I had to guess at parameter type and length. You should use actual types and length from the database
db.cmd.Parameters.Add("@Country", OleDbType.VarWChar, 3).Value = mMdl.FixString(Country)
End IF
If Not String.IsNullOrEmpty(City) Then
db.cmd.Parameters.Add("@City", OleDbType.VarWChar, 30).Value = City
End If
db.cmd.Connection.Open()
Using rdr As OleDbDataReader = db.cmd.ExecuteReader()
dt.Load(rdr)
End Using
End Using
Dim result As New DataView(dt)