SQL在表中创建新记录,记录id并在第二个过程中使用

时间:2013-05-01 13:11:20

标签: c# sql-server design-patterns stored-procedures sql-server-2008

我有一个棘手的问题但我会尽我所能。

我有两个班级:

  • 博文
  • BlogTag

BlogPost有一个公共属性HashSet<BlogTag> Tags,一组博客标记,非常简单。我想要实现的是向我的表dbo.BlogPost添加一个新的BlogPost,然后遍历标签的HashSet并更新一个单独的表dbo.BlogTags,例如集合中的每个标签和它所属的帖子的ID。

我会这样做: -

public static void AddPost(BlogPost post)
{
     try
     {
         Database db = DatabaseFactory.CreateDatabase(Constants.Application.DatabaseName);
         DbCommand cmd = db.GetStoredProcCommand("stp_BlogPost_Add");

         db.AddInParameter(cmd, "post_title", DbType.String, post.Title);
         db.AddInParameter(cmd, "author", DbType.String, post.Author);
         db.AddInParameter(cmd, "date_created", DbType.DateTime, DateTime.Now);
         db.AddInParameter(cmd, "post_content", DbType.String, post.Content);

         //Snip...

         //Insert tags
         foreach(BlogTag tag in post.Tags)
         {
             AddNewTags(post.ID, tag.TagText);
         }

         db.ExecuteNonQuery(cmd);
     }
     catch (Exception ex)
     {
         Logging.LogError(ex);
         throw;
     }
 }

然而,我似乎无法解决的问题是:

foreach(BlogTag tag in post.Tags)
{
    AddNewTags(post.ID, tag.TagText);
}

上述内容仅在我们具有post.ID值时才有效,但是,由于这是在AddPost方法中运行的,因此此时ID仍然是默认值0(记录的id是表中的PK,并设置为自动递增。

有没有办法直接将HashSet<BlogTags>作为参数传递给存储过程(值得一提的是我是一个完整的SQL新手),然后一旦stp_BlogPost_Add过程运行,获取新创建的帖子的ID并将值插入BlogTags表?

或者,除了上述内容之外,是否有一种实现我想做的优选方法?我曾经考虑过将标签简单地存储在BlogPost表中的逗号分隔字符串中,然后在需要时按,分割,但这看起来并不干净。

任何建议都将不胜感激

1 个答案:

答案 0 :(得分:1)

您无法将对象传递给存储过程,因为您的SQL引擎不知道那是什么。您可以将XML字符串传递给它并对其进行操作。如果将对象设置为可序列化,则可以将其序列化为xml字符串并将其传入。它基本上是对象的XML表示形式。

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx