/// <summary>
        /// Runs a sql query and returns results as requested type
        /// </summary>
        /// <param name="cmd">VerticaCommand to run</param>
        /// <param name="timeout">Query timeout</param>
        /// <returns>DataTable object representing the result</returns>
        internal DataTable SqlQuery(VerticaCommand cmd, int?timeout = null)
        {
            int    commandTimeout = timeout ?? Config.QueryTimeout;
            string connStr        = buildConnString();

            using (VerticaConnection conn = new VerticaConnection(connStr)) {
                conn.Open();

                cmd.Connection     = conn;
                cmd.CommandTimeout = commandTimeout;

                LogCommand(cmd);
                DataSet            ds = new DataSet();
                VerticaDataAdapter da = new VerticaDataAdapter(cmd);
                //this is where the query is run
                da.Fill(ds);

                //return the result, which is the first DataTable in the DataSet
                return(ds.Tables[0]);
            }
        }
        public DataTable GetDataTable(string query, Dictionary <string, object> parameters = null)
        {
            DataTable dataTable = new DataTable();

            if (!IsConnectionOpened())
            {
                return(dataTable);
            }

            try {
                using (VerticaCommand command = new VerticaCommand(query, connection)) {
                    if (parameters != null && parameters.Count > 0)
                    {
                        foreach (KeyValuePair <string, object> parameter in parameters)
                        {
                            command.Parameters.Add(new VerticaParameter(parameter.Key, parameter.Value));
                        }
                    }

                    using (VerticaDataAdapter fbDataAdapter = new VerticaDataAdapter(command))
                        fbDataAdapter.Fill(dataTable);
                }
            } catch (Exception e) {
                string subject = "Ошибка выполнения запроса к БД";
                string body    = e.Message + Environment.NewLine + e.StackTrace;
                SystemMail.SendMail(subject, body, Properties.Settings.Default.MailCopy);
                Logging.ToLog(subject + " " + body);
                connection.Close();

                if (bw != null)
                {
                    bw.ReportProgress(0, subject + " " + body);
                }
            }

            return(dataTable);
        }