Набор данных C # для доступа к базе данных - PullRequest
6 голосов
/ 10 ноября 2011

У меня есть набор данных, который динамически создается из файла CSV. Я хочу вставить строки в таблицу MS Access, но не могу понять, с чего начать.

Заголовки данных в наборе данных могут различаться в зависимости от порядка, но имя заголовка всегда будет соответствовать базе данных доступа. Нужно ли статически вызывать имя заголовка в команде вставки или я могу построить заголовки из набора данных?

Я знаю, как создать соединение и открыть его для базы данных, но не уверен, как создать команду вставки для динамического извлечения заголовков таблицы.

Я довольно зеленый, когда речь заходит о программировании на C #, так что если вы можете объяснить это мне, я был бы очень признателен!

Вот пример заголовков таблицы доступа:

ID, пункт, стоимость, розничная торговля

Тогда CSV, который будет заполнять таблицу наборов данных. У него может быть Retail или нет:

Товар, стоимость

Вот код, который у меня есть, но он не записывается в таблицу доступа. Если я прошью dtAccess, он будет отображаться правильно.

 OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\"C:\\Database.accdb\";Persist Security Info=False;");
                myConnection.Open();

                string queryString = "SELECT * from " + lblTable.Text;

                OleDbDataAdapter adapter = new OleDbDataAdapter(queryString, myConnection);

                DataTable dtAccess = new DataTable();

                DataTable dtCSV = new DataTable();

                dtCSV = ds.Tables[0];

                using (new OleDbCommandBuilder(adapter))
                {
                    adapter.Fill(dtAccess);
                    dtAccess.Merge(dtCSV);
                    adapter.Update(dtAccess);
                }

                myConnection.Close();

Ответы [ 3 ]

4 голосов
/ 12 ноября 2011

Разобрался. Вот код, который я использовал:

OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\"Database.accdb\";Persist Security Info=False;");

                //command to insert each ASIN
                OleDbCommand cmd = new OleDbCommand();

                //command to update each column (ASIN, Retail... from CSV)
                OleDbCommand cmd1 = new OleDbCommand();

                //load csv data to dtCSV datatabe
                DataTable dtCSV = new DataTable();

                dtCSV = ds.Tables[0];

                // Now we will collect data from data table and insert it into database one by one
                // Initially there will be no data in database so we will insert data in first two columns
                // and after that we will update data in same row for remaining columns
                // The logic is simple. 'i' represents rows while 'j' represents columns

                cmd.Connection = myConnection;
                cmd.CommandType = CommandType.Text;
                cmd1.Connection = myConnection;
                cmd1.CommandType = CommandType.Text;

                myConnection.Open();

                for (int i = 0; i <= dtCSV.Rows.Count - 1; i++)
                {
                    cmd.CommandText = "INSERT INTO " + lblTable.Text + "(ID, " + dtCSV.Columns[0].ColumnName.Trim() + ") VALUES (" + (i + 1) + ",'" + dtCSV.Rows[i].ItemArray.GetValue(0) + "')";

                    cmd.ExecuteNonQuery();

                    for (int j = 1; j <= dtCSV.Columns.Count - 1; j++)
                    {
                        cmd1.CommandText = "UPDATE " + lblTable.Text + " SET [" + dtCSV.Columns[j].ColumnName.Trim() + "] = '" + dtCSV.Rows[i].ItemArray.GetValue(j) + "' WHERE ID = " + (i + 1);

                        cmd1.ExecuteNonQuery();
                    }
                }

                myConnection.Close();
0 голосов
/ 10 ноября 2011

Если два объекта данных имеют одинаковую структуру, вы можете объединить объект "CSV" с данными из таблицы базы данных, поэтому, например, вы можете извлечь таблицу базы данных в таблицу данных с помощью адаптера данных:

string queryString =   "SELECT * FROM sometable";
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);
DataTable dtAccess = new DataTable();
adapter.Fill(dtAccess);

, затем вы можете объединить содержимое этой таблицы данных с содержимым таблицы данных CSV:

dtAccess.Merge(dtCSV);

После этого вы можете записать содержимое таблицы данных в таблицу базы данных доступа с помощьюсборщик команд:

 using (new SqlCommandBuilder(adapter)) {
adapter.Update(dtAccess);
}

Если таблицы данных имеют одинаковую структуру, они должны работать без проблем ...

0 голосов
/ 10 ноября 2011

Access имеет скрытые таблицы, которые предоставляют базе данных доступ к таблицам и столбцам в базе данных. Их имена зависят от версии доступа, но обычно они похожи на systables? Это было давно, но если вы «покажете скрытые таблицы», вы сможете найти их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...