none
загрузка dbf файла с разными структурами RRS feed

  • Вопрос

  • Добрый день! Есть 3 dbf файла с разными структурами. Например: table1.dbf (nomer1, nomer2), table2.dbf(nomer1, nomer2, nomer3), table3.dbf(nomer1, nomer2, nomer3, nomer4, nomer5). 
    protected void Execute(string fileName, string tableName, string extProp)
            {
                var dbConnection = new OleDbConnection(String.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties={1}", fileName, extProp));
                dbConnection.Open();
                try
                {
                    tableName 
                    var dbCommand = new OleDbCommand("SELECT * FROM " + tableName, dbConnection);
                    var dbReader = dbCommand.ExecuteReader();
                    
                        var name1 = dbReader.GetOrdinal("nomer1"); // Код района
                        var name2 = dbReader.GetOrdinal("nomer2"); // Шифр ПО
    
    
                        while (dbReader.Read())
                        {
                            var gos = dbReader.GetValue(name1).ToString(); //Лицевой счет//PostCode - поле-Шифр ПО
                            var kr = dbReader.GetValue(name2).ToString();
                           
                            LoadDbfToSQL(kr, gos);
                        }
                }
                finally
                {
                    dbConnection.Close();
                }
            }
    
    а как добавить table2, table3?

Ответы

  • Решение задачи:

    private const string PaidFileMask = "PORVYP*.DBF"; //поиск по маске
    private const string NotPaidFileMask = "PORNVP*.DBF";
    
    foreach (var filename in Directory.EnumerateFiles(FolderPath, PaidFileMask)) // loader.Start(filename);
    
    foreach (var filename in Directory.EnumerateFiles(FolderPath, NotPaidFileMask)) // loader.StartNotPaid(filename); 
    
                {
                   using (var loader = new Class1())
                    {
                        try
                        {
                            	loader.Start(filename);
    loader.StartNotPaid(filename); 
                            Console.WriteLine(String.Format("\"{0}\" file load complete.", filename));
    
    }
                        catch (Exception e)
                        {
                            Console.WriteLine(filename + " error: " + e.Message);
                        }
                       
                    }
                }
    Потом для каждой таблицы отдельный метод выборки(select) из DBF и вставки в таблицу SQL(insert).
    

    • Помечено в качестве ответа kgsprog 12 июня 2013 г. 5:32
    12 июня 2013 г. 5:31

Все ответы

  • Воспользуйтесь для примера обсуждением http://social.msdn.microsoft.com/Forums/ru-RU/programminglanguageru/thread/d4285aab-2545-4e1b-a61b-1fdce0cfe9b8 и переформулируйте свой вопрос, что бы он стал более понятным.

    Раздел Форума MSDN "Где задать вопрос", не совсем тот раздел в котором необходимо обсуждать Ваш вопрос, переношу его в более подходящий раздел.


    Да, я Жук, три пары лапок и фасеточные глаза :))


    • Изменено ЖукMVP 9 июня 2013 г. 8:58 внесение ясности
  • Есть много dbf файлы, с разными количествоми и покозателями полей. Задача состоит загрузаить их всех в одну таблицу в SQL и одним кодом. Например в следующем коде показано выборка с одного dbf файла

     protected void Execute(string fileName, string tableName, string extProp)
            {
                var dbConnection = new OleDbConnection(
                    String.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties={1}", fileName,
                                  extProp));
                dbConnection.Open();
                try
                {
                    var dbCommand = new OleDbCommand("SELECT * FROM " + tableName, dbConnection);
                    var dbReader = dbCommand.ExecuteReader(); //SqlDataReader
    
                    var raionCodeIndex = dbReader.GetOrdinal("KR"); // Код района  //SqlDataReader.GetOrdinal - Возвращает порядковый номер столбца при наличии заданного имени столбца.
                    var postCodeIndex = dbReader.GetOrdinal("GOS"); // Шифр ПО
                    var accountNoIndex = dbReader.GetOrdinal("NP"); // Номер лицевого счета
                    var sectionTypeIndex = dbReader.GetOrdinal("RAZDEL"); // Раздел (1, 2)
                    var periodDateIndex = dbReader.GetOrdinal("DPENS"); // Период выплаты
                    var amountIndex = dbReader.GetOrdinal("SUMMA"); // Сумма выплаты
                    var payDateIndex = dbReader.GetOrdinal("DVIP"); // Дата выплаты
    
                    while (dbReader.Read())
                    {
                        //Лицевой счет//PostCode - поле-Шифр ПО
                        var postCode = dbReader.GetValue(postCodeIndex).ToString();
                        //dbReader.GetValue - Возвращает значение заданного столбца в его исходном формате. 
                        var raionCode = dbReader.GetValue(raionCodeIndex).ToString();
                        var accountNo = dbReader.GetValue(accountNoIndex).ToString(); //accountNo- Номер //Лицевой счет
                        DateTime payDate;
                        if (!DateTime.TryParse(dbReader.GetValue(payDateIndex).ToString(), out payDate)) continue;
                        decimal amount;
                        if (!Decimal.TryParse(dbReader.GetValue(amountIndex).ToString(), out amount)) continue;
                        var sectionType = dbReader.GetValue(sectionTypeIndex).ToString();
                        DateTime periodDate;
                        if (!DateTime.TryParse(dbReader.GetValue(periodDateIndex).ToString(), out periodDate)) continue;
    
                        LoadActualPayment(raionCode, postCode, accountNo, payDate, sectionType, amount, periodDate);
                    }
                }
                finally
                {
                    dbConnection.Close();
                }
            }

    а здесь загрузка в SQL

    public void LoadDbfToSQL(string raionCode, string postCode, string accountNo, DateTime payDate, string sectionType, decimal amount, DateTime periodDate) 
            {
                if (conn.State == ConnectionState.Closed) conn.Open();
                try
                {
                    SqlCommand command = conn.CreateCommand();
                    command.CommandType = CommandType.Text;
                    command.CommandText = "INSERT INTO dbf_records (KR, GOS, NP, RAZDEL, DPENS, SUMMA, DVIP) " +
                                        			  "VALUES (@KR, @GOS, @NP, @RAZDEL, @DPENS, @SUMMA, @DVIP)";
                    {
                        command.Parameters.AddWithValue("@KR", raionCode);
                        command.Parameters.AddWithValue("@GOS", postCode);
    	  command.Parameters.AddWithValue("@NP", accountNo);                     
                        command.Parameters.AddWithValue("@RAZDEL", payDate);
                        command.Parameters.AddWithValue("@DPENS", sectionType);
                        command.Parameters.AddWithValue("@SUMMA", amount);
                        command.Parameters.AddWithValue("@DVIP", periodDate);
                        
                        command.ExecuteNonQuery();
                    }
                }
                catch(Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
    
    
    ВОПРОС: как добавть на эти же коды другие DBF  файлы?

     
    • Предложено в качестве ответа Да,да 10 июня 2013 г. 16:35
    9 июня 2013 г. 17:44
  •     public partial class _Default : Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {

            }

            protected void Button2_Click(object sender, EventArgs e)
            {
                LoadDbfToSQL("SOATO");
                /*
                LoadDbfToSQL("table1");
                LoadDbfToSQL("table2");
                LoadDbfToSQL("table3");
                */
            }

            private void LoadDbfToSQL(string sTableName)
            {
                string conn_string = "Data Source=bserver;Initial Catalog=CENSUS_2009_NEW;Integrated Security=True";
                SqlConnection con = new SqlConnection(conn_string);
                con.Open();
                SqlCommand com = new SqlCommand(" SELECT * FROM " + sTableName, con);
                com.CommandType = System.Data.CommandType.Text;
                SqlDataAdapter da = new SqlDataAdapter();
                da.SelectCommand = com;
                DataSet ds = new DataSet();
                da.Fill(ds);
                //----------------------------------------------------------
                SqlConnection con1 = new SqlConnection(conn_string);
                con1.Open();
                SqlCommand comInsert;
                foreach (DataRow r in ds.Tables[0].Rows)
                {
                    string sqlInsert = "";
                    sqlInsert = "Insert into temp1(col5) values('" + r[0].ToString() + "')";
                    comInsert = new SqlCommand(sqlInsert, con1);
                    comInsert.ExecuteNonQuery();
                }
            }
        }
    10 июня 2013 г. 16:36
  • Решение задачи:

    private const string PaidFileMask = "PORVYP*.DBF"; //поиск по маске
    private const string NotPaidFileMask = "PORNVP*.DBF";
    
    foreach (var filename in Directory.EnumerateFiles(FolderPath, PaidFileMask)) // loader.Start(filename);
    
    foreach (var filename in Directory.EnumerateFiles(FolderPath, NotPaidFileMask)) // loader.StartNotPaid(filename); 
    
                {
                   using (var loader = new Class1())
                    {
                        try
                        {
                            	loader.Start(filename);
    loader.StartNotPaid(filename); 
                            Console.WriteLine(String.Format("\"{0}\" file load complete.", filename));
    
    }
                        catch (Exception e)
                        {
                            Console.WriteLine(filename + " error: " + e.Message);
                        }
                       
                    }
                }
    Потом для каждой таблицы отдельный метод выборки(select) из DBF и вставки в таблицу SQL(insert).
    

    • Помечено в качестве ответа kgsprog 12 июня 2013 г. 5:32
    12 июня 2013 г. 5:31