2017-10-16 12 views
1

Je veux créer une requête où le nom de table sera dynamique et je l'obtiendrai d'une autre requête. Les 2 requêtes se trouvent dans des datacontexts différents.Requête C# avec nom de table dynamique

CODE

var tablename = (from tab in db.Tabs 
       where tab.id == tabid 
       select tab.name).FirstOrDefault(); 

var pid = (from p in tablename 
      select p.id).FirstOrDefault(); 
+0

Dans ce cas, vous devez écrire vos instructions SQL sur vous-même. Mais vous devriez utiliser la classe 'SqlCommand' et sa propriété' Parameters' pour éviter les attaques par injection. – Oliver

+0

@Oliver Comment puis-je faire cela? – alxem

+0

Dans la deuxième requête, ce que vous faites est d'interroger une chaîne, pas la table elle-même. Évidemment, cela ne donnera pas le résultat que vous voulez. Si vous écrivez votre propre instruction sql, notez que vous ne pouvez pas paramétrer les identifiants en sql, vous devrez donc soit créer le texte de requête dans votre code C# (avec un risque d'injection sql minimisé, puisque vous n'intervenez pas ici), ou créez une procédure stockée qui utilise sql dynamique à l'intérieur (où vous avez une meilleure chance de vous défendre contre les attaques par injection de sql). –

Répondre

0
using(SqlConnection sqlCon = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString)) 
{ 
    SqlCommand com = new SqlCommand(); 
    SqlDataReader sqlReader; 

    com.CommandText = "Select id from @tableName"; 
    com.CommandType = CommandType.Text; 
    com.Parameters.Add(new SqlParameter("@tableName", tableName); 

    com.Connection = sqlCon; 
    sqlCon.Open(); 
    sqlReader = com.ExecuteReader(); 

    var dt = new DataTable(); 
    dt.Load(sqlReader); //Query output is in dt now 
} 
+1

Ce code ne fonctionne pas! Vous ne pouvez pas passer le nom de la table en paramètre. –

0

Alimenter nom de la table dynamique dans la 2ème requête, vous pouvez utiliser la procédure stockée au lieu de LINQ.

Lorsque vous avez obtenu votre procédure stockée, vous appelez ensuite en passant tablename (le résultat de votre première requête

SP doc. https://docs.microsoft.com/en-us/sql/relational-databases/stored-procedures/create-a-stored-procedure

Ceci est un exemple grossier juste pour vous donner une idée:

CREATE PROCEDURE InsertProc 
    @tablename varchar(100) 
    AS 
    begin 
    select * from @tablename 
end 
+0

Je ne veux pas le faire avec SP. Est-il possible de le faire avec du code? – alxem

+0

uhm .. Je ne suis pas au courant d'autres moyens, désolé – grepLines

+0

'context.Database.ExecuteSqlCommand (" select * from "+ nomtable);' - ne pas oublier l'injection SQL – ASpirin

2

les noms de tables ne peuvent pas être fournis en tant que paramètres, de sorte que vous aurez à construire la chaîne SQL manuellement dans une fonction ou procédure stockée avant de pouvoir l'exécuter.

create PROC read_from_dynamic_table(@TableName NVARCHAR(50)) 
AS 
BEGIN 
DECLARE @SQLSelectQuery NVARCHAR(MAX)='' 
SET @SQLSelectQuery = 'SELECT * FROM ' + @TableName 

    exec(@SQLSelectQuery) 
END 

Ensuite, vous pouvez appeler le proc avec le nom de la table en tant que paramètre

+0

Pouvez-vous fournir toute la requête? Le deuxième dans mon op – alxem