Browse Source

implement a version check in the SQLServerDatabaseDriver. Versions 2000 and 2005 are no longer supported.

pull/18/head
Siegfried Pammer 14 years ago
parent
commit
3b601df39b
  1. 452
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core.UI/Windows/ConnectionWizardWindow.xaml.cs
  2. 60
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.SQLServer/SQLServerDatabaseDriver.cs
  3. 29
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.SQLServer/SQLServerDatasource.cs

452
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core.UI/Windows/ConnectionWizardWindow.xaml.cs

@ -17,226 +17,234 @@ using System.Windows.Threading; @@ -17,226 +17,234 @@ using System.Windows.Threading;
namespace ICSharpCode.Data.Core.UI.Windows
{
/// <summary>
/// Interaction logic for ConnectionWizardWindow.xaml
/// </summary>
public partial class ConnectionWizardWindow : Window, INotifyPropertyChanged
{
#region Fields
private Action _addAction = null;
private IDatabaseDriver _selectedDatabaseDriver = null;
private IDatasource _selectedDatasource = null;
private IDatabase _selectedDatabase = null;
private bool _isLoading = false;
private Exception _datasourceException = null;
#endregion
#region Properties
public Action AddAction
{
get { return _addAction; }
set { _addAction = value; }
}
public IDatabaseDriver SelectedDatabaseDriver
{
get { return _selectedDatabaseDriver; }
set
{
_selectedDatabaseDriver = value;
OnPropertyChanged("SelectedDatabaseDriver");
}
}
public IDatasource SelectedDatasource
{
get { return _selectedDatasource; }
set
{
if (value != null)
btnConnect.IsEnabled = true;
else
btnConnect.IsEnabled = false;
_selectedDatasource = value;
OnPropertyChanged("SelectedDatasource");
}
}
public IDatabase SelectedDatabase
{
get { return _selectedDatabase; }
set
{
_selectedDatabase = value;
OnPropertyChanged("SelectedDatabase");
}
}
public bool IsLoading
{
get { return _isLoading; }
set
{
_isLoading = value;
OnPropertyChanged("IsLoading");
}
}
public Exception DatasourceException
{
get { return _datasourceException; }
set
{
_datasourceException = value;
OnPropertyChanged("DatasourceException");
}
}
#endregion
#region Constructor
public ConnectionWizardWindow()
{
InitializeComponent();
}
#endregion
#region Private methods
private void SetIsLoading(bool value)
{
Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => { IsLoading = value; }));
}
private void SetException(Exception exception)
{
Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => { DatasourceException = exception; }));
}
private void SetSelectedDatasource(IDatasource datasource)
{
Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => { SelectedDatasource = datasource; }));
}
private void PopulateDatasources()
{
Thread thread = new Thread(new ThreadStart(delegate()
{
if (SelectedDatabaseDriver != null)
{
SetIsLoading(true);
SelectedDatabaseDriver.PopulateDatasources();
SetIsLoading(false);
}
}
));
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
}
private void PopulateDatabases()
{
SetException(null);
Thread thread = new Thread(new ThreadStart(delegate()
{
if (SelectedDatabaseDriver != null)
{
SetIsLoading(true);
try
{
SelectedDatabaseDriver.PopulateDatabases();
}
catch (Exception ex)
{
Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() =>
{
MessageBox.Show(this, ex.Message, this.Title, MessageBoxButton.OK, MessageBoxImage.Error);
}));
}
SetIsLoading(false);
}
}));
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
}
#endregion
#region Event handlers
private void btnAutoDiscover_Click(object sender, RoutedEventArgs e)
{
PopulateDatasources();
}
private void btnConnect_Click(object sender, RoutedEventArgs e)
{
PopulateDatabases();
}
private void cboDatasources_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
if (SelectedDatabaseDriver != null)
{
SelectedDatasource = SelectedDatabaseDriver.AddNewDatasource(cboDatasources.Text);
}
}
}
private void cboDatabases_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
btnAdd.IsEnabled = true;
}
private void btnAdd_Click(object sender, RoutedEventArgs e)
{
if (_addAction == null)
{
DialogResult = true;
Close();
}
else
{
_addAction.Invoke();
}
}
private void btnCancel_Click(object sender, RoutedEventArgs e)
{
DialogResult = false;
Close();
}
#endregion
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
#endregion
}
/// <summary>
/// Interaction logic for ConnectionWizardWindow.xaml
/// </summary>
public partial class ConnectionWizardWindow : Window, INotifyPropertyChanged
{
#region Fields
private Action _addAction = null;
private IDatabaseDriver _selectedDatabaseDriver = null;
private IDatasource _selectedDatasource = null;
private IDatabase _selectedDatabase = null;
private bool _isLoading = false;
private Exception _datasourceException = null;
#endregion
#region Properties
public Action AddAction
{
get { return _addAction; }
set { _addAction = value; }
}
public IDatabaseDriver SelectedDatabaseDriver
{
get { return _selectedDatabaseDriver; }
set
{
_selectedDatabaseDriver = value;
OnPropertyChanged("SelectedDatabaseDriver");
}
}
public IDatasource SelectedDatasource
{
get { return _selectedDatasource; }
set
{
if (value != null)
btnConnect.IsEnabled = true;
else
btnConnect.IsEnabled = false;
_selectedDatasource = value;
OnPropertyChanged("SelectedDatasource");
}
}
public IDatabase SelectedDatabase
{
get { return _selectedDatabase; }
set
{
_selectedDatabase = value;
OnPropertyChanged("SelectedDatabase");
}
}
public bool IsLoading
{
get { return _isLoading; }
set
{
_isLoading = value;
OnPropertyChanged("IsLoading");
}
}
public Exception DatasourceException
{
get { return _datasourceException; }
set
{
_datasourceException = value;
OnPropertyChanged("DatasourceException");
}
}
#endregion
#region Constructor
public ConnectionWizardWindow()
{
InitializeComponent();
}
#endregion
#region Private methods
private void SetIsLoading(bool value)
{
Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => { IsLoading = value; }));
}
private void SetException(Exception exception)
{
Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => { DatasourceException = exception; }));
}
private void SetSelectedDatasource(IDatasource datasource)
{
Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => { SelectedDatasource = datasource; }));
}
private void PopulateDatasources()
{
SetException(null);
Thread thread = new Thread(
new ThreadStart(
delegate() {
try {
if (SelectedDatabaseDriver != null) {
SetIsLoading(true);
SelectedDatabaseDriver.PopulateDatasources();
}
} catch (Exception ex) {
SetException(ex);
} finally {
SetIsLoading(false);
}
}
)
);
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
}
private void PopulateDatabases()
{
SetException(null);
Thread thread = new Thread(new ThreadStart(delegate()
{
if (SelectedDatabaseDriver != null)
{
SetIsLoading(true);
try
{
SelectedDatabaseDriver.PopulateDatabases();
}
catch (Exception ex)
{
Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() =>
{
MessageBox.Show(this, ex.Message, this.Title, MessageBoxButton.OK, MessageBoxImage.Error);
}));
}
SetIsLoading(false);
}
}));
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
}
#endregion
#region Event handlers
private void btnAutoDiscover_Click(object sender, RoutedEventArgs e)
{
PopulateDatasources();
}
private void btnConnect_Click(object sender, RoutedEventArgs e)
{
PopulateDatabases();
}
private void cboDatasources_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
if (SelectedDatabaseDriver != null)
{
SelectedDatasource = SelectedDatabaseDriver.AddNewDatasource(cboDatasources.Text);
}
}
}
private void cboDatabases_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
btnAdd.IsEnabled = true;
}
private void btnAdd_Click(object sender, RoutedEventArgs e)
{
if (_addAction == null)
{
DialogResult = true;
Close();
}
else
{
_addAction.Invoke();
}
}
private void btnCancel_Click(object sender, RoutedEventArgs e)
{
DialogResult = false;
Close();
}
#endregion
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
#endregion
}
}

