Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. Visual Basic
  4. Cannot dispose/clear memory of sqldatareader [modified]

Cannot dispose/clear memory of sqldatareader [modified]

Scheduled Pinned Locked Moved Visual Basic
databasesql-serversysadminperformancequestion
13 Posts 5 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • N neo_6053

    i didnt use datatable because the table is too large. but suddenly i realize i can just "select top 1" =_= btw, will this solve the problem of memory leak?

    Wat key(s) do gamer press most? WASD Wat key(s) do Programmer press most? Ctrl C + Ctrl V

    D Offline
    D Offline
    Dave Kreskowiak
    wrote on last edited by
    #4

    If you're looking at TaskManager to see the memory statistics, you're looking at the wrong stats. TaskManager is showing you about how much memory is reserved by the .NET CLR that is running your app. It is NOT the amount of memory your app is actually using. If you want to see much more accurate stats, use Performance Monitor instead. There are a bunch of .NET Memory counters you can look at that won't "lie" to you.

    A guide to posting questions on CodeProject[^]
    Dave Kreskowiak Microsoft MVP Visual Developer - Visual Basic
         2006, 2007, 2008

    N 1 Reply Last reply
    0
    • D Dave Kreskowiak

      If you're looking at TaskManager to see the memory statistics, you're looking at the wrong stats. TaskManager is showing you about how much memory is reserved by the .NET CLR that is running your app. It is NOT the amount of memory your app is actually using. If you want to see much more accurate stats, use Performance Monitor instead. There are a bunch of .NET Memory counters you can look at that won't "lie" to you.

      A guide to posting questions on CodeProject[^]
      Dave Kreskowiak Microsoft MVP Visual Developer - Visual Basic
           2006, 2007, 2008

      N Offline
      N Offline
      neo_6053
      wrote on last edited by
      #5

      but it's actually the sqlserv.exe that use up the memory. it reach above 1GB if i continue to run the program. i try to run the code in debug mode, if i stop it, it wouldn't free up the memory also.

      Wat key(s) do IM user press most? > ENTER - to send msg Wat key(s) do gamer press most? > WASD Wat key(s) do Programmer press most? . . . > Ctrl C + Ctrl V

      1 Reply Last reply
      0
      • N neo_6053

        I run codes to get all the columns for all my table in database using sqldatareader. But then the sqlserv.exe use up too many memory. i tried to dispose everything at the end of the program but still not work. or is it anything to do with the sql server 2005 itself?

        this is the sample of my code.. i know it sounds noob, but i just want to get it work.. =_=''

            Dim oraCommand As OracleCommand 
            Dim oraDr As OracleDataReader 
            Dim sqlCommand As SqlCommand 
            Dim sqlDr As SqlDataReader 
            Dim oraFieldCount, sqlFieldCount As Integer 
            Dim oraArr, sqlArr As New ArrayList 
            Dim strMissColPK, strMissColNotPK, strMissCol As String 
            Dim oraCount, sqlCount As Integer 
        
            Me.RichTextBox1.Clear() 
            If Me.chkData.Checked = False And Me.chkCol.Checked = False And Me.chkTable.Checked = False Then 
                Exit Sub 
            End If 
        
            For i As Integer = 0 To Me.ListBox1.SelectedItems.Count - 1 
                Try 
                    oraCount = 0 
                    sqlCount = 0 
                    oraCon.Open() 
                    oraCommand = New OracleCommand("select \* from " & Me.ListBox1.SelectedItems(i).ToString, oraCon) 
                    oraDr = oraCommand.ExecuteReader 
                    oraDr.Read() 
                    oraFieldCount = oraDr.FieldCount 
                    oraArr.Clear() 
                    For j As Integer = 0 To oraDr.FieldCount - 1 
                        oraArr.Add(oraDr.GetName(j).ToLower) 
                    Next 
                    oraDr.Close() 
                    oraCommand = New OracleCommand("select count(\*) from " & Me.ListBox1.SelectedItems(i).ToString, oraCon) 
                    oraDr = oraCommand.ExecuteReader 
                    If oraDr.Read Then 
                        oraCount = oraDr(0) 
                    End If 
        
                    sqlCOn.Open() 
                    sqlCommand = New SqlCommand("select \* from " & Me.ListBox1.SelectedItems(i).ToString, sqlCOn) 
                    sqlDr = sqlCommand.ExecuteReader()  ## Here is where the system use about 2mb for each table. I have 400+ table ##
                    sqlDr.Read() 
                    sqlFieldCount = sqlDr.FieldCount 
                    sqlArr.Clear() 
                    For j As Integer = 0 To sqlDr.FieldCount - 1 
                        sqlArr.Add(sqlDr.GetName(j).ToLower) 
                    Next 
                    sqlDr.Close() 
                    sqlCommand = New SqlCommand("select count(\*) from " & Me.ListBox1.SelectedItems(i).ToString, sqlCOn) 
                    sq
        
        C Offline
        C Offline
        Christian Graus
        wrote on last edited by
        #6

        If the memory usage is in SQL Server, then you need to optimise your SQL and how you call SQL Server to limit memory usage.

        Christian Graus Driven to the arms of OSX by Vista.

        N 1 Reply Last reply
        0
        • C Christian Graus

          If the memory usage is in SQL Server, then you need to optimise your SQL and how you call SQL Server to limit memory usage.

          Christian Graus Driven to the arms of OSX by Vista.

          N Offline
          N Offline
          neo_6053
          wrote on last edited by
          #7

          Thx. But what should i do? How to optimize? FYI, i 've change to use sqldataadapter, it seems to use less memory, but still it wont free up after used. and btw, as can seen from my code, i used oracle reader too. it does not have any problem.

          Wat key(s) do gamer press most? > WASD Wat key(s) do Programmer press most? > Ctrl C + Ctrl V

          C 1 Reply Last reply
          0
          • N neo_6053

            Thx. But what should i do? How to optimize? FYI, i 've change to use sqldataadapter, it seems to use less memory, but still it wont free up after used. and btw, as can seen from my code, i used oracle reader too. it does not have any problem.

            Wat key(s) do gamer press most? > WASD Wat key(s) do Programmer press most? > Ctrl C + Ctrl V

            C Offline
            C Offline
            Christian Graus
            wrote on last edited by
            #8

            Well, one way would be to write a bunch of SQL so you send it all at once and get a single dataset back instead of using readers over and over for every result you want.

            Christian Graus Driven to the arms of OSX by Vista.

            1 Reply Last reply
            0
            • N neo_6053

              I run codes to get all the columns for all my table in database using sqldatareader. But then the sqlserv.exe use up too many memory. i tried to dispose everything at the end of the program but still not work. or is it anything to do with the sql server 2005 itself?

              this is the sample of my code.. i know it sounds noob, but i just want to get it work.. =_=''

                  Dim oraCommand As OracleCommand 
                  Dim oraDr As OracleDataReader 
                  Dim sqlCommand As SqlCommand 
                  Dim sqlDr As SqlDataReader 
                  Dim oraFieldCount, sqlFieldCount As Integer 
                  Dim oraArr, sqlArr As New ArrayList 
                  Dim strMissColPK, strMissColNotPK, strMissCol As String 
                  Dim oraCount, sqlCount As Integer 
              
                  Me.RichTextBox1.Clear() 
                  If Me.chkData.Checked = False And Me.chkCol.Checked = False And Me.chkTable.Checked = False Then 
                      Exit Sub 
                  End If 
              
                  For i As Integer = 0 To Me.ListBox1.SelectedItems.Count - 1 
                      Try 
                          oraCount = 0 
                          sqlCount = 0 
                          oraCon.Open() 
                          oraCommand = New OracleCommand("select \* from " & Me.ListBox1.SelectedItems(i).ToString, oraCon) 
                          oraDr = oraCommand.ExecuteReader 
                          oraDr.Read() 
                          oraFieldCount = oraDr.FieldCount 
                          oraArr.Clear() 
                          For j As Integer = 0 To oraDr.FieldCount - 1 
                              oraArr.Add(oraDr.GetName(j).ToLower) 
                          Next 
                          oraDr.Close() 
                          oraCommand = New OracleCommand("select count(\*) from " & Me.ListBox1.SelectedItems(i).ToString, oraCon) 
                          oraDr = oraCommand.ExecuteReader 
                          If oraDr.Read Then 
                              oraCount = oraDr(0) 
                          End If 
              
                          sqlCOn.Open() 
                          sqlCommand = New SqlCommand("select \* from " & Me.ListBox1.SelectedItems(i).ToString, sqlCOn) 
                          sqlDr = sqlCommand.ExecuteReader()  ## Here is where the system use about 2mb for each table. I have 400+ table ##
                          sqlDr.Read() 
                          sqlFieldCount = sqlDr.FieldCount 
                          sqlArr.Clear() 
                          For j As Integer = 0 To sqlDr.FieldCount - 1 
                              sqlArr.Add(sqlDr.GetName(j).ToLower) 
                          Next 
                          sqlDr.Close() 
                          sqlCommand = New SqlCommand("select count(\*) from " & Me.ListBox1.SelectedItems(i).ToString, sqlCOn) 
                          sq
              
              G Offline
              G Offline
              Guffa
              wrote on last edited by
              #9

              Make sure that you dispose all the disposable objects that you use. I see at least one OracleCommand object that you leave open and undisposed. As you do this in a loop, that's one connection for each selected item. Don't call GC.Collect. The garbage collector knows better when a garbage collection should be done.

              Despite everything, the person most likely to be fooling you next is yourself.

              N 1 Reply Last reply
              0
              • G Guffa

                Make sure that you dispose all the disposable objects that you use. I see at least one OracleCommand object that you leave open and undisposed. As you do this in a loop, that's one connection for each selected item. Don't call GC.Collect. The garbage collector knows better when a garbage collection should be done.

                Despite everything, the person most likely to be fooling you next is yourself.

                N Offline
                N Offline
                neo_6053
                wrote on last edited by
                #10

                sorry for misleading. Actually it's the sqlserv.exe that use up the memory. My oracle.exe is working fine. MICROSOFT ......

                Wat key(s) do gamer press most? > WASD Wat key(s) do Programmer press most? > Ctrl C + Ctrl V

                G 1 Reply Last reply
                0
                • N neo_6053

                  sorry for misleading. Actually it's the sqlserv.exe that use up the memory. My oracle.exe is working fine. MICROSOFT ......

                  Wat key(s) do gamer press most? > WASD Wat key(s) do Programmer press most? > Ctrl C + Ctrl V

                  G Offline
                  G Offline
                  Guffa
                  wrote on last edited by
                  #11

                  It's normal for SQL Server to use any available memory for caching, that is the default setting. If you are running the SQL Server on the same computer as the application, you have to limit the amount of memory that SQL Server uses, so that there is some left for the application. Normally it takes days or weeks until SQL Server uses all available memory, but as you are fetching everything everytime in your query, it will go a lot faster. Verify that you close and dispose everything, not just the one object that I found at a quick read-through. I also see an SqlCommand object that you leave open and undisposed. That means that one connection is left open for each selected item, which uses a bit of memory for buffers, and also keeps the result in memory as you leave it unread. The connections will time out after a while, but you are probably running into problems before the timeouts starts to free up enough connections.

                  Despite everything, the person most likely to be fooling you next is yourself.

                  1 Reply Last reply
                  0
                  • N neo_6053

                    i didnt use datatable because the table is too large. but suddenly i realize i can just "select top 1" =_= btw, will this solve the problem of memory leak?

                    Wat key(s) do gamer press most? WASD Wat key(s) do Programmer press most? Ctrl C + Ctrl V

                    G Offline
                    G Offline
                    Guffa
                    wrote on last edited by
                    #12

                    neo_6053 wrote:

                    Wat key(s) do Programmer press most?

                    Depends on the programmer... For some it's the Z key... as in "plzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz hlp me!!!!".

                    Despite everything, the person most likely to be fooling you next is yourself.

                    1 Reply Last reply
                    0
                    • N neo_6053

                      I run codes to get all the columns for all my table in database using sqldatareader. But then the sqlserv.exe use up too many memory. i tried to dispose everything at the end of the program but still not work. or is it anything to do with the sql server 2005 itself?

                      this is the sample of my code.. i know it sounds noob, but i just want to get it work.. =_=''

                          Dim oraCommand As OracleCommand 
                          Dim oraDr As OracleDataReader 
                          Dim sqlCommand As SqlCommand 
                          Dim sqlDr As SqlDataReader 
                          Dim oraFieldCount, sqlFieldCount As Integer 
                          Dim oraArr, sqlArr As New ArrayList 
                          Dim strMissColPK, strMissColNotPK, strMissCol As String 
                          Dim oraCount, sqlCount As Integer 
                      
                          Me.RichTextBox1.Clear() 
                          If Me.chkData.Checked = False And Me.chkCol.Checked = False And Me.chkTable.Checked = False Then 
                              Exit Sub 
                          End If 
                      
                          For i As Integer = 0 To Me.ListBox1.SelectedItems.Count - 1 
                              Try 
                                  oraCount = 0 
                                  sqlCount = 0 
                                  oraCon.Open() 
                                  oraCommand = New OracleCommand("select \* from " & Me.ListBox1.SelectedItems(i).ToString, oraCon) 
                                  oraDr = oraCommand.ExecuteReader 
                                  oraDr.Read() 
                                  oraFieldCount = oraDr.FieldCount 
                                  oraArr.Clear() 
                                  For j As Integer = 0 To oraDr.FieldCount - 1 
                                      oraArr.Add(oraDr.GetName(j).ToLower) 
                                  Next 
                                  oraDr.Close() 
                                  oraCommand = New OracleCommand("select count(\*) from " & Me.ListBox1.SelectedItems(i).ToString, oraCon) 
                                  oraDr = oraCommand.ExecuteReader 
                                  If oraDr.Read Then 
                                      oraCount = oraDr(0) 
                                  End If 
                      
                                  sqlCOn.Open() 
                                  sqlCommand = New SqlCommand("select \* from " & Me.ListBox1.SelectedItems(i).ToString, sqlCOn) 
                                  sqlDr = sqlCommand.ExecuteReader()  ## Here is where the system use about 2mb for each table. I have 400+ table ##
                                  sqlDr.Read() 
                                  sqlFieldCount = sqlDr.FieldCount 
                                  sqlArr.Clear() 
                                  For j As Integer = 0 To sqlDr.FieldCount - 1 
                                      sqlArr.Add(sqlDr.GetName(j).ToLower) 
                                  Next 
                                  sqlDr.Close() 
                                  sqlCommand = New SqlCommand("select count(\*) from " & Me.ListBox1.SelectedItems(i).ToString, sqlCOn) 
                                  sq
                      
                      N Offline
                      N Offline
                      neo_6053
                      wrote on last edited by
                      #13

                      i've tried to do some testing. this is my testing code

                      Dim sqlCOn As New SqlConnection("Server=localhost;Database=phxtest;Trusted_Connection=yes")
                      Dim sqlda As SqlDataAdapter
                      Dim sqldt As DataSet
                      Dim sqlFieldCount As Integer
                      sqlCOn.Open()
                      Dim SqlCommand As New SqlCommand("select top 0 * from msaspot", sqlCOn)
                      sqlda = New SqlDataAdapter(SqlCommand)
                      sqlDt = New DataSet
                      sqlDa.Fill(sqlDt) ## Here is where it use up the memory ##
                      sqlDa.Dispose()
                      sqlFieldCount = sqldt.Tables(0).Columns.Count
                      sqldt.Clear()
                      sqldt.Dispose()
                      SqlCommand.Dispose()
                      sqlCOn.Close()
                      sqlCOn.Dispose()

                      Wat key(s) do gamer press most? > WASD Wat key(s) do Programmer press most? > Ctrl C + Ctrl V

                      1 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • World
                      • Users
                      • Groups