2014-07-16 56 views
0

我正在使用VB6与ADODB连接来连接到SQL Server 2012数据库和执行数据库查询,我面临内存泄漏,我看到内存使用情况后,查询完成后,我终止我的程序内存使用量不减少。sql server 2012内存泄漏

下面是我的代码:

Public adoCon As New ADODB.Connection 

公共服务器名称,作为字符串的databaseName作为字符串,表名作为字符串 公共SQLCMD作为字符串

公用Sub adodb_Connect()

If Tenzfrm.adoCon.State = adStateOpen Then Tenzfrm.adoCon.Close 
serverName = Tenzfrm.server_Name.Text 
databaseName = Tenzfrm.database_Name.Text 
Tenzfrm.adoCon.Provider = "sqloledb" 
Tenzfrm.adoCon.Properties("Data Source").Value = serverName 
Tenzfrm.adoCon.Properties("Initial Catalog").Value = databaseName 
Tenzfrm.adoCon.Properties("Integrated Security").Value = "SSPI" 
Tenzfrm.adoCon.CommandTimeout = 0 
Tenzfrm.adoCon.Open 

结束Sub

Public Sub adodb_关闭()

If Tenzfrm.adoCon.State = adStateOpen Then Tenzfrm.adoCon.Close 
Set Tenzfrm.adoCon = Nothing 

末次

Private Sub appHourlySTS_Click() 

