1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
|
//------------------------------------------------------------------------------
// <copyright file="SqlException.cs" company="Microsoft">
// Copyright (c) Microsoft Corporation. All rights reserved.
// </copyright>
// <owner current="true" primary="true">Microsoft</owner>
// <owner current="true" primary="false">Microsoft</owner>
//------------------------------------------------------------------------------
namespace System.Data.SqlClient {
using System;
using System.Collections;
using System.ComponentModel;
using System.Data.Common;
using System.Diagnostics;
using System.Globalization;
using System.Runtime.Serialization;
using System.Text; // StringBuilder
[Serializable]
public sealed class SqlException : System.Data.Common.DbException {
private const string OriginalClientConnectionIdKey = "OriginalClientConnectionId";
private const string RoutingDestinationKey = "RoutingDestination";
private SqlErrorCollection _errors;
[System.Runtime.Serialization.OptionalFieldAttribute(VersionAdded = 4)]
private Guid _clientConnectionId = Guid.Empty;
private SqlException(string message, SqlErrorCollection errorCollection, Exception innerException, Guid conId) : base(message, innerException) {
HResult = HResults.SqlException;
_errors = errorCollection;
_clientConnectionId = conId;
}
// runtime will call even if private...
private SqlException(SerializationInfo si, StreamingContext sc) : base(si, sc) {
_errors = (SqlErrorCollection) si.GetValue("Errors", typeof(SqlErrorCollection));
HResult = HResults.SqlException;
foreach (SerializationEntry siEntry in si) {
if ("ClientConnectionId" == siEntry.Name) {
_clientConnectionId = (Guid)siEntry.Value;
break;
}
}
}
[System.Security.Permissions.SecurityPermissionAttribute(System.Security.Permissions.SecurityAction.LinkDemand, Flags=System.Security.Permissions.SecurityPermissionFlag.SerializationFormatter)]
override public void GetObjectData(SerializationInfo si, StreamingContext context) {
if (null == si) {
throw new ArgumentNullException("si");
}
si.AddValue("Errors", _errors, typeof(SqlErrorCollection));
si.AddValue("ClientConnectionId", _clientConnectionId, typeof(Guid));
base.GetObjectData(si, context);
}
[
DesignerSerializationVisibility(DesignerSerializationVisibility.Content)
]
public SqlErrorCollection Errors {
get {
if (_errors == null) {
_errors = new SqlErrorCollection();
}
return _errors;
}
}
public Guid ClientConnectionId {
get {
return this._clientConnectionId;
}
}
/*virtual protected*/private bool ShouldSerializeErrors() { // MDAC 65548
return ((null != _errors) && (0 < _errors.Count));
}
public byte Class {
get { return this.Errors[0].Class;}
}
public int LineNumber {
get { return this.Errors[0].LineNumber;}
}
public int Number {
get { return this.Errors[0].Number;}
}
public string Procedure {
get { return this.Errors[0].Procedure;}
}
public string Server {
get { return this.Errors[0].Server;}
}
public byte State {
get { return this.Errors[0].State;}
}
override public string Source {
get { return this.Errors[0].Source;}
}
public override string ToString() {
StringBuilder sb = new StringBuilder(base.ToString());
sb.AppendLine();
sb.AppendFormat(SQLMessage.ExClientConnectionId(), _clientConnectionId);
// Append the error number, state and class if the server provided it
if (Number != 0) {
sb.AppendLine();
sb.AppendFormat(SQLMessage.ExErrorNumberStateClass(), Number, State, Class);
}
// If routed, include the original client connection id
if (Data.Contains(OriginalClientConnectionIdKey)) {
sb.AppendLine();
sb.AppendFormat(SQLMessage.ExOriginalClientConnectionId(), Data[OriginalClientConnectionIdKey]);
}
// If routed, provide the routing destination
if (Data.Contains(RoutingDestinationKey)) {
sb.AppendLine();
sb.AppendFormat(SQLMessage.ExRoutingDestination(), Data[RoutingDestinationKey]);
}
return sb.ToString();
}
static internal SqlException CreateException(SqlErrorCollection errorCollection, string serverVersion) {
return CreateException(errorCollection, serverVersion, Guid.Empty);
}
static internal SqlException CreateException(SqlErrorCollection errorCollection, string serverVersion, SqlInternalConnectionTds internalConnection, Exception innerException = null) {
Guid connectionId = (internalConnection == null) ? Guid.Empty : internalConnection._clientConnectionId;
var exception = CreateException(errorCollection, serverVersion, connectionId, innerException);
if (internalConnection != null) {
if ((internalConnection.OriginalClientConnectionId != Guid.Empty) && (internalConnection.OriginalClientConnectionId != internalConnection.ClientConnectionId)) {
exception.Data.Add(OriginalClientConnectionIdKey, internalConnection.OriginalClientConnectionId);
}
if (!string.IsNullOrEmpty(internalConnection.RoutingDestination)) {
exception.Data.Add(RoutingDestinationKey, internalConnection.RoutingDestination);
}
}
return exception;
}
static internal SqlException CreateException(SqlErrorCollection errorCollection, string serverVersion, Guid conId, Exception innerException = null) {
Debug.Assert(null != errorCollection && errorCollection.Count > 0, "no errorCollection?");
// concat all messages together MDAC 65533
StringBuilder message = new StringBuilder();
for (int i = 0; i < errorCollection.Count; i++) {
if (i > 0) {
message.Append(Environment.NewLine);
}
message.Append(errorCollection[i].Message);
}
if (innerException == null && errorCollection[0].Win32ErrorCode != 0 && errorCollection[0].Win32ErrorCode != -1) {
innerException = new Win32Exception(errorCollection[0].Win32ErrorCode);
}
SqlException exception = new SqlException(message.ToString(), errorCollection, innerException, conId);
exception.Data.Add("HelpLink.ProdName", "Microsoft SQL Server");
if (!ADP.IsEmpty(serverVersion)) {
exception.Data.Add("HelpLink.ProdVer", serverVersion);
}
exception.Data.Add("HelpLink.EvtSrc", "MSSQLServer");
exception.Data.Add("HelpLink.EvtID", errorCollection[0].Number.ToString(CultureInfo.InvariantCulture));
exception.Data.Add("HelpLink.BaseHelpUrl", "http://go.microsoft.com/fwlink");
exception.Data.Add("HelpLink.LinkId", "20476");
return exception;
}
internal SqlException InternalClone() {
SqlException exception = new SqlException(Message, _errors, InnerException, _clientConnectionId);
if (this.Data != null)
foreach (DictionaryEntry entry in this.Data)
exception.Data.Add(entry.Key, entry.Value);
exception._doNotReconnect = this._doNotReconnect;
return exception;
}
// Do not serialize this field! It is used to indicate that no reconnection attempts are required
internal bool _doNotReconnect = false;
}
}
|