60
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.SQLServer/SQLServerDatabaseDriver.cs

@ -144,22 +144,21 @@ namespace ICSharpCode.Data.Core.DatabaseDrivers.SQLServer @@ -144,22 +144,21 @@ namespace ICSharpCode.Data.Core.DatabaseDrivers.SQLServer
{
string serverName = dr["ServerName"].ToString().Trim().ToUpper();
string instanceName = null;
string version = null;
Version version = null;
if (dr["InstanceName"] != null && dr["InstanceName"] != DBNull.Value)
instanceName = dr["InstanceName"].ToString().Trim().ToUpper();
if (dr["Version"] != null && dr["Version"] != DBNull.Value)
version = dr["Version"].ToString().Trim().Split('.').FirstOrDefault();
version = new Version(dr["Version"].ToString().Trim());
SQLServerDatasource datasource = new SQLServerDatasource(this) { Name = serverName };
if (version == "8")
datasource.ProviderManifestToken = "2000";
else if (version == "9")
datasource.ProviderManifestToken = "2005";
else if (version == "10")
datasource.ProviderManifestToken = "2008";
string manifestToken;
if (!IsVersionSupported(version, out manifestToken))
throw new NotSupportedException(string.Format("Version '{0}' is not supported!", version == null ? "unknown" : version.ToString()));
datasource.ProviderManifestToken = manifestToken;
if (!String.IsNullOrEmpty(instanceName))
datasource.Name += "\\" + instanceName;
@ -169,7 +168,33 @@ namespace ICSharpCode.Data.Core.DatabaseDrivers.SQLServer @@ -169,7 +168,33 @@ namespace ICSharpCode.Data.Core.DatabaseDrivers.SQLServer
Datasources = datasources;
}
bool IsVersionSupported(Version version, out string manifestToken)
{
manifestToken = "";
if (version == null)
return false;
switch (version.Major) {
case 8:
manifestToken = "2000";
return false;
case 9:
manifestToken = "2005";
return false;
case 10:
if (version.Minor == 5)
manifestToken = "2008 R2";
else
manifestToken = "2008";
return true;
case 11:
manifestToken = "2012";
return true;
}
return false;
}
public override void PopulateDatabases(IDatasource datasource)
{
DatabaseObjectsCollection<IDatabase> databases = new DatabaseObjectsCollection<IDatabase>(datasource);
@ -200,19 +225,14 @@ namespace ICSharpCode.Data.Core.DatabaseDrivers.SQLServer @@ -200,19 +225,14 @@ namespace ICSharpCode.Data.Core.DatabaseDrivers.SQLServer
throw ex;
}
string sqlversion = sqlConnection.ServerVersion;
sqlversion = sqlversion.Split('.').FirstOrDefault(); //major version
int intsqlversion = Convert.ToInt32(sqlversion);
string sql = string.Empty;
Version version = new Version(sqlConnection.ServerVersion);
string manifestToken;
if (!IsVersionSupported(version, out manifestToken))
throw new NotSupportedException(string.Format("Version '{0}' is not supported!", version == null ? "unknown" : version.ToString()));
if (intsqlversion == 8)
datasource.ProviderManifestToken = "2000";
else if (intsqlversion == 9)
datasource.ProviderManifestToken = "2005";
else if (intsqlversion == 10)
datasource.ProviderManifestToken = "2008";
string sql = string.Empty;
if (intsqlversion >= 9)
if (version.Major >= 9)
sql = "use master; select name from sys.databases order by name";
else
sql = "use master; select name from sysdatabases order by name";

