[英]Opening and closing SQLConnections in C#
有人可以告诉我如何在C#中正确使用SQL连接吗?
现在,我正在这样做:
//some Code here
using (var sqlConnection = DatabaseUtil.DatabaseUtil.CreateSqlConnection(connectionString))
{
var cmd = new SqlCommand();
DatabaseUtil.DatabaseUtil.InitializeSqlCommand(ref cmd, query, sqlConnection);
sqlConnection.Open();
using (var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
reader.Read();
if (reader.HasRows)
{
//some code here
}
reader.Close();
reader.Dispose();
}
sqlConnection.Close();
}
DatabaseUtil
用VB.NET编写。 这里的函数CreateSqlConnection
:
Public Function CreateSqlConnection(connectionString As String) As SqlConnection
Dim result As SqlConnection
result = New SqlConnection(connectionString)
Return result
End Function
在这里,您可以看到函数InitializeSqlCommand
:
Public Sub InitializeSqlCommand(ByRef cmd As SqlCommand, query As String, sqlConnection As SqlConnection)
cmd.CommandText = query
cmd.CommandType = CommandType.Text
cmd.Connection = sqlConnection
End Sub
我做对了吗? 还是您对我有一些改善的建议?
我会很感激的每个提示。
阿里
我怀疑您是否要在这里使用DatabaseUtil
; 使用new
意愿进行显式创建会:
// If you don't want to hardcode connection's type - SqlConnection -
// (possible purpose of DatabaseUtil class) use dependency injection
using (var sqlConnection = new SqlConnection(connectionString)) {
sqlConnection.Open();
// sqlConnection.CreateCommand() - we can avoid dependency
// and don't hardcode SqlCommand as "new SqlCommand"
//DONE: wrap IDisposable into using, do not close it explicitly
using (var cmd = sqlConnection.CreateCommand()) {
cmd.CommandText = query;
//TODO: you may want to provide Parameters here
//DONE: wrap IDisposable into using, do not close it explicitly
using (var reader = cmd.ExecuteReader()) {
// reader.Read() returns true if record is read
// (i.e. we have at least one record)
if (reader.Read()) {
// We have at least one row
// some code here
}
}
}
}
如果您要读取多条记录,而不仅仅是查询返回至少一条记录的事实, if (reader.Read())
转换为while
:
...
//DONE: wrap IDisposable into using, do not close it explicitly
using (var reader = cmd.ExecuteReader()) {
// reader.Read() returns true if record is read
while (reader.Read()) {
// record has been read
// some code here
}
}
...
首先,我要说的是原始文章本身没有什么错误 ,您可以继续使用该代码。
但是...我们仍然可以做得更好。
不需要InitializeSqlCommand()
的SqlCommand
参数通过ref传递。 IMO这是VB代码中的错误。 ByVal
在这里足够好,并且ByRef
将您的命令对象暴露给您可能不需要的东西。
在CreateSqlConnection()
函数中,我倾向于假设如果您正在创建连接,那么您也想尽快打开它。 另外,我们可以将方法缩短一些。
我也倾向于将连接字符串直接放入等效的DatabaseUtil模块中,或者构建模块,以便它可以从配置文件中加载字符串。 我不想每次都将该数据传递到CreateSqlConnection()
方法中。 像这样将这两段放在一起:
Private ReadOnly Property ConnectionString As String
Get
Return "connection string here"
End Get
End Property
Public Function CreateSqlConnection() As SqlConnection
Dim result As New SqlConnection(ConnectionString)
result.Open()
Return result
End Function
这是一件小事,但是SqlCommand
也实现IDisposble
,因此理想情况下它也将在using
块中。 确实,现有的InitializeSqlCommand()
方法中没有什么是您无法直接使用SqlCommand
构造函数完成的,因为CommandType.Text
已经是默认设置。 继续并导入DatabaseUtil
命名空间,您可以像这样将这两段放在一起:
using (var sqlConnection = DatabaseUtil.CreateSqlConnection())
using (var cmd = new SqlCommand(query, sqlConnection))
{
我还担心InitializeSqlCommand()
命令函数接受query
字符串,但不提供查询参数。 是的,您仍然可以稍后在代码中添加参数,但是根据我的经验,这倾向于鼓励对参数数据使用字符串连接...或更准确地说,无法充分阻止它,这等同于同一件事。 您要确保在应用程序中没有SQL Injection漏洞。 如果您继续使用InitializeSqlCommand()
,则将其结构如下:
Public Function InitializeSqlCommand(cn As SqlConnection, query As String, ParamArray paramters() As SqlParamter) As SqlCommand
Dim result As SqlCommand = cn.CreateCommand()
result.CommandText = query
If parameters IsNot Nothing AndAlso parameter.Length > 0 Then
result.Parameters.AddRange(parameters)
End If
Return result
End Sub
如果连接是在using
块中创建的,则不必调用sqlConnection.Close()
。 同样适用于DataReader。
最后,DataReader的典型模式是不检查HasRows
属性。 通常只检查一次Read()
方法的结果就足够了,并且通常在while
循环中。
将所有内容放在一起,包括修订的VB功能,如下所示:
var parameters = new SqlParameter[] { }; //define parameters here
using (var sqlConnection = DatabaseUtil.CreateSqlConnection())
using (var cmd = DatabaseUtil.InitializeSqlCommand(sqlConnection, query, parameters))
using (var reader = cmd.ExecuteReader())
{
while(reader.Read())
{
//some code here
}
}
您不需要DatabaseUtil
。 就是这样:
using (var sqlConnection =new SqlConnection(connectionString)){
var cmd = new SqlCommand(query, sqlConnection);
sqlConnection.Open();
var reader = cmd.ExecuteReader();
while(reader.Read())
{
//do whatever you want
};
}
你并不需要关闭连接,当您使用using
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.