Call adodb_Connect 
proccess.Caption = "Preparing tables !" 
proBar2.Width = 2 * proBar1.Width/100 
sqlCmd = "IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Tenz_Cell_STS_Hourly_Temp') DROP TABLE Tenz_Cell_STS_Hourly_Temp;" 
adoCon.Execute (sqlCmd) 
sqlCmd = "DECLARE @sqlCmd NVARCHAR(MAX) = 'CREATE TABLE [dbo].[Tenz_Cell_STS_Hourly_Temp](';" 
sqlCmd = sqlCmd & "SELECT @sqlCmd+='['+Headers+'] FLOAT,' FROM [dbo].[Tenz_colReg];" 
sqlCmd = sqlCmd & "SET @sqlCmd=LEFT(@sqlCmd,LEN(@sqlCmd)-1)+')';" 
sqlCmd = sqlCmd & "EXEC(@sqlCmd);" 
adoCon.Execute (sqlCmd) 
sqlCmd = "ALTER TABLE [dbo].[Tenz_Cell_STS_Hourly_Temp] ALTER COLUMN [Date] VARCHAR(23);" 
sqlCmd = sqlCmd & "ALTER TABLE [dbo].[Tenz_Cell_STS_Hourly_Temp] ALTER COLUMN [Time] VARCHAR(10);" 
sqlCmd = sqlCmd & "ALTER TABLE [dbo].[Tenz_Cell_STS_Hourly_Temp] ALTER COLUMN [NE Name] VARCHAR(15);" 
sqlCmd = sqlCmd & "ALTER TABLE [dbo].[Tenz_Cell_STS_Hourly_Temp] ALTER COLUMN [Cell Name] VARCHAR(64);" 
sqlCmd = sqlCmd & "ALTER TABLE [dbo].[Tenz_Cell_STS_Hourly_Temp] ALTER COLUMN [CI] VARCHAR(64);" 
sqlCmd = sqlCmd & "ALTER TABLE [dbo].[Tenz_Cell_STS_Hourly_Temp] ALTER COLUMN [LAC] VARCHAR(10);" 
adoCon.Execute (sqlCmd) 
proccess.Caption = "Appending statistics to 'Tenz_STS_Cell_Hourly' table from CS1 !" 
proBar2.Width = 5 * proBar1.Width/100 
sqlCmd = "DECLARE @sqlCmd NVARCHAR(MAX) = 'INSERT INTO [dbo].[Tenz_Cell_STS_Hourly_Temp] '; " 
sqlCmd = sqlCmd & "DECLARE @sc NVARCHAR(MAX) = '';" 
sqlCmd = sqlCmd & "SELECT @sc+='['+Name+']=[dbo].[Tenz_CS1].['+Name+'],' FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE type = 'U' AND [Name] = 'Tenz_CS1') AND ([Name]='Date' OR [Name]='Time' OR [Name]='Cell Name' OR [Name]='NE Name' OR [Name]='CI' OR [Name]='LAC');" 
sqlCmd = sqlCmd & "SELECT @sc+='['+Name+']=CASE WHEN TRY_CONVERT(FLOAT,[dbo].[Tenz_CS1].['+Name+']) IS NULL THEN ''0'' ELSE [dbo].[Tenz_CS1].['+Name+'] END,' FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE type = 'U' AND [Name] = 'Tenz_CS1') AND [Name]<>'Date' AND [Name]<>'Time' AND [Name]<>'Cell Name' AND [Name]<>'NE Name' AND [Name]<>'CI' AND [Name]<>'LAC';" 
sqlCmd = sqlCmd & "SET @sc=LEFT(@sc,LEN(@sc)-1);" 
sqlCmd = sqlCmd & "DECLARE @dc NVARCHAR(MAX) = ''; " 
sqlCmd = sqlCmd & "SELECT @dc+='['+Name+'],' FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE type = 'U' AND [Name] = 'Tenz_CS1') AND ([Name]='Date' OR [Name]='Time' OR [Name]='Cell Name' OR [Name]='NE Name' OR [Name]='CI' OR [Name]='LAC');" 
sqlCmd = sqlCmd & "SELECT @dc+='['+Name+'],' FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE type = 'U' AND [Name] = 'Tenz_CS1') AND [Name]<>'Date' AND [Name]<>'Time' AND [Name]<>'Cell Name' AND [Name]<>'NE Name' AND [Name]<>'CI' AND [Name]<>'LAC';" 
sqlCmd = sqlCmd & "SET @dc=LEFT(@dc,LEN(@dc)-1);" 
sqlCmd = sqlCmd & "SET @sqlCmd+='('[email protected]+') SELECT '[email protected]+' FROM [dbo].[Tenz_CS1]';" 
sqlCmd = sqlCmd & "EXEC sp_executesql @sqlCmd;" 
adoCon.Execute (sqlCmd) 
proccess.Caption = "Appending statistics to 'Tenz_STS_Cell_Hourly' from CS2 !" 
proBar2.Width = 35 * proBar1.Width/100 
sqlCmd = "DECLARE @sqlCmd NVARCHAR(MAX) = 'MERGE INTO [dbo].[Tenz_Cell_STS_Hourly_Temp] USING [dbo].[Tenz_CS2] ON [dbo].[Tenz_Cell_STS_Hourly_Temp].Date = [dbo].[Tenz_CS2].Date AND [dbo].[Tenz_Cell_STS_Hourly_Temp].Time = [dbo].[Tenz_CS2].Time AND [dbo].[Tenz_Cell_STS_Hourly_Temp].[Cell Name] = [dbo].[Tenz_CS2].[Cell Name] WHEN MATCHED THEN UPDATE SET ';" 
sqlCmd = sqlCmd & "DECLARE @sc NVARCHAR(MAX) = '';" 
sqlCmd = sqlCmd & "SELECT @sc+='['+Name+']=CASE WHEN TRY_CONVERT(FLOAT,[dbo].[Tenz_CS2].['+Name+']) IS NULL THEN ''0'' ELSE [dbo].[Tenz_CS2].['+Name+'] END,' FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE type = 'U' AND [Name] = 'Tenz_CS2') AND [Name]<>'Date' AND [Name]<>'Time' AND [Name]<>'Cell Name' AND [Name]<>'NE Name' AND [Name]<>'CI' AND [Name]<>'LAC';" 
sqlCmd = sqlCmd & "SET @sc=LEFT(@sc,LEN(@sc)-1)+';';" 
sqlCmd = sqlCmd & "SET @[email protected];" 
sqlCmd = sqlCmd & "EXEC sp_executesql @sqlCmd;" 
adoCon.Execute (sqlCmd) 
proccess.Caption = "Appending statistics to 'Tenz_STS_Cell_Hourly' from PS1 !" 
proBar2.Width = 50 * proBar1.Width/100 
sqlCmd = "DECLARE @sqlCmd NVARCHAR(MAX) = 'MERGE INTO [dbo].[Tenz_Cell_STS_Hourly_Temp] USING [dbo].[Tenz_PS1] ON [dbo].[Tenz_Cell_STS_Hourly_Temp].Date = [dbo].[Tenz_PS1].Date AND [dbo].[Tenz_Cell_STS_Hourly_Temp].Time = [dbo].[Tenz_PS1].Time AND [dbo].[Tenz_Cell_STS_Hourly_Temp].[Cell Name] = [dbo].[Tenz_PS1].[Cell Name] WHEN MATCHED THEN UPDATE SET ';" 
sqlCmd = sqlCmd & "DECLARE @sc NVARCHAR(MAX) = '';" 
sqlCmd = sqlCmd & "SELECT @sc+='['+Name+']=CASE WHEN TRY_CONVERT(FLOAT,[dbo].[Tenz_PS1].['+Name+']) IS NULL THEN ''0'' ELSE [dbo].[Tenz_PS1].['+Name+'] END,' FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE type = 'U' AND [Name] = 'Tenz_PS1') AND [Name]<>'Date' AND [Name]<>'Time' AND [Name]<>'Cell Name' AND [Name]<>'NE Name' AND [Name]<>'CI' AND [Name]<>'LAC';" 
sqlCmd = sqlCmd & "SET @sc=LEFT(@sc,LEN(@sc)-1)+';';" 
sqlCmd = sqlCmd & "SET @[email protected];" 
sqlCmd = sqlCmd & "EXEC sp_executesql @sqlCmd;" 
adoCon.Execute (sqlCmd) 
proccess.Caption = "Appending statistics to 'Tenz_STS_Cell_Hourly' from PS2 !" 
proBar2.Width = 65 * proBar1.Width/100 
sqlCmd = "DECLARE @sqlCmd NVARCHAR(MAX) = 'MERGE INTO [dbo].[Tenz_Cell_STS_Hourly_Temp] USING [dbo].[Tenz_PS2] ON [dbo].[Tenz_Cell_STS_Hourly_Temp].Date = [dbo].[Tenz_PS2].Date AND [dbo].[Tenz_Cell_STS_Hourly_Temp].Time = [dbo].[Tenz_PS2].Time AND [dbo].[Tenz_Cell_STS_Hourly_Temp].[Cell Name] = [dbo].[Tenz_PS2].[Cell Name] WHEN MATCHED THEN UPDATE SET ';" 
sqlCmd = sqlCmd & "DECLARE @sc NVARCHAR(MAX) = '';" 
sqlCmd = sqlCmd & "SELECT @sc+='['+Name+']=CASE WHEN TRY_CONVERT(FLOAT,[dbo].[Tenz_PS2].['+Name+']) IS NULL THEN ''0'' ELSE [dbo].[Tenz_PS2].['+Name+'] END,' FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE type = 'U' AND [Name] = 'Tenz_PS2') AND [Name]<>'Date' AND [Name]<>'Time' AND [Name]<>'Cell Name' AND [Name]<>'NE Name' AND [Name]<>'CI' AND [Name]<>'LAC';" 
sqlCmd = sqlCmd & "SET @sc=LEFT(@sc,LEN(@sc)-1)+';';" 
sqlCmd = sqlCmd & "SET @[email protected];" 
sqlCmd = sqlCmd & "EXEC sp_executesql @sqlCmd;" 
adoCon.Execute (sqlCmd) 
proccess.Caption = "Finishing !" 
proBar2.Width = 80 * proBar1.Width/100 
sqlCmd = "DECLARE @sqlCmd NVARCHAR(MAX) = 'INSERT INTO [dbo].[Tenz_Cell_STS_Hourly] '" 
sqlCmd = sqlCmd & "DECLARE @sc NVARCHAR(MAX) = ''; " 
sqlCmd = sqlCmd & "SELECT @sc+='['+Name+'],' FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE type = 'U' AND [Name] = 'Tenz_Cell_STS_Hourly');" 
sqlCmd = sqlCmd & "SET @sc=LEFT(@sc,LEN(@sc)-1);" 
sqlCmd = sqlCmd & "SET @sqlCmd+='('[email protected]+') SELECT '[email protected]+'FROM [dbo].[Tenz_Cell_STS_Hourly_Temp]';" 
sqlCmd = sqlCmd & "EXEC sp_executesql @sqlCmd;" 
adoCon.Execute (sqlCmd) 
proBar2.Width = 100 * proBar1.Width/100 
MsgBox ("Statistics appended to 'Tenz_STS_Cell_Hourly' successfully !") 
proBar2.Width = 0 
proccess.Caption = "Idle ! " 
sqlCmd = "IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Tenz_Cell_STS_Hourly_Temp') DROP TABLE Tenz_Cell_STS_Hourly_Temp;" 
adoCon.Execute (sqlCmd) 
Call adodb_Close 

末次

+0

你能只输出生成的SQLCMD文本,因此更容易查看SQL生成的? –

+0

[在SQL Server 2012中查看高内存使用情况]可能的重复(http://stackoverflow.com/questions/18132330/seeing-high-memory-usage-in-sql-server-2012) – TomTom

+0

只需要清楚,是你在谈论客户端或SQL Server主机上的内存使用情况? – DMason

回答

1

我有同样的问题。 SQL服务器将始终使用尽可能多的内存,因为它允许它。你必须设定一个限制。

SSMS not releasing system memory https://dba.stackexchange.com/questions/47431/why-is-sql-server-consuming-more-server-memory

右键单击SSMS并选择属性在服务器上。在内存选项卡中设置最大服务器内存选项以限制SQL内存使用情况。

enter image description here

+0

我解决了这个问题,正如你所说的通过限制SQL SERVER的内存使用量,另一方面它仍然没有释放它对SQL SERVER限制的内存,即使你终止了, 什么是我的电脑没有遇到性能低下的问题瓶颈),谢谢分配。 –