问题 从DB类获取SQL连接对象以避免重复代码

fishron.

新成员
加入
2014年5月30日
消息
2
地点
犹他州
编程经验
1-3
我正在尝试通过将其放入DBManager类中总是相同的代码。问题是我不确定是否使用SQL Connection对象执行此操作正常工作。
这是我得到连接的代码:
C#:
[COLOR=blue]public[/COLOR] [COLOR=blue]bool[/COLOR] CheckIfChildRecordsExist([COLOR=blue]string[/COLOR] tableName, [COLOR=blue]string[/COLOR] idNameValue, [COLOR=blue]string[/COLOR] idName)
		{
			[COLOR=blue]bool[/COLOR] exists [COLOR=#800040]=[/COLOR] [COLOR=blue]true[/COLOR]; [COLOR=green]// default to true so we don't inadvertantly try to delete child records...[/COLOR]
			[COLOR=#2b91af]StringBuilder[/COLOR] query [COLOR=#800040]=[/COLOR] [COLOR=blue]new[/COLOR] [COLOR=#2b91af]StringBuilder[/COLOR]();
			[COLOR=blue]string[/COLOR] paramName [COLOR=#800040]=[/COLOR] [COLOR=#a31515]"@"[/COLOR] [COLOR=#800040]+[/COLOR] idName;
			[COLOR=blue]int[/COLOR] recordCount [COLOR=#800040]=[/COLOR] [COLOR=#5f5f5f]0[/COLOR];
 
			query[COLOR=#800040].[/COLOR]Append([COLOR=#a31515]"SELECT COUNT(*) FROM "[/COLOR]);
			query[COLOR=#800040].[/COLOR]Append(tableName);
			query[COLOR=#800040].[/COLOR]Append([COLOR=#a31515]" WHERE "[/COLOR]);
			query[COLOR=#800040].[/COLOR]Append(idName);
			query[COLOR=#800040].[/COLOR]Append([COLOR=#a31515]" = "[/COLOR]);
			query[COLOR=#800040].[/COLOR]Append(paramName);
 
			[COLOR=blue]using[/COLOR] ([COLOR=#2b91af]SqlCommand[/COLOR] cmd [COLOR=#800040]=[/COLOR] [COLOR=blue]new[/COLOR] [COLOR=#2b91af]DBManager[/COLOR]()[COLOR=#800040].[/COLOR]GetDbSqlQueryCommand(query[COLOR=#800040].[/COLOR]ToString()))
			{
				cmd[COLOR=#800040].[/COLOR]Parameters[COLOR=#800040].[/COLOR]AddWithValue(paramName, idNameValue);
				cmd[COLOR=#800040].[/COLOR]Connection[COLOR=#800040].[/COLOR]Open();
				recordCount [COLOR=#800040]=[/COLOR] ([COLOR=blue]int[/COLOR])cmd[COLOR=#800040].[/COLOR]ExecuteScalar();
				cmd[COLOR=#800040].[/COLOR]Connection[COLOR=#800040].[/COLOR]Close();
			}
 
			[COLOR=blue]if[/COLOR] (recordCount [COLOR=#800040]>[/COLOR] [COLOR=#5f5f5f]0[/COLOR])
			{
				exists [COLOR=#800040]=[/COLOR] [COLOR=blue]true[/COLOR];
			}
			[COLOR=blue]else[/COLOR]
			{
				exists [COLOR=#800040]=[/COLOR] [COLOR=blue]false[/COLOR];
			}
 
			[COLOR=blue]return[/COLOR] exists; 
		}

这是DBManager类中的代码,它返回要在上一个代码中使用的SQL命令对象:

C#:
[COLOR=blue]public[/COLOR] [COLOR=#2b91af]SqlCommand[/COLOR] GetDbSqlQueryCommand([COLOR=blue]string[/COLOR] query)
		{
			[COLOR=#2b91af]SqlCommand[/COLOR] cmd [COLOR=#800040]=[/COLOR] [COLOR=blue]new[/COLOR] [COLOR=#2b91af]SqlCommand[/COLOR](query, [COLOR=blue]new[/COLOR] [COLOR=#2b91af]SqlConnection[/COLOR](ConnectionString));
			cmd[COLOR=#800040].[/COLOR]CommandType [COLOR=#800040]=[/COLOR] System[COLOR=#800040].[/COLOR]Data[COLOR=#800040].[/COLOR][COLOR=#2b91af]CommandType[/COLOR][COLOR=#800040].[/COLOR]Text;
			[COLOR=blue]return[/COLOR] cmd;
		}

它似乎工作好,但我想我可能会出现问题。我不确定SQLConnection是否实际关闭或者我将其留出在那里。有很多方法可以访问数据,我只是在尝试将一些数据访问代码整合到包装器类型类中。

以这种方式达到命令的连接留下了一个连接。如果我同时工作了很多记录,我可以获得SQL异常(超时或连接池问题)。

如果这实际上关闭了连接,任何人都可以告诉我吗?

谢谢,

罗恩
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,732
地点
悉尼,澳大利亚
编程经验
10+
您正在为每个SQLCommand对象创建一个新的SQLConnection对象。这不一定是一个问题。 SQLConnection对象实际上是相对轻量级的,具有实际数据库连接,现有较低级别。 ADO.NET使用连接池,因此,如果使用相同的连接字符串创建两个或更多个SQLConnection对象,它们实际上将在引擎盖下使用相同的数据库连接。如果您特别希望两个命令使用相同的SQLConnection对象,则这只是一个问题,例如,如果使用相同的SQLConnection对象。您希望在交易中征收它们。考虑到这一点,您可能会过载getDBSQlQueryCommand并添加传递在现有连接对象中的功能。

你也在结束连接,这很好。如果该代码未关闭连接,则它也不会打开它。如果您看到连接池问题,那么您可能会在垃圾收集器有机会清理您创建的所有连接对象之前,您可能会为该连接字符串耗尽。一个选项可以为DBManager类的每个实例创建单个连接对象,然后每次创建命令时都在内部使用相同的连接。这样,在创建新的DBManager时,您只需创建一个新连接。这意味着每次创建一个命令时都不会创建一个新的dbManager,或者您不会获得任何内容。
 

fishron.

新成员
加入
2014年5月30日
消息
2
地点
犹他州
编程经验
1-3
感谢您的回复。我试图通过搜索找到答案,但无法获得它。我不知道具有相同连接字符串的2个连接对象将共享连接。如果连接对象与此代码正确关闭,我也不确定,但我认为是。
为DB管理员类提供1个连接对象的想法是一个很好的想法。我会看看重构来做出这项工作。

我非常感谢您的快速回复。
罗恩
 
最佳 底部