|
dev
newsgroups
|
|||||||||||||||||||||||
|
|||||||||||||||||||||||
Possible memory leak in SQLDataReader().isolated the leak down to a section of code that basically uses a managed ADO.NET SQLDataReader object. The leak seems to occur on the ExecuteReader() call. I am calling this method over and over again at fairly rapid intervals. The Close() method of the reader is always called when I am done with the SQLDataReader. Can someone tell me if there is a way around this leak or if there is a fix out there? Sample Code: SqlCommand *SQLCmd = __gc new SqlCommand(); SqlDataReader *SQLReader; SQLCmd->Connection = MyConnectionObject; SQLCmd->CommandText = "sp_SelectImageEventID @nImageType = 1"; // My stored procedure SQLReader = SQLCmd->ExecuteReader(); if (SQLReader->HasRows) { // Do stuff } SQLReader->Close(); -- ----------------------------------- Ken Varn Senior Software Engineer Diebold Inc. EmailID = varnk Domain = Diebold.com ----------------------------------- Since SqlDataReader implements IDisposable, you should call Dispose after
you are done with. -- Show quoteMiha Markic [MVP C#] RightHand .NET consulting & development www.rthand.com Blog: http://cs.rthand.com/blogs/blog_with_righthand/ "Ken Varn" <nospam> wrote in message news:uO1yq1xNGHA.1032@TK2MSFTNGP11.phx.gbl... >I have a managed C++ application that is exhibiting a memory leak. I > isolated the leak down to a section of code that basically uses a managed > ADO.NET SQLDataReader object. The leak seems to occur on the > ExecuteReader() call. I am calling this method over and over again at > fairly rapid intervals. The Close() method of the reader is always called > when I am done with the SQLDataReader. Can someone tell me if there is a > way around this leak or if there is a fix out there? > > Sample Code: > > SqlCommand *SQLCmd = __gc new SqlCommand(); > SqlDataReader *SQLReader; > > SQLCmd->Connection = MyConnectionObject; > SQLCmd->CommandText = "sp_SelectImageEventID @nImageType = 1"; // My > stored procedure > SQLReader = SQLCmd->ExecuteReader(); > > if (SQLReader->HasRows) > { > // Do stuff > } > > SQLReader->Close(); > > > > -- > ----------------------------------- > Ken Varn > Senior Software Engineer > Diebold Inc. > > EmailID = varnk > Domain = Diebold.com > ----------------------------------- > > I tried calling Dispose() too. It still appears to be leaking memory. I
have not quite isolated the cause, but I think it may have something to do with the fact that I switch connections fairly often as well. -- Show quote----------------------------------- Ken Varn Senior Software Engineer Diebold Inc. EmailID = varnk Domain = Diebold.com ----------------------------------- "Miha Markic [MVP C#]" <miha at rthand com> wrote in message news:uXafHS4NGHA.740@TK2MSFTNGP12.phx.gbl... > Since SqlDataReader implements IDisposable, you should call Dispose after > you are done with. > > -- > Miha Markic [MVP C#] > RightHand .NET consulting & development www.rthand.com > Blog: http://cs.rthand.com/blogs/blog_with_righthand/ > > "Ken Varn" <nospam> wrote in message > news:uO1yq1xNGHA.1032@TK2MSFTNGP11.phx.gbl... > >I have a managed C++ application that is exhibiting a memory leak. I > > isolated the leak down to a section of code that basically uses a managed > > ADO.NET SQLDataReader object. The leak seems to occur on the > > ExecuteReader() call. I am calling this method over and over again at > > fairly rapid intervals. The Close() method of the reader is always called > > when I am done with the SQLDataReader. Can someone tell me if there is a > > way around this leak or if there is a fix out there? > > > > Sample Code: > > > > SqlCommand *SQLCmd = __gc new SqlCommand(); > > SqlDataReader *SQLReader; > > > > SQLCmd->Connection = MyConnectionObject; > > SQLCmd->CommandText = "sp_SelectImageEventID @nImageType = 1"; // My > > stored procedure > > SQLReader = SQLCmd->ExecuteReader(); > > > > if (SQLReader->HasRows) > > { > > // Do stuff > > } > > > > SQLReader->Close(); > > > > > > > > -- > > ----------------------------------- > > Ken Varn > > Senior Software Engineer > > Diebold Inc. > > > > EmailID = varnk > > Domain = Diebold.com > > ----------------------------------- > > > > > > What can I say - you should use a memory profiler to check whether there is
a real leak . -- Show quoteMiha Markic [MVP C#] RightHand .NET consulting & development www.rthand.com Blog: http://cs.rthand.com/blogs/blog_with_righthand/ "Ken Varn" <nospam> wrote in message news:%23KQl%23T7NGHA.2472@TK2MSFTNGP11.phx.gbl... >I tried calling Dispose() too. It still appears to be leaking memory. I > have not quite isolated the cause, but I think it may have something to do > with the fact that I switch connections fairly often as well. > > -- > ----------------------------------- > Ken Varn > Senior Software Engineer > Diebold Inc. > > EmailID = varnk > Domain = Diebold.com > ----------------------------------- > "Miha Markic [MVP C#]" <miha at rthand com> wrote in message > news:uXafHS4NGHA.740@TK2MSFTNGP12.phx.gbl... >> Since SqlDataReader implements IDisposable, you should call Dispose after >> you are done with. >> >> -- >> Miha Markic [MVP C#] >> RightHand .NET consulting & development www.rthand.com >> Blog: http://cs.rthand.com/blogs/blog_with_righthand/ >> >> "Ken Varn" <nospam> wrote in message >> news:uO1yq1xNGHA.1032@TK2MSFTNGP11.phx.gbl... >> >I have a managed C++ application that is exhibiting a memory leak. I >> > isolated the leak down to a section of code that basically uses a > managed >> > ADO.NET SQLDataReader object. The leak seems to occur on the >> > ExecuteReader() call. I am calling this method over and over again at >> > fairly rapid intervals. The Close() method of the reader is always > called >> > when I am done with the SQLDataReader. Can someone tell me if there is > a >> > way around this leak or if there is a fix out there? >> > >> > Sample Code: >> > >> > SqlCommand *SQLCmd = __gc new SqlCommand(); >> > SqlDataReader *SQLReader; >> > >> > SQLCmd->Connection = MyConnectionObject; >> > SQLCmd->CommandText = "sp_SelectImageEventID @nImageType = 1"; // My >> > stored procedure >> > SQLReader = SQLCmd->ExecuteReader(); >> > >> > if (SQLReader->HasRows) >> > { >> > // Do stuff >> > } >> > >> > SQLReader->Close(); >> > >> > >> > >> > -- >> > ----------------------------------- >> > Ken Varn >> > Senior Software Engineer >> > Diebold Inc. >> > >> > EmailID = varnk >> > Domain = Diebold.com >> > ----------------------------------- >> > >> > >> >> > > FYI, Close() calls Dispose() internally. So a call to Close is
sufficient. You should be calling Close in a finally block. Otherwise if there is an exception, close may be skipped. //instantiate reader try { //execute reader } finally { //close reader } Also if you are calling a stored procedure, you should be using a CommandType of "CommandType.StoredProcedure", then add your parameter via the parameters collection. I'm a C# developer, not C++ so I can't comment on if your syntax or usage of pointers is correct. Michael Lang |
|||||||||||||||||||||||