none
C# access OLEDB RRS feed

  • Вопрос

  • Здравствуйте!

    Есть задачка - перебрать всю таблицу и ко всем колонкам применить функцию Replace из Acess. 

    Мой алгоритм:

    1. Просим у пользователя имя таблицы.

    2. Смотрим все колонки в таблице.

    3. Начинаем перебирает колонки, проверяем является ли колонка текстом и делаем конкатенацией запрос:

    "UPDATE " + tb_tablename.Text.Trim() + " SET [" + column.ColumnName + "] = Replace([" + column.ColumnName + "], Chr(10), \"\");";

    4. Выполняем сгенерированный sql запрос.

    5. Ожидание: запрос выполняется. Реальность: datatype mistmach in criteria exeption.

    Беру получившийся запрос выполняю в Access - выдаёт предупреждение что не может применить к некоторым данным и исполняет в остальных. Чяднт?

    Полный код:

    foreach (DataColumn column in dt.Columns)
    {
    	if (column.DataType == typeof(String))
    	{
    		if (column.ColumnName != "ID1" && column.ColumnName != "ID" && column.ColumnName != "Geometry" && column.ColumnName != "Geometry_SK")
    		{
    			string query = "UPDATE " + tb_tablename.Text.Trim() + " SET [" + column.ColumnName + "] = Replace([" + column.ColumnName + "], Chr(10), \"\");";
    
    			using (OleDbCommand cmd = new OleDbCommand(query, conn))
    			{
    				cmd.ExecuteNonQuery();
    			}
    		}
    	}
    }


    • Изменено Disabledg 18 ноября 2019 г. 7:24
    18 ноября 2019 г. 7:22

Все ответы

  • У меня работает. Структура таблицы:

    access

    Код:

    using System;
    using System.Data;
    using System.Data.OleDb;
    
    class Program
    {
        
        public static void Main()
        {
            
            string file = @"C:\Test\database1.mdb";
            string p = "Microsoft.ACE.OLEDB.12.0";
            string tablename = "Table1";
    
            OleDbConnectionStringBuilder b = new OleDbConnectionStringBuilder();
            b.Provider = p;
            b.DataSource = file;
            var constr = b.ConnectionString;
            OleDbConnection conn = new OleDbConnection(constr);
            
            using (conn)
            {
                conn.Open();
    
                OleDbCommand cmd = new OleDbCommand("SELECT * FROM Table1", conn);
                OleDbDataReader rdr = cmd.ExecuteReader();
                DataTable dt = new DataTable();
                dt.Load(rdr);
    
                foreach (DataColumn column in dt.Columns)
                {
                    if (column.DataType == typeof(String))
                    {
                        string query = "UPDATE " + tablename + " SET [" + column.ColumnName + "] = Replace([" + column.ColumnName + "], \".\", \"\");";
    
                        using (cmd = new OleDbCommand(query, conn))
                        {
                            int res = cmd.ExecuteNonQuery();
                            Console.WriteLine("Updated {0} records", res);
                        }
    
                    }
                }
            }
            
            Console.ReadKey();
        }
    }
    Выполняется бeз ошибок, символ заменяется.

    Что в вашем случае отличается? Провайдер ACE или Jet? Какие типы данных есть в таблице?


    20 ноября 2019 г. 9:14