2015-09-03 2 views
0

Voici ce que j'ai obtenu: L'utilisateur sélectionne dans une liste de contrôle les noms de bases de données qu'il souhaite archiver. Mettez le boîtier en place pour attraper la sélection.C# SQLDataAdapter - Ne pas insérer de données dans la base de données

case "userSelection": 
       sqlAdapter = CreateMyAdapter("dbName", true, sqlconn, null); 
       sqlAdapter.SelectCommand.CommandText += ""; 
       sqlAdapter.Fill(myDS.tableName); 
       sqlAdapter.Dispose(); 

L'adaptateur:

private SqlDataAdapter CreateMyAdapter(string TableName, bool IncludeUpdates, SqlConnection sqlConn, SqlTransaction sqlTran) 
{ 
    SqlDataAdapter sqlAdapter = null; 
    SqlConnection sqlConnArchive = new SqlConnection(); 

    strSQL = "SELECT " + TableName + ".* FROM " + TableName; 
    sqlAdapter = new SqlDataAdapter(strSQL, sqlConn); 

    // Right here, I create another sqlConnection that is pointed to 
    // another datasource. 

    sqlConnArchive = getThisOtherConnection(); 

    SqlCommand sqlComm; 

    if (IncludeUpdates) 
    { 
     string strInsertSQL = "<insertQuery>"; 

     sqlComm = new SqlCommand(strInsertSQL, sqlConnArchive); 
     sqlComm.Parameters.Add("@TableID", SqlDbType.Int, 0, "TableID"); 
     // More params here... 

     sqlAdapter.InsertCommand = sqlComm; 

     // Update 

     // Delete 

    } 
} 
     return sqlAdapter; 

La question: Comme vous pouvez le voir sqlConn est la connexion qui est liée à la commande SELECT. Et sqlConnArchive est lié à l'INSERT. L'idée ici est que je pourrais sélectionner les données de DB_1 si vous voulez, et l'insérer dans DB_2 en utilisant le même SQLDataAdapter. Mais le problème que je rencontre est d'essayer d'insérer. La sélection fonctionne bien, et à cette ligne sqlAdapter.Fill(myDS.tableName); une fois que le remplissage s'exécute les données sont là. Mais l'INSERT ne fonctionne pas.

Quelques choses:

  • J'ai testé pour voir si peut-être SQLDataAdapter ne pouvait pas gérer plusieurs sources de données/connexions commutées choses il pointait le même DB tables seulement différentes, et je suis voir les mêmes résultats.

  • J'ai confirmé que le problème ne réside pas dans la requête INSERT.

  • Il n'y a pas d'erreur, juste des étapes dans debug.

  • J'ai essayé plusieurs permutations de .Update() et aucune d'elles n'a fonctionné. Ce projet que j'ai été affecté, tout au long de la chose il semble que .Fill(); est ce qui soumet les données à la base de données.

  • J'ai testé le côté de la base de données et la connectivité est un succès. Aucun problème de connexion, etc etc ..

Toute aide est grandement apprécié.

S'il vous plaît noter - J'ai essayé de mettre un accent encore plus grand sur le mot "grandement", mais a été limitée par mon ensemble d'outils. Apparemment, SOF ne prend pas en charge les fichiers en gras, clignotants, soulignés, flammes ou intégrés.

Répondre

1

Je pense que vous voulez ExecuteNonQuery.

var rowsAffected = sqlAdapter.InsertCommand.ExecuteNonQuery(); 

Cette exécute l'instruction et renvoie le nombre de lignes affectées. La méthode Fill n'exécutera aucun InsertCommand s.

+0

Hey ça a quelque part. Des pensées à ce sujet? "Informations supplémentaires: La requête paramétrée '(@TableID int, @ RowID int, @ otherValue tinyint, @ autreID int, @ somethingElse" attend le paramètre' @TableID ', qui n'a pas été fourni. " Je demande parce que cela est spécifié dans le code: 'SqlParameter SqlParam = sqlComm.Parameters.Add ("@ NewID", SqlDbType.Int, 0, "TableID"); sqlParam.Direction = ParameterDirection.Output; sqlAdapter.InsertCommand = sqlComm;' –

+0

Cette instruction ajoute un paramètre pour '@ NewID' avec la valeur" TableID "Il n'ajoute pas de paramètre pour' @ TableID'.Je pense que vous voulez 'sqlComm.Parameters.Add (" @ TableID ", SqlDbType.Int, 0, tableId)' où 'tableId' est une variable int. –

+0

Hm ok. Eh bien, il semble exiger ceci: 'SqlParameter sqlParam = sqlComm.Parameters.Add (" @ TableID ", SqlDbType.Int, 0," TableID ");'. Mais quand je l'ai défini, il est dit que TableID a déjà été déclaré. Et si je touche n'importe quoi dans sqlComm.Parameters.Add de sqlComm.parameters ("@ TableID", SqlDbType.Int, 0, "TableID"); ', il a la même erreur que ci-dessus excepté avec l'élément de ligne suivant. Donc, au lieu de dire qu'il attend un TableID, il recherche maintenant un RowID, et ainsi de suite. Pensées? –