我的asp.net应用程序运行得非常好。在我的代码中,我有以下几行
using (SqlConnection con = new SqlConnection(CS))
{
SqlCommand getGenreId = new SqlCommand("Select ID from tblGenre WHERE Genre=@newGenre;", con);
getGenreId.Parameters.AddWithValue(@"newGenre", newGenre);
SqlCommand cmd = new SqlCommand("UPDATE tblSong SET Title=@newTitle, ArtistId=@newArtistId, GenreId=@newGenreId WHERE (ID = @songId);", con);
cmd.Parameters.AddWithValue(@"newTitle", newTitle);
cmd.Parameters.AddWithValue(@"newArtistId", newArtistId);
cmd.Parameters.AddWithValue(@"songId", songId);
con.Open();
newGenreId = (int)getGenreId.ExecuteScalar();
cmd.Parameters.AddWithValue(@"newGenreId", newGenreId);
cmd.ExecuteNonQuery();
}
我知道数据库连接是宝贵的资源,我在使用它们时应该小心。 (尽可能晚开放,并确保它们将被关闭)
我现在的问题是这段代码被认为是错误的样式,因为我打开连接然后有sql查询来获取ID然后有另一个SQL查询来插入记录。
谢谢你!
答案 0 :(得分:3)
如果转换为使用存储过程,则可以消除1次往返,从而减少网络流量并可能提高性能。
using (SqlCommand cmd = new SqlCommand("Update_tblSong", con);
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@newGenre", newGenre);
cmd.Parameters.AddWithValue("@newTitle", newTitle);
cmd.Parameters.AddWithValue("@newArtistId", newArtistId);
cmd.Parameters.AddWithValue("@songId", songId);
cmd.ExecuteNonQuery();
}
Proc会是这样的,我估计你的可变大小。
CREATE PROC Update_tblSong
(
@newGenre VARCHAR(25)
,@newTitle VARCHAR(50)
,@newArtistID INT
,@songID INT
)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @NewGenreID INT;
SELECT @NewGenreID = ID
FROM tblGenre
WHERE Genre = @newGenre;
UPDATE tblSong
SET Title = @newTitle
,ArtistId = @newArtistId
,GenreId = @NewGenreID
WHERE ( ID = @songId )
END;
答案 1 :(得分:2)
总体而言,您的代码流似乎很好,您使用单个连接来执行多个(相关)命令。
您可以通过在using
statement中包含命令对象来进一步改进它。因为它们实现了IDisposable
接口,就像你的连接对象一样。
using (SqlConnection con = new SqlConnection(CS))
{
con.Open();
using (SqlCommand getGenreId = new SqlCommand("Select ID from tblGenre WHERE Genre=@newGenre;", con))
{
getGenreId.Parameters.AddWithValue(@"newGenre", newGenre);
newGenreId = (int)getGenreId.ExecuteScalar();
}
using (SqlCommand cmd = new SqlCommand("UPDATE tblSong SET Title=@newTitle, ArtistId=@newArtistId, GenreId=@newGenreId WHERE (ID = @songId);", con))
{
cmd.Parameters.AddWithValue(@"newTitle", newTitle);
cmd.Parameters.AddWithValue(@"newArtistId", newArtistId);
cmd.Parameters.AddWithValue(@"songId", songId);
cmd.Parameters.AddWithValue(@"newGenreId", newGenreId);
cmd.ExecuteNonQuery();
}
}
答案 2 :(得分:0)
为什么不为SQL使用带有子查询的单个查询?
UPDATE tblSong SET Title = @newTitle, ArtistId = @newArtistId, GenreId = (Select top 1 ID from tblGenre WHERE Genre=@newGenre ORDER BY Genre) WHERE (ID = @songId);