Member 13798855 Ответов: 2

Проблема при копировании данных из SQL в mdb


у меня есть проблема с mdb и sql я хочу вставить данные из sql в mdb что я сделал :

1. созданная таблица в mdb с sql таблицей nd столбцов , типа и т. д
2.вставка каждый раз, как циклический набор записей sql и вставка в mdb.

проблема в том, что он занимает много времени, чтобы вставить из sql в mdb любое предложение или лучшее решение, Пожалуйста, дайте мне знать.

Что я уже пробовал:

for ( CXInt nFld = 0; nFld < (CXInt)pmatrecordset->NumRows(); nFld++ )
	{
		strInsertQuery = _T("");
		strColNames = _T(""), strColValues = _T("");
		strTemp = _T("");

		strInsertQuery = _T("INSERT INTO ");
		strInsertQuery += strTName;
		strColNames = _T("( ");

		strColNames = _T("( ");
		strColValues = _T(" VALUES (");

		for ( CXInt nColName = 0; nColName < (CXInt)pMat->NumCols(); nColName++ )
		{
			strColNames += pMat->GetColumnName(nColName);
			strColNames += _T(',');
		}

		strColNames = strColNames.TrimRight(',');
		strColNames += _T(" ) ");

		for ( CXInt nCol = 0; nCol < (CXInt)pMat->NumCols(); nCol++ )
		{
			strTemp.Format(_T("\"%s\""), str);
			strColValues += strTemp;
			strColValues += _T(',');
		}

		strColValues = strColValues.TrimRight(',');
		strColValues += _T(" ) ");

		strInsertQuery += strColNames;
		strInsertQuery += strColValues;
	//inserting to mfdb
	}

CHill60

Во-первых, вы не должны создавать запрос путем объединения строк.
Если вы знаете формат таблицы, просто используйте параметризованный запрос.
Однако, похоже, что это должно быть общим - в этом случае используйте StringBuilder вместо "добавления" в конец строк - строки неизменяемы (не могут быть изменены), поэтому вы фактически создаете новую строку каждый раз, когда используете +=

Member 13798855

probelm-это iam, вставляющий каждый раз ...это вызывает проблему

CHill60

Смотрите комментарий Ричарда Деминга. Или вы можете подключиться к базе данных SQL в базе данных Access и связать ее с таблицами. Если вам абсолютно необходимо иметь копию таблицы на mdb, то напишите простой запрос доступа по строкам

Select * into Accesstable from sqltable

CHill60

Еще одна мысль - попробуйте обновить его до более современной версии Access, которая использует суффикс .accdb.

Richard Deeming

Вы можете использовать либо мастер импорта в Access, либо мастер экспорта данных из SQL:
Экспорт базы данных Sql Server 2008 в базу данных MS Access - переполнение стека[^]

2 Ответов

Рейтинг:
1

Jochen Arndt

Предполагая, что вы используете CString вы уже сделали это правильно, определив строки вне циклов и назначив пустые строки вместо вызова Empty() что освободит память.

Так что память о том, что CString объекты должны быть перераспределены только в случае необходимости. Однако вы можете предварительно выделить память для всех строк, используя Preallocate() с соответствующими размерами.

Другие оптимизации заключаются в перемещении не связанных со строкой частей из цикла строк и избегании вызовов к ним. Format() и Trim():

// Prepare the begin of the query string which is the same for all rows
strQuery = _T("INSERT INTO ");
strQuery += strTName;
strQuery += _T(" ( ");
for ( CXInt nCol = 0; nCol < (CXInt)pMat->NumCols(); nCol++ )
{
    if (nCol)
        strQuery += _T(',');
    strQuery += pMat->GetColumnName(nCol);
}
strQuery += _T(" ) VALUES ( ");

for ( CXInt nFld = 0; nFld < (CXInt)pmatrecordset->NumRows(); nFld++ )
{
    strColValues = "";
    for ( CXInt nCol = 0; nCol < (CXInt)pMat->NumCols(); nCol++ )
    {
        if (nCol)
            strColValues += _T(',');
        strColValues += _T('"');
        // Where is str assigned in your code?
        strColValues += str;
        strColValues += _T('"');
    }
    strColValues += _T(" ) ");
    strInsertQuery = strQuery;
    strInsertQuery += strColValues;
}
Тогда большая часть времени выполнения должна приходиться на операции с базой данных. Они также могут быть оптимизированы с помощью параметризованных команд, как уже предлагалось в комментариях.

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


Рейтинг:
0

Gerry Schmitz

Зачем беспокоиться? MS Access может "связываться" с таблицами SQL Server (среди прочего).