[英]A question about SQL insert statement!
我有兩張桌子:
Threads
*******
ThreadID
UserID
TopicsID
Date
ThreadTitle
ThreadParagraph
ThreadClosed
Topics
******
TopicID
Theme
Topics
Date
我需要插入兩個語句並在它們之間連接:這是第一個語句:
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 插入到它們中以使它們獲得相同的值?
如果您使用 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()
從第一個查詢中獲取插入的 ID 來維護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
}
如果您正在尋找可靠的東西,您需要使用Transactions 。
請參閱SQL 服務器存儲過程中的管理事務以獲得一個想法。
另外,請查看Controlling Transactions (Database Engine)和SQL Server Transaction Isolation Models 。
您還需要使用@@Identity最后插入的標識值。
您的代碼示例與所提供信息的 rest 相關性不高。 但是,如果沒有代碼,您的帖子似乎足夠一致,所以我傾向於認為這些片段完全是錯誤的。
無論如何,你的想法似乎很清楚。 在 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)";
盡管這是一條語句,但它對不同的表執行了兩次插入。 'main' 插入正在Topics
表中。 “次要”,進入Threads
,由OUTPUT...INTO
子句定義。 基本上, OUTPUT
子句允許您引用正在插入的數據並將它們作為行集返回給客戶端,或者(當與INTO
結合使用時)將它們定向到現有表中,就像您可以在此處看到的那樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.