Validation des données dans ma table de données avant de tenter d'écrire dans la base de données avec SQLBulkCopy

c# datatable sql sqlbulkcopy

Question

J'utilise SqlBulkCopier pour insérer un grand nombre d'entrées dans notre base de données de journalisation.

La mise en page du programme est la suivante:

Il reçoit un flux de données des réseaux (autres serveurs), puis analyse le flux et crée des objets de Log . (200 - 400) la seconde. J'ajoute ensuite chaque journal à l'objet SQLTable DataTable.

J'incrémente ensuite un compteur. Une fois que j'ai 10000 journaux, je fais le sqlBulkInsert.

Maintenant, le problème que je rencontre est que, si l’une des lignes ne correspond pas à la validation SQL, c’est-à-dire si le champ est trop long, etc., je perds tous les journaux restants.

N'y a-t-il pas moyen d'appeler valider sur la table de données pour chaque élément de journal que j'ajoute, de cette façon, je peux ignorer les éléments non valides et conserver tous les éléments valides en lieu sûr

Actuellement, j'insère un élément à la fois et s'il échoue, je l'ignore et continue avec le suivant. Mais cela va manifestement à l'encontre des avantages en termes de performances et de points de SqlBulk Copy.

Un code:

 private DataTable _logTable;

 public void AddLog(Log log)
    {
        if (log.serverId != null || log.serverId > 1)
        {
            try
            {
                _logTable.Rows.Add(log.logId, log.messageId, log.serverId, log.time, log.direction, log.hasRouting,
                    log.selfRouting, log.deviceType, log.unitId, log.accountCode, log.clientId, log.data);

                if (_logBufferCounter++ > BufferValue)
                {
                    _logBufferCounter = 0;
                    using (var sbc = new SqlBulkCopy(_connectionString, SqlBulkCopyOptions.TableLock))
                    {
                        sbc.DestinationTableName = "dbo.Logs";
                        sbc.BulkCopyTimeout = 0;
                        sbc.WriteToServer(_logTable);
                        _logTable.Clear();
                        sbc.Close();
                    }
                }
            }

            catch (Exception e)
            {               
                Log.Error("Failed to write bulk insert for LOG Table", e);                
                _logTable.Clear();
            }
        }
        else
        {
            Log.Error("Server Id is null for LOG: " + LogToString(log));
        }
    }

Réponse populaire

Non, il n'y en a pas.

Mais vous pouvez, en tant que programmeur, valider avant d’insérer. Pas si difficile, tu sais. Et il n’est nul besoin de disposer d’une table de données HEAVY - utilisez des objets normaux et collez-les dans l’instance SqlBulkDCopy en utilisant votre propre implémentation de l’interface requise;)



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi