2011-05-30 138 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結合使用時)將它們引導到現有表中,就像您可以在此處看到的那樣。