powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибка [Microsoft][driver ODBC Paradox]В операции должен использоваться обновляемый запрос
1 сообщений из 1, страница 1 из 1
Ошибка [Microsoft][driver ODBC Paradox]В операции должен использоваться обновляемый запрос
    #33422924
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Экспортирую таблицу из Оракловской базы в Парадокс.
Таблица создается нормально... Одна запись пишется нормально...
А при записи второй возникает вот эта ошибка:
Ошибка [Microsoft][driver ODBC Paradox]В операции должен использоваться обновляемый запрос
Вот код.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
SQLRETURN CreateLocalTable(SQLHANDLE& hDbc, SQLHANDLE& hLocalDbc, wchar_t* tableName)
{
	SQLINTEGER cb;
	SQLHSTMT hStmt1, hStmt2, hStmt3, hStmt4;
	wchar_t query1[ 1024 ];
	wchar_t query2[ 1024 ];
	wchar_t query3[ 1024 ];
	wchar_t query4[ 1024 ];
	wchar_t columnName[ 256 ];
	wchar_t dataType[ 128 ];
	hStmt1 = hStmt2 = hStmt3 = hStmt4 = SQL_NULL_HSTMT;
	SQLRETURN retVal = SQL_SUCCESS;

	LONG longVal[ 20 ];
	STR_PARAM strVal[ 20 ];
	TIMESTAMP_STRUCT timestampVal[ 20 ];
	double doubleVal[ 20 ];
	int Types[ 128 ];
	int sInd, tInd, lInd, dInd; 
	int numColumns =  0 ;	

/////
	SQLWCHAR       SqlState[ 6 ], Msg[SQL_MAX_MESSAGE_LENGTH];
	SQLINTEGER    NativeError;
	SQLSMALLINT   MsgLen;


	::ZeroMemory(strVal, sizeof(strVal));
	::ZeroMemory(timestampVal, sizeof(timestampVal));
	::ZeroMemory(longVal, sizeof(longVal));
	::ZeroMemory(doubleVal, sizeof(doubleVal));

	int curStrInd, curTimestampInd, curLongInd, curDoubleInd;
	curStrInd = curTimestampInd = curLongInd = curDoubleInd =  0 ;

	if (!SQL_SUCCEEDED(retVal = SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt1)))
		goto end;

	wcsupr(tableName);
// Получение имен и типов столбцов импортируемой таблицы. Игнорируются столбцы длиноой > MAX_DATA_LENGTH и типа BLOB
	wcscpy(query1, L"SELECT COLUMN_NAME, DATA_TYPE FROM ALL_TAB_COLUMNS WHERE TABLE_NAME='");
	wcscat(query1, tableName);
	wcscat(query1, L"' AND DATA_TYPE<>'BLOB' AND DATA_LENGTH<");
	_itow(MAX_DATA_LENGTH, &query1[wcslen(query1)],  10 );

	if (!(retVal = SQL_SUCCEEDED(::SQLExecDirect(hStmt1, query1,  1024 )) &&
		(retVal = SQL_SUCCEEDED(retVal = SQLAllocHandle(SQL_HANDLE_STMT, hLocalDbc, &hStmt2)))))
		goto end;

// Создание локального образа и макетов запросов для импорта данных
	wcscpy(query2, L"CREATE TABLE ");
	wcscpy(&query2[ 13 ], tableName);
	wcscat(&query2[ 13 ], L"(");

	wcscpy(query3, L"SELECT ");

	wcscpy(query4, L"INSERT INTO ");
	wcscpy(&query4[ 12 ], tableName);
	wcscat(query4, L" (");

	while (SQL_SUCCEEDED(retVal = SQLFetch(hStmt1)))
	{
		if (!(SQL_SUCCEEDED(retVal = SQLGetData(hStmt1,  1 , SQL_C_TCHAR, columnName,  256 , &cb)) &&
			SQL_SUCCEEDED(retVal = SQLGetData(hStmt1,  2 , SQL_C_TCHAR, dataType,  256 , &cb))))
			goto end;
		if (numColumns)
		{
			wcscat(query2, L",");
			wcscat(query3, L",");
			wcscat(query4, L",");
		}
		wcscat(query2, columnName);
		wcscat(query2, L" ");
		wcscat(query3, columnName);
		wcscat(query4, columnName);

		for (int i =  0 ; i < NUM_CONVERTION_TYPES; i++)
		{
			if (!wcscmp(dataType, conv_ora2para[i][ 0 ]))
			{
				wcscat(query2, conv_ora2para[i][ 1 ]);
				Types[numColumns] = i;
				break;
			}
		}
		if (i >= NUM_CONVERTION_TYPES)
		{
			retVal = 0x101;
			goto end;
		}
		numColumns++;
	}
	wcscat(query2, L")");
	wcscat(query3, L" FROM ");
	wcscat(query3, tableName);
	wcscat(query4, L") VALUES(");

	size_t len = wcslen(query4);
	for (int i =  0 ; i < numColumns; i++)
	{
		if (i)
			query4[len++] = L',';
		query4[len++] = L'?';
	}
	query4[len++] = L')'; query4[len] =  0 ;

