/// <summary> /// Удаляет все данные по условию. /// </summary> /// <param name="tablename">Имя таблицы</param> /// <param name="where">Строка условий, начинающихся с WHERE</param> /// <param name="parameters">Список параметров</param> /// <returns>Код ошибки. Если 0, ошибки нет</returns> public int Delete(string tablename, string where, ParametersCollection parameters) { //если не задано имя таблицы if (string.IsNullOrEmpty(tablename)) { //выходим из метода return 1; } if (!string.IsNullOrEmpty(tablename) && !where.ToLower().Trim().StartsWith("where")) { where = "WHERE " + where; } string sql = string.Format("DELETE FROM {0} {1}", tablename, where); ConnectionState previousConnectionState = ConnectionState.Closed; try { previousConnectionState = connect.State; if (connect.State == ConnectionState.Closed) { connect.Open(); } using (command = new SQLiteCommand(sql, connect)) { foreach (Parameter iparam in parameters) { //добавляем новый параметр command.Parameters.Add(iparam.ColumnName.StartsWith("@") ? iparam.ColumnName : "@" + iparam.ColumnName, iparam.DbType).Value = Convert.IsDBNull(iparam.Value) ? Convert.DBNull : iparam.Value; } lastQuery = command.CommandText; command.ExecuteNonQuery(); } } catch (Exception error) { lastError = string.Format("Ошибка при удалении данных из таблицы {0}!\nМетод: Delete(string tablename, string where, ParametersCollection parameters)\nТекст запроса: {1}\n{2}", tablename, lastQuery, error.Message); return 1; } finally { if (previousConnectionState == ConnectionState.Closed) { connect.Close(); } } return 0; }
/// <summary> /// Перезаписывает данные в выбранной таблице. /// </summary> /// <param name="tablename">Имя таблицы</param> /// <param name="collection">Коллекция полей и значений</param> /// <param name="where">Строка условия</param> /// <returns>Код ошибки. Если 0, ошибки нет</returns> public int Update(string tablename, ParametersCollection collection, string where) { return Update(tablename, collection, new[] { where }, ""); }
/// <summary> /// Перезаписывает данные в выбранной таблице. /// </summary> /// <param name="tablename">Имя таблицы</param> /// <param name="collection">Коллекция полей и значений</param> /// <param name="whereparams">Набор условий</param> /// <param name="whereseparator">Разделитель между условиями OR или AND</param> /// <returns>Код ошибки. Если 0, ошибки нет</returns> public int Update(string tablename, ParametersCollection collection, object[] whereparams, string whereseparator) { //если не задано имя таблицы if (string.IsNullOrEmpty(tablename)) { //выходим из метода return 1; } ConnectionState previousConnectionState = ConnectionState.Closed; try { //проверяем переданные аргументы if (whereparams.Length == 0) throw (new ExceptionWarning("Ошибка! Не указано ни одно условие")); if (whereparams.Length > 1 && whereseparator.Trim().Length == 0) throw (new ExceptionWarning("При использовании нескольких условий требуется указать разделитель OR или AND")); previousConnectionState = connect.State; if (connect.State == ConnectionState.Closed) { connect.Open(); } int i = 0; //готовим переменную для сбора полей и их значений StringBuilder sql_params = new StringBuilder(); bool ifFirst = true; using (command = new SQLiteCommand(connect)) { //в цикле создаем строку запроса foreach (Parameter param in collection) { if (ifFirst) { sql_params.Append(param.ColumnName + " = @param" + i); ifFirst = false; } else { sql_params.Append("," + param.ColumnName + " = @param" + i); } //и добавляем параметры с таким же названием command.Parameters.Add("@param" + i, param.DbType).Value = Convert.IsDBNull(param.Value) ? Convert.DBNull : param.Value; i++; } //условия для запроса StringBuilder sql_where = new StringBuilder(); ifFirst = true; //собираем строку с условиями foreach (object item in whereparams) { if (ifFirst) { sql_where.Append(item.ToString()); ifFirst = false; } else { sql_where.Append(" " + whereseparator + " " + item); } } //собираем запрос воедино lastQuery = command.CommandText = string.Format("UPDATE {0} SET {1} {2}", tablename, sql_params, "WHERE " + sql_where.ToString()); //выполняем запрос command.ExecuteNonQuery(); } } catch (ExceptionWarning message) { lastError = string.Format("Ошибка при обновлении данных в таблице {0}!\nМетод: Update(string tablename, ParametersCollection collection, object[] whereparams, string whereseparator)\nТекст запроса: {1}\n{2}", tablename, lastQuery, message.MessageText); return 1; } catch (Exception error) { lastError = string.Format("Ошибка при обновлении данных в таблице {0}!\nМетод: Update(string tablename, ParametersCollection collection, object[] whereparams, string whereseparator)\nТекст запроса: {1}\n{2}", tablename, lastQuery, error.Message); return 2; } finally { if (previousConnectionState == ConnectionState.Closed) { connect.Close(); } } return 0; }
/// <summary> /// Вставляет несколько записей в таблицу. /// </summary> /// <param name="tablename">Имя таблицы</param> /// <param name="parametersCollection">Массив параметров/записей</param> /// <returns>Возвращает 0, если удачно</returns> public int InsertMany(string tablename, ParametersCollection[] parametersCollection) { //если не задано имя таблицы if (string.IsNullOrEmpty(tablename)) { //выходим из метода return 1; } ConnectionState previousConnectionState = ConnectionState.Closed; try { previousConnectionState = connect.State; if (connect.State == ConnectionState.Closed) { connect.Open(); } using (command = new SQLiteCommand(connect)) { foreach (ParametersCollection parameters in parametersCollection) { bool ifFirst = true; StringBuilder queryColumns = new StringBuilder("("); //список полей, в которые вставляются новые значения StringBuilder queryValues = new StringBuilder("("); //список значений для этих полей foreach (Parameter iparam in parameters) { //добавляем новый параметр command.Parameters.Add("@" + iparam.ColumnName, iparam.DbType).Value = Convert.IsDBNull(iparam.Value) ? Convert.DBNull : iparam.Value; //собираем колонки и значения в одну строку if (ifFirst) { queryColumns.Append(iparam.ColumnName); queryValues.Append("@" + iparam.ColumnName); ifFirst = false; } else { queryColumns.Append("," + iparam.ColumnName); queryValues.Append(",@" + iparam.ColumnName); } } queryColumns.Append(")"); queryValues.Append(")"); //создаем новый запрос string sql = string.Format("INSERT INTO {0} {1} VALUES {2}", tablename, queryColumns, queryValues); lastQuery = command.CommandText = sql; command.ExecuteNonQuery(); } } } catch (Exception error) { lastError = string.Format("Ошибка при вставке новой записи в таблицу {0}!\nМетод: Insert(string tablename, ParametersCollection[] parametersCollection)\nТекст запроса: {1}\n{2}", tablename, lastQuery, error.Message); return 1; } finally { if (previousConnectionState == ConnectionState.Closed) { connect.Close(); } } return 0; }
/// <summary> /// Вернуть первую строку из полученных данных. /// </summary> /// <param name="query">Строка запроса</param> /// <param name="parameter">Коллекция параметров</param> /// <returns>Ассоциативный массив</returns> public Dictionary<string, object> FetchOneRow(string query, ParametersCollection parameters) { Dictionary<string, object> rowItem = new Dictionary<string, object>(); ConnectionState previousConnectionState = ConnectionState.Closed; try { previousConnectionState = connect.State; if (connect.State == ConnectionState.Closed) { connect.Open(); } using (command = new SQLiteCommand(query, connect)) { foreach (Parameter iparam in parameters) { //добавляем новый параметр command.Parameters.Add(iparam.ColumnName.StartsWith("@") ? iparam.ColumnName : "@" + iparam.ColumnName, iparam.DbType).Value = Convert.IsDBNull(iparam.Value) ? Convert.DBNull : iparam.Value; } lastQuery = command.CommandText; SQLiteDataReader reader = command.ExecuteReader(); if (reader.HasRows) { reader.Read(); for (int i = 0; i < reader.FieldCount; i++) { rowItem.Add(reader.GetName(i), reader[i]); } } } } catch (Exception error) { lastError = string.Format("Ошибка при получении из базы данных {0}!\nМетод: FetchOneRow(string query, ParametersCollection parameters)\nТекст запроса: {1}\n{2}", this.csb.DataSource, lastQuery, error.Message); return null; } finally { if (previousConnectionState == ConnectionState.Closed) { connect.Close(); } } return rowItem; }
/// <summary> /// Вернуть первую строку из полученных данных. /// </summary> /// <param name="select">Объект Select</param> /// <param name="parameters">Коллекция параметров</param> /// <returns>Ассоциативный массив</returns> public Dictionary<string, object> FetchOneRow(Select select, ParametersCollection parameters) { return FetchOneRow(select.SelectCommand, parameters); }
/// <summary> /// Выполняет переданный запрос в виде строки. /// </summary> /// <param name="query">Строка запроса</param> /// <param name="parameters">Коллекция параметров</param> /// <returns>Таблица с данными</returns> public DataTable Execute(string query, ParametersCollection parameters) { DataTable dt = new DataTable(); ConnectionState previousConnectionState = ConnectionState.Closed; try { previousConnectionState = connect.State; if (connect.State == ConnectionState.Closed) { connect.Open(); } using (command = new SQLiteCommand(query, connect)) { foreach (Parameter iparam in parameters) { //добавляем новый параметр command.Parameters.Add(iparam.ColumnName.StartsWith("@") ? iparam.ColumnName : "@" + iparam.ColumnName, iparam.DbType).Value = Convert.IsDBNull(iparam.Value) ? Convert.DBNull : iparam.Value; } using (SQLiteDataAdapter adapter = new SQLiteDataAdapter(command)) { lastQuery = command.CommandText; adapter.Fill(dt); } } } catch (Exception error) { lastError = string.Format("Ошибка при получении из базы данных {0}!\nМетод: Execute(string query, ParametersCollection parameters)\nТекст запроса: {1}\n{2}", this.csb.DataSource, lastQuery, error.Message); return null; } finally { if (previousConnectionState == ConnectionState.Closed) { connect.Close(); } } return dt; }
/// <summary> /// Выполняет запрос, созданный с помощью конструктора класса Select. /// </summary> /// <param name="query">Объект запроса</param> /// <param name="parameters">Коллекция параметров</param> /// <returns>Таблица с данными</returns> public DataTable Execute(Select select, ParametersCollection parameters) { return Execute(select.SelectCommand, parameters); }