29
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.SQLServer/SQLServerDatasource.cs

@ -100,18 +100,23 @@ namespace ICSharpCode.Data.Core.DatabaseDrivers.SQLServer @@ -100,18 +100,23 @@ namespace ICSharpCode.Data.Core.DatabaseDrivers.SQLServer
protected override bool HandlePopulateDatabasesException(Exception exception)
{
SqlException sqlException = exception as SqlException;
if (sqlException.Number == 67)
{
DatabaseDriver.RemoveDatasource(Name);
MessageBox.Show("Error while trying to populate databases.\n\n" + exception.Message, DatabaseDriver.Name, MessageBoxButton.OK, MessageBoxImage.Exclamation);
return false;
}
else
{
throw exception;
}
if (exception is SqlException) {
SqlException sqlException = exception as SqlException;
if (sqlException.Number == 67) {
DatabaseDriver.RemoveDatasource(Name);
MessageBox.Show("Error while trying to populate databases.\n\n" + exception.Message, DatabaseDriver.Name, MessageBoxButton.OK, MessageBoxImage.Exclamation);
return false;
} else {
throw exception;
}
} else if (exception is NotSupportedException) {
DatabaseDriver.RemoveDatasource(Name);
MessageBox.Show("Error while trying to populate databases.\n\n" + exception.Message, DatabaseDriver.Name, MessageBoxButton.OK, MessageBoxImage.Exclamation);
return false;
} else {
throw exception;
}
}
#endregion

Loading…
Cancel
Save