/// <summary> /// Gets the name of the SQL server from the exception. /// </summary> /// <param name="ex">The exception.</param> /// <returns> /// SQL server instance name /// </returns> private static string GetServerName(SqlException ex) { if (ex.Data.Contains(Server)) { return(ex.GetContextDataItem <string>(Server)); } return(string.IsNullOrEmpty(ex.Server) ? "Unknown" : ex.Server); }
/// <summary> /// Formats detail of the <see cref="SqlException" /> to a string. /// </summary> /// <param name="ex">The exception.</param> /// <returns> /// Formatted exception text. /// </returns> public static string Format(this SqlException ex) { var server = GetServerName(ex); var sb = new StringBuilder(); sb.AppendLine("SqlException caught!") .AppendLine($"Client: {Environment.MachineName}") .AppendLine($"Server: {server}"); var hasContextData = ex.Data.Contains(HasContextData); var batchBeginLineNumber = 0; if (hasContextData) { batchBeginLineNumber = ex.GetContextDataItem <int>(BatchBeginLineNumber); sb.AppendLine($"Batch: {ex.GetContextDataItem<string>(BatchSource)}, beginning at line {batchBeginLineNumber}"); } sb.AppendLine(FormatSqlError(ex.Errors[0], batchBeginLineNumber, false)); if (ex.Errors.Count > 1) { sb.AppendLine("Errors:"); for (var i = 1; i < ex.Errors.Count; ++i) { sb.AppendLine($"Error #{i}").AppendLine(FormatSqlError(ex.Errors[i], batchBeginLineNumber, true)); } } if (hasContextData) { sb.AppendLine("Error near:"); sb.AppendLine(ex.GetContextDataItem <string>(ErrorStatement)); } return(sb.ToString()); }