VB.NET Executereader在切换到中文时内存不足

问题描述 投票:0回答:1

我有这样的代码,可以在不同的语言中很好地工作,但是当我将区域设置数字格式更改为“繁体中文”时,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                  
.net vb.net ms-access cjk executereader
1个回答
0
投票

这不是直接的答案,但是我想解决原始代码中的几个问题,并且需要的空间比注释中的空间大。其中一些更改具有风格,但是其中一些更改修复了原始代码中的实际严重错误。这也让我感到惊讶,仅仅修复这些问题以使用更好的模式就能解决一个问题中的原始问题。

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)

© www.soinside.com 2019 - 2024. All rights reserved.