
Великий МунаБудвин
   
Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск
Репутация: 21 Всего: 61
|
Wanderer2019, Выкладываю код предназначенный для работы с БД. Надеюсь, пригодится не только тебе: Код | /// <summary> /// Опции БД для Sql Server'a /// </summary> public class SqlServerOptions {
#region настройки БД для Sql Server private string _Instance = string.Empty; /// <summary> /// Имя сервера /// </summary> public string Instance { get { return _Instance; } set { _Instance = value; } }
private string _Database = string.Empty; /// <summary> /// Имя БД /// </summary> public string Database { get { return _Database; } set { _Database = value; } }
private string _UserName = string.Empty; /// <summary> /// Имя пользователя для подсоединения /// </summary> public string UserName { get { return _UserName; } set { _UserName = value; } }
private string _Password = string.Empty; /// <summary> /// Пароль /// </summary> public string Password { get { return _Password; } set { _Password = value; } }
private bool _TrustedConnection = false; /// <summary> /// Указывает, использовать ли trusted connection при подсоединении к Sql Server /// </summary> public bool TrustedConnection { get { return _TrustedConnection; } set { _TrustedConnection = value; } }
private bool _UseExistingDatabase = false; /// <summary> /// Указывает, использовать ли существующую БД /// </summary> public bool UseExistingDatabase { get { return _UseExistingDatabase; } set { _UseExistingDatabase = value; } } #endregion
#region создание connection string
public string BuildConnectionString() { if(this.TrustedConnection) return string.Format(SqlHelper.TRUSTED_CONN_STRING_FORMAT, Instance, Database); else return string.Format(SqlHelper.NOTTRUSTED_CONN_STRING_FORMAT, Instance, Database, UserName, Password); }
#endregion
}
public enum ConnTestEnum { Success, GenericFail, DBExists, DBNotFound }
/// <summary> /// Внутренний класс для выполнения операций с Sql Server'ом с /// помощью SQLDMO /// </summary> public class SqlHelper { public const string NOTTRUSTED_CONN_STRING_FORMAT = "server={0};Trusted_Connection=false;database={1};uid={2};pwd={3}", TRUSTED_CONN_STRING_FORMAT = "server={0};Trusted_Connection=true;database={1};uid=;pwd=", DEFAULT_DB_NAME = "master"; #region проверка возможности подключения к Sql Server'у /// <summary> /// Проверяет, возможно ли подключиться к Sql Server'у /// </summary> /// <param name="options"></param> /// <returns>False в случае неудачи, иначе True</returns> public static ConnTestEnum TestConnection(SqlServerOptions options) { SqlConnection conn = new SqlConnection(); string dbname = string.Empty; ConnTestEnum result = ConnTestEnum.Success; if(options.UseExistingDatabase) dbname = options.Database; else dbname = DEFAULT_DB_NAME;
if(options.TrustedConnection) conn.ConnectionString = string.Format(TRUSTED_CONN_STRING_FORMAT, options.Instance, dbname); else conn.ConnectionString = string.Format(NOTTRUSTED_CONN_STRING_FORMAT, options.Instance, dbname, options.UserName, options.Password);
try { conn.Open();
// если человек выбрал режим "don't use existing database", то // необходимо убедиться, что такой БД нет на сервере, иначе будут // ошибки if(dbname == DEFAULT_DB_NAME) { conn.Close(); conn.ConnectionString = options.BuildConnectionString();
try { conn.Open(); result = ConnTestEnum.DBExists; } catch(SqlException) { result = ConnTestEnum.Success; } } return result; } catch(SqlException ex) { if(ex.ToString().IndexOf("Cannot open database requested in login") > 0) return ConnTestEnum.DBNotFound; else return ConnTestEnum.GenericFail; } catch(Exception) { throw; } finally { if(conn.State == ConnectionState.Open) conn.Close();
conn.Dispose(); } } #endregion
#region проверка существования SQL-DMO /// <summary> /// Проверяет, установлена ли на машине биб-ка SQL-DMO /// </summary> /// <returns></returns> public static bool CheckSQLDMO() { try { SQLDMO.SQLServer2Class server = new SQLDMO.SQLServer2Class(); server = null; return true; } catch(COMException) { return false; } }
#endregion #region Connect/Disconnect /// <summary> /// Подсоединяется к Sql Server'у /// </summary> /// <param name="options"></param> /// <returns></returns> public static SQLDMO.SQLServer2Class Connect(SqlServerOptions options) { SQLDMO.SQLServer2Class server = new SQLDMO.SQLServer2Class();
server.LoginSecure = options.TrustedConnection;
try { if(options.TrustedConnection) server.Connect(options.Instance, null, null); else server.Connect(options.Instance, options.UserName, options.Password); } catch(COMException) { return null; }
return server; }
/// <summary> /// Отсоединяется от Sql Server'а /// </summary> /// <param name="server"></param> public static void Disconnect(SQLDMO.SQLServer2Class server) { if(server != null) server.DisConnect(); }
#endregion
#region пакетные операции private static Exception _LastError = null; public static System.Exception LastError { get { return _LastError; } }
public enum BatchOperationResult { Success, DBNotFound, CantConnect, Exception, SyntaxError, DBExists }
public const uint ERR_DBNOTFOUND = 0x8004038F, ERR_INVALID_SYNTAX = 0x8004009C, ERR_DB_ALREADY_EXISTS = 0x80040709;
/// <summary> /// Выполняет пакетный скрипт с помощью SQLDMO /// </summary> /// <param name="options"></param> /// <param name="batchText"></param> /// <returns></returns> public static BatchOperationResult ExecuteBatch(SqlServerOptions options, string batchText) { try { SQLDMO.SQLServer2Class server = Connect(options);
if(server == null) return BatchOperationResult.CantConnect;
if(options.UseExistingDatabase) { SQLDMO._Database db = server.Databases.Item(options.Database, null);
if(db == null) return BatchOperationResult.DBNotFound;
db.ExecuteImmediate(batchText, SQLDMO.SQLDMO_EXEC_TYPE.SQLDMOExec_Default, batchText.Length); } else server.ExecuteImmediate(batchText, SQLDMO.SQLDMO_EXEC_TYPE.SQLDMOExec_Default, batchText.Length);
Disconnect(server);
return BatchOperationResult.Success; } catch(COMException ex) { switch((uint)ex.ErrorCode) { case ERR_DBNOTFOUND: return BatchOperationResult.DBNotFound; case ERR_INVALID_SYNTAX: return BatchOperationResult.SyntaxError; case ERR_DB_ALREADY_EXISTS: return BatchOperationResult.DBExists; default: _LastError = ex; return BatchOperationResult.Exception; } } }
#endregion
#region список серверов, баз, поиск БД EP /// <summary> /// Возвращает список доступых Sql Server'ов /// </summary> /// <remarks> /// В случае, если на текущей машине не установлен по крайней мере Sp2 для Sql Server 2000, /// метод возвращает null /// </remarks> /// <returns></returns> public static string[] GetServerList() { try { SQLDMO.ApplicationClass app = new SQLDMO.ApplicationClass(); SQLDMO.NameList nameList = app.ListAvailableSQLServers();
ArrayList names = new ArrayList(); foreach (string server in nameList) names.Add(server);
string[] srvList = new string[names.Count]; names.CopyTo(srvList, 0);
app = null; return srvList; } catch(InvalidCastException) // pre-SP2 Sql Server generates exception (QueryInterface failed) { return null; } }
/// <summary> /// Получает список баз данных на Sql Server'e /// </summary> /// <param name="options"></param> /// <returns>null в случае, если невозможно приконнектиться к Sql Server'у</returns> public static string[] GetDatabaseList(SqlServerOptions options) { ArrayList result = new ArrayList();
SQLDMO.SQLServer2Class server = Connect(options);
if(server != null) { foreach (SQLDMO._Database db in server.Databases) result.Add(db.Name);
Disconnect(server);
string[] dbList = new string[result.Count]; result.CopyTo(dbList, 0);
return dbList; } else return null; }
#endregion
#region создание новой БД public static bool CreateDatabase(SqlServerOptions options, string batchText) { SQLDMO.SQLServer2Class server = Connect(options);
SQLDMO.Database2Class db = new SQLDMO.Database2Class(); db.Name = options.Database; server.Databases.Add((SQLDMO._Database2)db);
db.ExecuteImmediate(batchText, SQLDMO.SQLDMO_EXEC_TYPE.SQLDMOExec_ContinueOnError, batchText.Length); return true; } #endregion
}
|
P.S. Я достал его из своего проекта, поэтому если вдруг сюда попала ссылка на какой-то другой класс, то метод, в котором она встречается, тебе не понадобится. AntonSaburov, IMHO, в том форуме вряд-ли дадут ответ, который сможет сразу заработать в .NET. Добавлено @ 16:29 Правда, тут нету метода для получения списка таблиц. Но все это есть в SQL-DMO. RTFM SQL Server Books Online
|