我需要有关sql和数据关系表的帮助

时间:2011-05-13 11:29:34

标签: asp.net sql visual-studio-2010

我建立了一个迷你论坛网站..我构建了几张桌子。

1)用户 2)线程 3)评论 4)主题

我构建了一个函数,每次用户提交评论时都会插入注释:

         string saveComment = "INSERT INTO Comments(";
     saveComment += " UsersID, ThreadsID, Date, Comments, CommentResponse";


     saveComment += "Values('" + "','";// no idea what to insert in the UsersID
     saveComment += "" + "','";// no idea what to insert in the ThreadsID

     saveComment += DateTime.Now + "','";
     saveComment += CommenttxtBox.Text + "','";
     saveComment += commentResponseString + "')";

如您所见,字段包含UsersID和ThreadID,两者都通过外键连接到comments表。 现在,每次用户提交注释时,我想我还需要插入UsersID字段(这是注释表中的一个int,并且该字段在Users表中逐渐增加1)。我如何插入注释,并通知另一个表不要将UserID增加1.实际上我希望UserID对于每个提交注释的用户保持不变..

我该怎么做?我需要插入一个表中的几个字段(注释),但保持其他表通知它实际上是提交评论的同一用户。

注意:我不知道任何vb,只知道c#,我使用visual studio 2010. asp.net

2 个答案:

答案 0 :(得分:1)

顺便说一句,你插入的方式是一个安全问题,你可以得到SQL注入...

使用system.data.sqlclient.sqlparameters传递值。

答案 1 :(得分:0)

您正在创建一个非常标准的规范化结构。您的Users表将负责控制生成的UserID值。

插入新评论时,您有两种情况需要处理:

  1. 用户存在并已登录。
  2. 用户不存在且匿名。
  3. 在第一种情况下,当您插入注释时,您不需要费心查看Users表。假设您已加载UserID(因为用户已登录)。

    在第二种情况下,您将首先需要到Users表的新行并返回表生成的UserID(假设您使用的是标识列)。然后,您可以将此值传递给Comments表。

    以下脚本是解决第二种情况的示例:

    DECLARE @userId int
    
    INSERT INTO Users (Username, FirstName)
    VALUES ('adamh', 'Adam')
    
    SET @userId = SCOPE_IDENTITY()
    
    INSERT INTO Comments(UserId, ThreadId, Comment)
    VALUES (@userId, 1, 'My comment')
    

    如果您想继续使用当前的编码风格,只需将值连接到字符串的相关部分即可。

    然而,有了像你所拥有的整齐定义的结构,我建议使用像Entity Framework 4.0或LINQ to SQL这样的东西,一旦你定义了你的结构,就会减少大量的管道。