2011-05-30 16 views
6

Tengo dos tablas:¡Una pregunta sobre la declaración de inserción de SQL!

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

Topics 
****** 
TopicID 
Theme 
Topics 
Date 

tengo que insertar dos declaraciones y conectarse entre ellos! Esta primera DECLARACIÓN:

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

y tengo que tener otra declaración para los temas de la mesa:

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

El problema es que tengo una conexión entre TopicsID (tabla Hilos) y TopicsID (Tabla de temas). Ambas son incrementales, ¿cómo puedo insertar el mismo TopicID en para obtener el mismo valor?

+4

puede dar un poco más de detalles sobre cómo llama a esos comandos de inserción. Personalmente, crearía un proceso almacenado - esto podría devolver el ID creado usando '@@ identity' – Beno

+1

Aquí está el enlace a lo que @guagland está sugiriendo: http://msdn.microsoft.com/en-us/library /ms187342.aspx –

+0

No es exactamente lo que está pidiendo, pero prefiero usar una capa de acceso a datos que maneje esto automáticamente, por ejemplo linq-a-sql. –

Respuesta

2

Si usa el servidor MS SQL, puede obtener el valor de autoincrement con @@ Identity.

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

A continuación, ejecute el siguiente comando como ExecuteScalar y obtener su valor

+1

o crear un procedimiento almacenado que insertará 2 filas a la vez en una transacción –

+1

@@ Identity obtiene la última identidad que se insertó. SQL Server puede servir muchas aplicaciones simultáneamente para que @@ Identity pueda devolverle la identidad de algo que otra persona estaba haciendo si logran obtener su declaración INSERT entre INSERT y SELECT. Use SCOPE_IDENTITY() en su lugar. –

+0

para que use @@ Seleccionar para obtener la identidad. Es la identidad un "int" que puedo incluir en otra instrucción de inserción sql que insertará TopicID en la tabla de temas. ¿Qué hago con Select @@ identity – WithFlyingColors

1

Puede mantener la TransactionTransactionScope mediante el uso y el uso de SCOPE_IDENTITY() obtener el ID insertado desde la primera consulta.

// 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

? Qué haces con el topicID, y no debería haber 2 SQL declaración. ¿otra instrucción sql que inserta el TopicID con el topicParagraph, topicTitle y Date? – WithFlyingColors

0

Las muestras del código no se correlacionan bien con el resto de la información proporcionada. Sin embargo, sin el código, su publicación parece ser lo suficientemente consistente, por lo que me inclino a considerar esos fragmentos como simplemente erróneos.

De todos modos, su idea parece clara. En SQL Server 2005 + se podía resolver su problema con una instrucción INSERT como éste:

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)"; 

Aunque se trata de un solo estado, se realiza dos inserciones en tablas diferentes. La inserción 'principal' se está haciendo en la tabla Topics. El 'secundario', en Threads, se define mediante la cláusula OUTPUT...INTO. Básicamente, la cláusula OUTPUT le permite hacer referencia a los datos que se insertan y devolverlos como un conjunto de filas al cliente, o (cuando se combina con INTO) dirigirlos a una tabla existente, como puede verlo aquí.