// Создание локальной таблицы
	if (!(SQL_SUCCEEDED(retVal = SQLAllocHandle(SQL_HANDLE_STMT, hLocalDbc, &hStmt2))))
	{
		int i =  1 ;
		while ((SQLGetDiagRec(SQL_HANDLE_DBC, hLocalDbc, i, SqlState, &NativeError, Msg, sizeof(Msg), &MsgLen)) != SQL_NO_DATA) {
			::MessageBox(NULL, Msg, L"Error", MB_OK | MB_ICONERROR);
						i++;
					}
		goto end;
	}
	if (!(SQL_SUCCEEDED(retVal = ::SQLExecDirect(hStmt2, query2, SQL_NTS))))
	{
		int i =  1 ;
		while ((SQLGetDiagRec(SQL_HANDLE_DBC, hLocalDbc, i, SqlState, &NativeError, Msg, sizeof(Msg), &MsgLen)) != SQL_NO_DATA) {
			::MessageBox(NULL, Msg, L"Error", MB_OK | MB_ICONERROR);
						i++;
					}
		goto end;
	}

// Запрос импортируемых данных
	if (!(SQL_SUCCEEDED(retVal = SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt3)) &&
		  SQL_SUCCEEDED(::SQLExecDirect(hStmt3, query3, SQL_NTS))))
		goto end;

// Получение импортируемых данных и запись их в локальную таблицу

	while (SQL_SUCCEEDED(retVal = SQLFetch(hStmt3)))
	{
		lInd = sInd = tInd = dInd =  1 ;
// Настройка ODBC для записи в локальную таблицу
		if (!(SQL_SUCCEEDED(retVal = SQLAllocHandle(SQL_HANDLE_STMT, hLocalDbc, &hStmt4)) &&
			SQL_SUCCEEDED(retVal = SQLPrepare(hStmt4, query4, SQL_NTS))))
			goto end;
		for (int i =  1 ; i <= numColumns; i++)
		{
			switch (Types[i -  1 ])
			{
			case NUMBER_TYPE:
				{
					if (!(SQL_SUCCEEDED(retVal = SQLGetData(hStmt3, i, SQL_C_LONG, &longVal[lInd],  0 , &cb)) &&
						SQL_SUCCEEDED(SQLBindParameter(hStmt4, i, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER,  0 ,  0 , &longVal[lInd],  0 , &cb))))
						goto end;
					lInd++;
					break;
				}
			case VARCHAR2_TYPE:
				{
					SQLINTEGER curLen;
					if (!(SQL_SUCCEEDED(retVal = SQLGetData(hStmt3, i, SQL_C_TCHAR, &strVal[sInd],  4096 , &cb)) &&
						SQL_SUCCEEDED(retVal = SQLBindParameter(hStmt4, i, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_LONGVARBINARY, curLen = (SQLINTEGER)((wcslen(strVal[sInd]) +  1 ) <<  1 ),  0 , &strVal[sInd], curLen, &cb))))
						goto end;
					sInd++;
					break;
				}
			case DATE_TYPE:
				{
					if (!(SQL_SUCCEEDED(retVal = SQLGetData(hStmt3, i, SQL_C_TIMESTAMP, &timestampVal[tInd],  0 , &cb)) &&
						SQL_SUCCEEDED(SQLBindParameter(hStmt4, i, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP,  0 ,  0 , &timestampVal[tInd],  0 , &cb))))
						goto end;
					tInd++;
					break;
				}
			case FLOAT_TYPE:
				{
					if (!(SQL_SUCCEEDED(retVal = SQLGetData(hStmt3, i, SQL_C_DOUBLE, &doubleVal[dInd],  0 , &cb)) &&
						SQL_SUCCEEDED(SQLBindParameter(hStmt4, i, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE,  0 ,  0 , &doubleVal[dInd],  0 , &cb))))
						goto end;
					dInd++;
					break;
				}
			}
		}
		if (!(SQL_SUCCEEDED(retVal) && SQL_SUCCEEDED(retVal = SQLExecute(hStmt4))))
		{
			int i =  1 ;
			while ((SQLGetDiagRec(SQL_HANDLE_STMT, hStmt4, i, SqlState, &NativeError, Msg, sizeof(Msg), &MsgLen)) != SQL_NO_DATA) {
				::MessageBox(NULL, Msg, L"Error", MB_OK | MB_ICONERROR);
							i++;
						}
			break;
		}
		if (hStmt4 != SQL_NULL_HSTMT)
		{
			SQLFreeHandle(SQL_HANDLE_STMT, hStmt4);
			hStmt4 = SQL_NULL_HSTMT;
		}
	}

end:
	if (hStmt1 != SQL_NULL_HSTMT)
		SQLFreeHandle(SQL_HANDLE_STMT, hStmt1);
	if (hStmt2 != SQL_NULL_HSTMT)
		SQLFreeHandle(SQL_HANDLE_STMT, hStmt2);
	if (hStmt3 != SQL_NULL_HSTMT)
		SQLFreeHandle(SQL_HANDLE_STMT, hStmt3);
	if (hStmt4 != SQL_NULL_HSTMT)
		SQLFreeHandle(SQL_HANDLE_STMT, hStmt4);
	return retVal;
}
Может кто знает в чем дело? Помогите плз...
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибка [Microsoft][driver ODBC Paradox]В операции должен использоваться обновляемый запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]