簡體   English   中英

關於SQL插入語句的問題!

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM