2011-05-30 105 views
6

我有两个表:关于SQL插入语句的问题!

Threads 
******* 
ThreadID 
UserID 
TopicsID 
Date 
ThreadTitle 
ThreadParagraph 
ThreadClosed 

Topics 
****** 
TopicID 
Theme 
Topics 
Date 

我需要插入两个语句以及它们之间的连接! 这第一statment:

string insertCommand = 
    "INSERT INTO Users (UserID,TopicID,Date,ThreadTitle,ThreadParagraph) " + 
    "VALUES ('CONVERT(uniqueidentifier, '" + giveMeGuidID() + 
    "),TopicID,dateTime,questionTitle,subTopic)"; 

,我需要有对主题表另一份声明:

string insertCommand = 
    "INSERT INTO Topics (UserID,TopicID,Date,ThreadTitle,ThreadParagraph) " + 
    "VALUES ('Theme, Topics, Date')"; 

的问题是,我有TopicsID之间的连接(线程表)和TopicsID (主题表)。两者都是增量整数,所以我如何将相同的TopicID插入到 两者中以使它们获得相同的值?

+4

你能否详细介绍一下你如何调用这些插入命令。亲自,我会创建一个存储过程 - 这将能够返回创建的ID使用'@@ identity' – Beno 2011-05-30 08:29:22

+1

这里是@guagland建议的链接:http://msdn.microsoft.com/en-us/library /ms187342.aspx – 2011-05-30 08:30:53

+0

不完全是你要求的,但我更喜欢使用自动处理它的数据访问层,例如LINQ到SQL。 – 2011-05-30 08:35:26

回答

2

如果您使用MS SQL服务器,您可以使用@@ Identity获取自动增量值。

string insertCommand = 
    "INSERT INTO Users (UserID,TopicID,Date,ThreadTitle,ThreadParagraph) " + 
    "VALUES ('CONVERT(uniqueidentifier, '" + giveMeGuidID() + 
    "),TopicID,dateTime,questionTitle,subTopic); SELECT @@Identity"; 

然后,运行这个命令的ExecuteScalar和使用TransactionScope和使用SCOPE_IDENTITY()从第一个查询得到插入标识让您的价值

+1

的整个想法,或者创建一个在交易中一次插入2行的存储过程 – 2011-05-30 08:33:31

+1

@@标识获取插入的最后一个标识。 SQL Server可以同时为多个应用程序提供服务,因此@@ Identity可能会让您恢复别人在INSERT和SELECT之间获得INSERT语句时所做的某些操作的身份。改为使用SCOPE_IDENTITY()。 – 2011-05-30 08:33:44

+0

所以你用@@选择获取身份。该身份是一个“int”,我可以将其放入另一个将在Topic表中插入TopicID的sql插入语句中。我如何处理Select @@ identity – WithFlyingColors 2011-05-30 08:46:05

1

可以维护Transaction

// Create the TransactionScope 
using (TransactionScope oTranScope = new TransactionScope()) 
{ 
    Int32 TopicID; 
    // Open a connection 
    using (SqlConnection oCn1 = new SqlConnection(this.sCn1)) 
    { 
     SqlCommand oCmd1 = new SqlCommand("INSERT INTO Users (UserID,TopicID,Date,ThreadTitle,ThreadParagraph) " + 
"VALUES ('CONVERT(uniqueidentifier, '" + giveMeGuidID() + 
"),TopicID,dateTime,questionTitle,subTopic); SELECT SCOPE_IDENTITY()";, oCn1); 

     oCmd1.Parameters.Add ... Better to use parameter to save SQL Injection Attack 

     oCn1.Open(); 
     // At this point, the connection is in the transaction scope, 
     // which is a lightweight transaction. 
     TopicID = Convert.ToInt32 oCmd1.ExecuteScaler()); // as you want to get Id 
     oCn1.Close(); 
    } 
    // Open a connection 
    using (SqlConnection oCn2 = new SqlConnection(this.sCn2)) 
    { 
     SqlCommand oCmd2 = new SqlCommand("SQLQuery", oCn2); 
     //use return TopicID from last inserted query 
     oCn2.Open(); 
     // The connection is enlisted in the transaction scope, 
     // which is now promoted to a distributed transaction 
     // controlled by MSDTC 
     oCmd2.ExecuteNonQuery(); 
     oCn2.Close(); 
    } 
    // Tell the transaction scope to commit when ready 
    oTranScope.Consistent = true; 
    // The following bracket completes and disposes the transaction 
} 
+0

你如何处理topicID,并且不应该有2个sql语句。另一个插入带有topicParagraph,topicTitle和Date的TopicID的sql语句? – WithFlyingColors 2011-05-30 09:10:33

0

您的代码示例与提供的其他信息没有很好的关联。但是,如果没有代码,你的帖子看起来就足够一致,所以我倾向于将这些代码片段视为错误。

无论如何,你的想法似乎很清楚。在SQL Server 2005 +,你可以用这样一个INSERT语句解决您的问题:

string insertCommand = 
    "INSERT INTO Topics (Theme, Topics, Date) " + 
     "OUTPUT 'CONVERT(uniqueidentifier, '" + giveMeGuidID() + 
     "'), INSERTED.TopicID, @dateTime, @questionTitle, @subTopic " + 
     "INTO Threads (UserID, TopicID, Date, ThreadTitle, ThreadParagraph) " + 
    "VALUES (@Theme, @Topics, @Date)"; 

虽然这是一个单独的语句,它执行两个插入到不同的表。 '主'插入正在制作Topics表。 '第二'一个,Threads,由OUTPUT...INTO子句定义。基本上,OUTPUT子句允许您引用要插入的数据,并将它们作为行集返回给客户端,或者(与INTO结合使用时)将它们引导到现有表中,就像您可以在此处看到的那样。