VB. NET Executereader не хватает памяти при переключении на китайский язык - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть этот код, который очень хорошо работает на разных языках, но когда я изменяю региональный формат чисел на «Китайский традиционный», исключение нехватки памяти происходит в Executereader! Что делать? Спасибо!

Dim dv As DataView
Dim dt As DataTable = New DataTable
dv = New DataView(dt)
Dim dr As DataRow
Dim myreader As OleDbDataReader
dbobj = New dboperation("2")
dbobj.objcmd.CommandType = CommandType.Text
dbobj.objcmd.CommandText = "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 (@Country Is NULL OR [country code]=@Country) and (@City Is NULL OR [alternatenames] like '%'+@City+'%')" ' OR [Alt] like '%'+@City+'%')"

dbobj.objcmd.Parameters.AddWithValue("@Country", IIf(Country = "" Or Country Is Nothing, DBNull.Value, mMdl.FixString(Country)))
dbobj.objcmd.Parameters.AddWithValue("@City", IIf(City = "" Or City Is Nothing, DBNull.Value, City))

If mMdl.SQlInjection(dbobj) Then
    Return Nothing
End If

If dbobj.objcmd.Connection.State = ConnectionState.Closed Then
    dbobj.objcmd.Connection.Open()
End If

myreader = dbobj.objcmd.ExecuteReader                  

1 Ответ

1 голос
/ 12 февраля 2020

Это не прямой ответ, но я хотел решить несколько проблем в исходном коде и мне нужно больше места, чем уместилось бы в комментарии. Некоторые изменения являются стилистическими 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)

...