Je suis tombé sur ceci et en utilisant l'extrait de @b_stil, j'ai pu identifier la colonne coupable. Et après une enquête plus poussée, j'ai réalisé que je devais également redimensionner la colonne comme l'a suggéré @Liji Chandran, mais j'utilisais IExcelDataReader et je ne pouvais pas trouver de moyen facile pour valider et redimensionner chacune de mes 160 colonnes.
Ensuite, je suis tombé sur cette classe, (ValidatingDataReader) de CSVReader.
La chose intéressante à propos de cette classe est qu'elle vous donne la longueur des données des colonnes source et destination, la ligne coupable et même la valeur de la colonne qui cause l'erreur.
Tout ce que j'ai fait était de redimensionner toutes les colonnes (nvarchar, varchar, char et nchar).
J'ai simplement modifié ma méthode GetValue
comme ceci :
object IDataRecord.GetValue(int i)
{
object columnValue = reader.GetValue(i);
if (i > -1 && i < lookup.Length)
{
DataRow columnDef = lookup[i];
if
(
(
(string)columnDef["DataTypeName"] == "varchar" ||
(string)columnDef["DataTypeName"] == "nvarchar" ||
(string)columnDef["DataTypeName"] == "char" ||
(string)columnDef["DataTypeName"] == "nchar"
) &&
(
columnValue != null &&
columnValue != DBNull.Value
)
)
{
string stringValue = columnValue.ToString().Trim();
columnValue = stringValue;
if (stringValue.Length > (int)columnDef["ColumnSize"])
{
string message =
"Valeur de la colonne \"" + stringValue.Replace("\"", "\\\"") + "\"" +
" avec une longueur de " + stringValue.Length.ToString("###,##0") +
" de la colonne source " + (this as IDataRecord).GetName(i) +
" dans l'enregistrement " + currentRecord.ToString("###,##0") +
" ne rentre pas dans la colonne de destination " + columnDef["ColumnName"] +
" avec une longueur de " + ((int)columnDef["ColumnSize"]).ToString("###,##0") +
" dans la table " + tableName +
" de la base de données " + databaseName +
" sur le serveur " + serverName + ".";
if (ColumnException == null)
{
throw new Exception(message);
}
else
{
ColumnExceptionEventArgs args = new ColumnExceptionEventArgs();
args.DataTypeName = (string)columnDef["DataTypeName"];
args.DataType = Type.GetType((string)columnDef["DataType"]);
args.Value = columnValue;
args.SourceIndex = i;
args.SourceColumn = reader.GetName(i);
args.DestIndex = (int)columnDef["ColumnOrdinal"];
args.DestColumn = (string)columnDef["ColumnName"];
args.ColumnSize = (int)columnDef["ColumnSize"];
args.RecordIndex = currentRecord;
args.TableName = tableName;
args.DatabaseName = databaseName;
args.ServerName = serverName;
args.Message = message;
ColumnException(args);
columnValue = args.Value;
}
}
}
}
return columnValue;
}
J'espère que cela aidera quelqu'un