Вопрос по поводу оператора вставки SQL! - PullRequest
6 голосов
/ 30 мая 2011

У меня есть две таблицы:

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 в оба из них, чтобы они получили одинаковое значение?

Ответы [ 4 ]

2 голосов
/ 30 мая 2011

Если вы используете сервер MS SQL, вы можете получить значение автоинкремента с помощью @@ Identity.

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

Затем выполните эту команду как ExecuteScalar и получите ваше значение

1 голос
/ 30 мая 2011

Вы можете сохранить Transaction, используя TransactionScope и SCOPE_IDENTITY(), чтобы получить вставленный идентификатор из первого запроса.

 // 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 голосов
/ 30 мая 2011

Ваши примеры кода плохо соотносятся с остальной предоставленной информацией.Без кода ваш пост кажется достаточно последовательным, поэтому я склонен считать эти фрагменты просто ошибочными.

В любом случае, ваша идея кажется ясной.В 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) направлять их в существующую таблицу, как выможете увидеть это здесь.

0 голосов
/ 30 мая 2011

Если вы ищете что-то надежное, вам нужно использовать Транзакции .

См. Управление транзакциями в хранимых процедурах SQL Server , чтобы получить представление.

Также обратите внимание на Управление транзакциями (компонент Database Engine) и Модели изоляции транзакций SQL Server .

Вам также необходимо использовать @@ Identity последнее вставленное значение идентификатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...