我有一个连接到我的sql数据库的asp.net gridview。当插入新记录或更新记录时,我正在做一些服务器端检查,然后更新/插入记录或什么都不做。现在我有两个方法CheckArtistExists和CheckSongExists都使用SqlConnection对象,例如。
public bool CheckSongExists(string _title, int _artistId)
{
int cnt = -1;
using (SqlConnection con = new SqlConnection(CS))
{
//check if song already is exists in DB
SqlCommand cmd = new SqlCommand("Select Count(ID) from tblSong WHERE Title = @newTitle AND ArtistId = @newArtistId;", con);
cmd.Parameters.AddWithValue(@"newTitle", _title);
cmd.Parameters.AddWithValue(@"newArtistId", _artistId);
con.Open();
cnt = (int)cmd.ExecuteScalar();
// if cnt ==1 song exists in DB, of cnt == 0 song doesnt exist
if(cnt == 1)
{ return true; }
else
{ return false; }
}
}
因此对于gridview中的Update函数,我需要建立3个SqlConnections(最多)一个来检查艺术家(如果艺术家不存在我必须首先向tblArtist插入记录) 然后检查歌曲是否存在(仅当艺术家存在时),最后如果歌曲不存在,我必须插入新的记录。
我知道数据库连接是宝贵的资源,这就是为什么我把它们放在一个使用块中。所以我不太确定它的好样式是否使用3个SqlConnection对象来更新/插入。如果我的代码没问题,或者我应该使用其他方法来解决这个问题,请你告诉我。
谢谢
答案 0 :(得分:1)
ADO.NET在ADO-NET Connection-Pool:
内部管理DBMS的基础连接实际上,大多数应用程序只使用一种或几种不同的应用程序 连接配置。这意味着在申请期间 执行时,将重复打开许多相同的连接 关闭。为了最大限度地降低打开连接的成本,ADO.NET使用了 优化技术称为连接池。
连接池减少了新连接的次数 必须打开。平民保持对物质的所有权 连接。它通过保持一组活动来管理连接 每个给定连接配置的连接。每当一个用户 调用在连接上打开,pooler查找可用的 池中的连接。如果池连接可用,则为 将其返回给调用者而不是打开新连接。当。。。的时候 应用程序调用关闭连接,pooler将其返回 合并的一组活动连接而不是关闭它。一旦 连接返回到池中,它已准备好在池上重用 下一次公开电话。
所以显然没有理由避免创建,打开或关闭连接,因为实际上它们根本没有创建,打开和关闭。这是“仅”连接池的标志,以便知道何时可以重用连接。但它是一个非常重要的标志,因为如果连接“正在使用”(连接池假设),则必须向DBMS开放一个新的物理连接,这非常昂贵。
如果你“重用”连接,那么你的性能没有提升,但相反。
using-statement
隐含地处理和关闭(如果是连接)所以是的,每个方法使用一个连接是绝对正常的,因为如果启用了连接池,则根本不使用物理连接(默认)。
另一个问题是你是否可以改进你的方法。您可以创建一个存储过程来检查存在并相应地更新或插入。