@CrimsonFox

Как создать миграцию для всех файлов .dbf в выбранной папке?

Здравствуйте
Вопрос в следующем
у меня есть windows forms приложение, цель которого взять все файлы .dbf из папки и её подпапок и мигрировать их в оракл
и если для одного файла я смог это сделать (https://github.com/CrimsonFox-hub/dbf-to-oracle), то переработать так, чтобы программа брала в цикле все файлы и проделывала с ними текущую операцию не выходит
можете посоветовать как перенести выделенные фрагменты в start_button чтобы программа делала запланированное?
private void DBFLoad_Click(object sender, RoutedEventArgs e)
        {   
            FBD = new FolderBrowserDialog(); // создаем экземпляр FolderBrowserDialog

            if (FBD.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                dbfPath = FBD.SelectedPath;
                _DBF.Text = dbfPath; // Заполняем имя файла документа в TextBox 
                // openFile и saveFile надо переделать так, чтобы они не открывали окно выбора, а брали/создавали файлы в фоне
                openFile = new Microsoft.Win32.OpenFileDialog(); // создаем экземпляр OpenFileDialog
                openFile.Filter = "dbf файлы (*.dbf)";
                saveFile = new Microsoft.Win32.SaveFileDialog(); // создаем экземпляр SaveFileDialog
            }

            //перенос отсюда
                if (openFile.ShowDialog() == true)
            {
                dbfDirectory = dbfPath; // Добавляем путь к файлу в переменую
                dbfName = openFile.SafeFileName; // Добавляем имя файла в переменную 
            }
            openFile.Reset();
            _namefile = dbfName.Remove(dbfName.IndexOf('.')); // получаем имя файла без расширения
            saveFile.FileName = _namefile + "_asd_4321.sql"; // Имя сохраняемого файла  = Имя DBF файла + расширение *.SQL
            if (saveFile.ShowDialog() == true)
            {
                sqlDirectory = dbfPath; // путь к файлу 
                sqlName = "\\" + saveFile.SafeFileName; // имя файла
            }
            saveFile.Reset();
            // и до сюда

            if (dbfPath != null) 
            {
                _start.IsEnabled = true;
            }
        }


и ещё такой вопрос
struct Type_
        {
            public const string int_ = "NUMBER";
            //добавить вариативность varchar(n)
            public const string varchar_ = "VARCHAR2(255)";
            public const string Datetime_ = "DATE";
        }

        private StringBuilder str_; // StringBuilder для работы с строками
        private string newText_ = string.Empty; // Для создания нового текста 

        /// <summary>
        /// Преобрузет типы DBF в типы SQL 
        /// </summary>
        /// <param name="type">DBF тип в формате string</param>
        /// <returns></returns>
        public string ConvertType(string type)
        {
            switch (type)
            {
                case "Double":
                    return Type_.int_; // если пришел Double отправляем int
                case "String":
                    return Type_.varchar_; // если пришел String отправляем varchar(255)
                case "DateTime":
                    return Type_.Datetime_; // если пришел DateTime, отправляем datetime
            }
            return type;
        }

как можно переделать этот код, чтобы тот же варчар выбирал длинну в процессе, а не брал предопределенную

Заранее спасибо
  • Вопрос задан
  • 90 просмотров
Пригласить эксперта
Ответы на вопрос 1
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
private void Select(object sender, RoutedEventArgs e)
        {
            var ff = new FolderBrowserDialog();
            if (ff.ShowDialog() == DialogResult.OK)
            {
                
                foreach (var file in Directory.EnumerateFiles(ff.SelectedPath, "*.dbf"))
                {
                    var sqlFileName = file.Remove(file.IndexOf('.')) + "_asd_34.sql";
                    // тут вызываете конвертор
                    DbfToSql(file, sqlFileName);
                }
            }
        }


switch (type)
            {
                case "Double":
                    return Type_.int_; // если пришел Double отправляем int
                case "String":
 // но как узнать длину строк? Возможно нужно пробежаться по всем данным и вычислить максимальную?
                    return "VARCHAR2(42)"; // если пришел String отправляем varchar(255)
                case "DateTime":
                    return Type_.Datetime_; // если пришел DateTime, отправляем datetime
            }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы