多个SQL命令。好作风?

时间:2014-04-02 17:32:02

标签: asp.net sql sql-server

我的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查询来插入记录。

谢谢你!

3 个答案:

答案 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);