2012-05-21 47 views
5

Tengo una entidad Report cuyos valores quiero insertar en una tabla de base de datos. Los siguientes atributos de Report tienen que ser insertada:Insertar una lista <> en la tabla de SQL Server

reportID - int 
RoleID - int 
Created_BY = SYSTEM(default) 
CURRENT_TIMESTAMP 

Ahora el problema es con el segundo atributo. Tengo un informe con los atributos LIST<ROLES>. ROLES es una entidad bien definida que tiene un ID y un NAME. De esta lista, tengo que extraer cada rol e insertar el ID de cada rol en la tabla.

Así que mi consulta en la actualidad se ve de la siguiente manera:

INSERT INTO REPORT_MARJORIE_ROLE(REPORT_ID, ROLE_ID, CREATED_BY, CREATED) 
VALUES({0}, {1}, 'SYSTEM', CURRENT_TIMESTAMP) 

El código C# desde donde estoy de análisis de estos valores es la siguiente:

try 
{ 
    StringBuilder _objSQL = new StringBuilder(); 
    _objSQL.AppendFormat(Queries.Report.ReportQueries.ADD_NEW_ROLES, report.ID, "report.MarjorieRoles.Add(MarjorieRole")); 
    _objDBWriteConnection.ExecuteQuery(_objSQL.ToString()); 
    _objDBWriteConnection.Commit(); 
    _IsRolesAdded = true; 
} 

Así que por favor me guía de cómo agregar funciones de C# función

+1

¿ha considerado un ORM? Con Linq to SQL o Entity Framework podría estar funcionando con esto en media hora. También hay nHibernate. –

Respuesta

10

Estoy asumiendo que usted dice SQL (lenguaje de consulta estructurado) y que realmente significa Microsoft SQL Server (el producto de base de datos real) en lugar - a la derecha?

No se puede insertar una lista entera en su conjunto en SQL Server - es necesario insertar una fila para cada entrada. Esto significa que debe llamar a la instrucción INSERT varias veces.

hacerlo de esta manera:

// define the INSERT statement using **PARAMETERS** 
string insertStmt = "INSERT INTO dbo.REPORT_MARJORIE_ROLE(REPORT_ID, ROLE_ID, CREATED_BY, CREATED) " + 
        "VALUES(@ReportID, @RoleID, 'SYSTEM', CURRENT_TIMESTAMP)"; 

// set up connection and command objects in ADO.NET 
using(SqlConnection conn = new SqlConnection(-your-connection-string-here)) 
using(SqlCommand cmd = new SqlCommand(insertStmt, conn) 
{ 
    // define parameters - ReportID is the same for each execution, so set value here 
    cmd.Parameters.Add("@ReportID", SqlDbType.Int).Value = YourReportID; 
    cmd.Parameters.Add("@RoleID", SqlDbType.Int); 

    conn.Open(); 

    // iterate over all RoleID's and execute the INSERT statement for each of them 
    foreach(int roleID in ListOfRoleIDs) 
    { 
     cmd.Parameters["@RoleID"].Value = roleID; 
     cmd.ExecuteNonQuery(); 
    } 

    conn.Close(); 
}  
+1

Sí, sí, tienes razón ... es MS SQL Server gracias para la ayuda y corregirme allí –

+0

¿Qué tal pasar una lista como xml? Eso resolvería tu problema – mko

+1

@John: sí, podrías enviarlo como XML, pero luego tendrás que "triturarlo" dentro de SQL Server nuevamente y eso también requiere un poco de esfuerzo y código ... –

0

digamos lstroles es su LIST<ROLES>.

lstroles.ForEach(Role => 
    {    
     /* Your Insert Query like 
     INSERT INTO REPORT_MARJORIE_ROLE(REPORT_ID, ROLE_ID, CREATED_BY, CREATED) 
     VALUES(REPORT_ID, Role.ID, {0}, {1}, 'SYSTEM', CURRENT_TIMESTAMP); 

     Commit you query*\ 
    }); 

En una nota personal: cuidado con la inyección de SQL.

+0

¡** NO ** debe concatenar juntas sus instrucciones SQL! Eso está abriendo la puerta del establo a ** ataques de inyección SQL **, y también es más lento desde el punto de vista del rendimiento (¡no hay que reutilizar el plan de ejecución de SQL Server!) –

Cuestiones relacionadas