C# 循环内的SQLC连接
第一次使用stackoverflow。 我正在学习如何在我的WebForm页面中管理SqlConnection,我希望获得最佳实践。 在我的具体例子中,我有一个循环,如果我没有为循环的每次迭代设置一个新的SqlConnection,那么我就无法在没有错误的情况下运行代码。错误是在读卡器关闭时尝试读取。 所以我在PageLoad方法中声明:C# 循环内的SQLC连接,c#,loops,sqlconnection,C#,Loops,Sqlconnection,第一次使用stackoverflow。 我正在学习如何在我的WebForm页面中管理SqlConnection,我希望获得最佳实践。 在我的具体例子中,我有一个循环,如果我没有为循环的每次迭代设置一个新的SqlConnection,那么我就无法在没有错误的情况下运行代码。错误是在读卡器关闭时尝试读取。 所以我在PageLoad方法中声明: private SqlConnection con; protected void Page_Load(object sender, EventArgs e)
private SqlConnection con;
protected void Page_Load(object sender, EventArgs e)
{
con = new SqlConnection(connectionString);
}
那么我有这个,
private int conta(int padre)
{
string SQL = "SELECT * FROM categories WHERE idp=@idpadre";
SqlCommand cd = new SqlCommand(SQL, con);
cd.Parameters.AddWithValue("@idpadre", padre);
int sub=0;
try
{
if ((con.State & ConnectionState.Open) <= 0)
{
con.Open();
}
using (SqlDataReader reader = cd.ExecuteReader())
{
while (reader.Read())
{
sub++;
}
}
}
catch (Exception err)
{
lbl.Text = "Errore conta!";
lbl.Text += err.Message;
}
finally
{
con.Close();
}
return sub;
}
protected void buildParent(int padre, int level)
{
StringBuilder sb = new StringBuilder();
sb.Append(" ");
for (int i = 0; i < level; i++)
{
sb.Append(HttpUtility.HtmlDecode(" "));
}
sb.Append("|--");
selectSQL = "SELECT * FROM categories WHERE idp=@idpadre";
SqlConnection cn = new SqlConnection(connectionString);
cmd = new SqlCommand(selectSQL, cn);
cmd.Parameters.AddWithValue("@idpadre", padre);
try
{
cn.Open();
using (SqlDataReader read = cmd.ExecuteReader())
{
while (read.Read())
{
dlParent.Items.Add(new ListItem { Text = sb.ToString() + read["cat"].ToString(), Value = read["idcat"].ToString() });
int sub = conta(Convert.ToInt32(read["idcat"]));
//int sub = 0;
if (sub > 0)
{
buildParent(Convert.ToInt32(read["idcat"]), level + 1);
}
}
read.Close();
}
}
catch (Exception err)
{
lbl.Text = "Errore buildParent!";
lbl.Text += err.Message;
}
finally
{
cn.Close();
if (s != null)
{
if (!this.IsPostBack)
{
buildPage();
buildLang();
buildImage();
}
}
}
}
在while循环中的buildParent中,我调用conta,但是如果我对这两个方法使用相同的SqlConnection con,我会在读卡器关闭时尝试读取时出错。
我担心web服务器上的连接池,尤其是最大连接范围。
那么,我错在哪里?管理SqlConnection的最佳实践是什么?
谢谢。请尽可能晚地打开连接,并尽快处理。让客户处理回收连接的问题 我通常这样编写代码:
using (var conn = new SqlConnection(connectionString))
using (var cmd = new SqlCommand(commandToRun, conn))
{
cmd.Parameters.AddRange(new[]
{
new SqlParameter("myParam", "myvalue"),
new SqlParameter("myParam", "myvalue")
});
conn.Open(); // opened as late as possible
using (SqlDataReader reader = cd.ExecuteReader())
{
while (reader.Read())
{
// do stuff.
}
}
} // disposed here.
注意:要从SQL数据库中获取计数,最好使用
SELECT count(*) FROM categories WHERE idp=@idpadre
并使用ExecuteScalar执行查询,您可以尽可能晚地打开连接,并尽快进行处理。让客户处理回收连接的问题 我通常这样编写代码:
using (var conn = new SqlConnection(connectionString))
using (var cmd = new SqlCommand(commandToRun, conn))
{
cmd.Parameters.AddRange(new[]
{
new SqlParameter("myParam", "myvalue"),
new SqlParameter("myParam", "myvalue")
});
conn.Open(); // opened as late as possible
using (SqlDataReader reader = cd.ExecuteReader())
{
while (reader.Read())
{
// do stuff.
}
}
} // disposed here.
注意:要从SQL数据库中获取计数,最好使用
SELECT count(*) FROM categories WHERE idp=@idpadre
并使用ExecuteScalar执行查询。完成后,请确保释放连接。现在看起来不是这样。是的,在finally块中。但是在循环中创建不同的sqlconnection对象是正确的吗?当我关闭连接时,我也必须处理它?@FabioGarzoli是的,看看我添加到帖子中的链接。即使您已处理了连接,幕后的.NET仍将保持连接打开,并且如果超时未过期,将重新使用连接而不是创建新连接。此外,如果处置连接,则不需要关闭它,因为这将作为处置的一部分关闭连接process@ScottChamberlain谢谢你的链接,我会研究的。以一种简单的方式,我需要改变con.Close;在con.处置中;我很好,并且确信没有达到连接池的最大大小,对吗?另一个问题:是否有方法在Visual Studio I使用Visual Web Developer时检查打开了多少个连接?此外,完成后,请确保释放连接。现在看起来不是这样。是的,在finally块中。但是在循环中创建不同的sqlconnection对象是正确的吗?当我关闭连接时,我也必须处理它?@FabioGarzoli是的,看看我添加到帖子中的链接。即使您已处理了连接,幕后的.NET仍将保持连接打开,并且如果超时未过期,将重新使用连接而不是创建新连接。此外,如果处置连接,则不需要关闭它,因为这将作为处置的一部分关闭连接process@ScottChamberlain谢谢你的链接,我会研究的。以一种简单的方式,我需要改变con.Close;在con.处置中;我很好,并且确信没有达到连接池的最大大小,对吗?另一个问题:有没有办法在VisualStudio中检查我正在使用的Visual Web Developer打开了多少个连接?