2015-04-10 1 views
0

J'ai un ensemble d'ID dans un DataTable C#. Dans le même temps, j'ai une table contenant ces identifiants et d'autres données aussi. Mon exigence est de supprimer les enregistrements qui contiennent les ID spécifiés dans la table de données (s'il y a des tuples avec ces ID).SqlDataAdapter ne supprime pas les lignes de la table

J'utilise SqlDataAdapter pour cela.

SqlCommand command = new SqlCommand(text, con); 


command.UpdatedRowSource = UpdateRowSource.None; 
PrepareCommand(command, con, null, type, text, commandParas); 

SqlDataAdapter adpt = new SqlDataAdapter(); 
adpt.DeleteCommand = command; 

adpt.UpdateBatchSize = 2; 

adpt.Update(dataTable); 

connection.Close(); 

Voici ce que je veux dire par,

- "text" is the name of the stored procedure containing the delete command. The argument given to this stored procedure is the ID (picked from the list of IDs contained in the data table) 

- "commandParas" is the argument passed to the stored procedure. 

- "dataTable" contains the Ids used to delete the rows from SQL table. It contains only one column but several rows. 

Mais cela ne se traduit pas dans les lignes spécifiées RETIRE la table.

EDIT

J'ai donné la procédure stockée ci-dessous

CREATE PROCEDURE someName(@ID INT) 
AS 
BEGIN 
    DELETE FROM SampleTable 
    WHERE [email protected] 
END 

Ce que j'ai donné ci-dessous est le code où je crée la table de données

DataTable dt=new DataTable("abc"); 
    dt.clear(); 
    dt.Columns.Add(empId,typeof(int)); 

    foreach(SomeClass t SomeList) 
     dt.Rows.Add(t.IdNo); 

Ai-je fait une erreur?

+1

Existe-t-il une exigence spécifique pour utiliser SqlAdapter pour supprimer des enregistrements? Vous pouvez utiliser SqlCommand pour cela. –

+0

Visitez [this] (http://stackoverflow.com/help/mcve) pour apprendre ** Comment créer un exemple minimal, complet et vérifiable **. Vous n'avez pas fourni de procédure stockée SQL, 'PrepareCommand' et comment vous transmettez id à la procédure stockée et tout ça. –

+0

@Selva TS: tout ce qui peut m'aider à supprimer les lignes est bien. Mais je dois passer l'ensemble des ID, pas un seul ID. C'est un must. Avez-vous une solution? –

Répondre

0

Je vois que vous appelez PrepareCommand, et le définir dans l'adaptateur en tant que DeleteCmmand de l'adaptateur, mais où exécutez-vous la commande?

+0

Ok, pouvez-vous également ajouter le code où vous définissez quelles lignes doivent être supprimées. – DWright

+0

Je viens d'ajouter cette partie aussi –

+0

Génial, mais vous devez toujours appeler delete sur les lignes de la datatable que vous voulez supprimer. Voir ici: https://msdn.microsoft.com/en-us/library/feh3ed13.aspx pour quelques conseils. Donc maintenant vous avez des lignes dans le datatable, mais jusqu'à ce que vous les marquiez pour la suppression, la commande delete ne sera pas invoquée, car il n'y a rien à supprimer. – DWright

0

En tant que DWright souligné, vous devez définir les lignes à supprimer dans le DataTable avant de le pousser dans SqlDataAdapter Opérations par lots. Le code suivant fonctionne lorsque je place des lignes comme supprimées.

 DataTable dt; 

     using (SqlConnection c = new SqlConnection(connectionString)) 
     { 
      using (SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM [dbo].[Dealer]", c)) 
      { 
       DataSet ds = new DataSet(); 
       adapter.Fill(ds); 
       dt = ds.Tables[0]; 
      } 
     } 

     dt.Rows[0].Delete(); 
     dt.Rows[1].Delete(); 
     dt.Rows[2].Delete(); 

     using (SqlConnection c = new SqlConnection(connectionString)) 
     { 
      var adapter = new SqlDataAdapter(); 
      var command = new SqlCommand("DELETE FROM Dealer WHERE DealerId = @DealerId;", c); 

      var parameter = command.Parameters.Add("@DealerId", SqlDbType.Int, 3, "DealerId"); 
      parameter.SourceVersion = DataRowVersion.Original; 

      adapter.DeleteCommand = command; 
      adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None; 

      adapter.UpdateBatchSize = 2; 
      adapter.Update(dt); 
     } 
+0

je vous remercie pour la solution. Je définis les lignes à supprimer avant de passer à la méthode Update(). Il génère l'exception suivante "system.InvalidOperationException: Update nécessite une InsertCommand valide lors de la transmission de la collection DataRow avec de nouvelles lignes." –

+0

@nidarshanifernando donc vous avez aussi de nouvelles lignes dans 'DataTable'? –

+0

Si oui, veuillez utiliser la commande 'Update' et' Insert' comme indiqué dans cet exemple, https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter.deletecommand(v=vs. 110) .aspx –