Date: 17.09.2020 4:29:57
По поводу платной поддержки см. здесь: https://social.msdn.microsoft.com/Forums/security/ru-RU/d0bf48b8-4b8a-4fc5-b0f8-953172d269ae/105810771093108710861076107610771088107810821072?forum=msdnfeedbackru
Что касается bigint, тут проблема на нескольких уровнях
1. Нужен ли здесь вообще bigint? "номера сделок и номера ордеров" как бы намекает, что поле будет использоваться не для вычислений, а как идентификатор, поэтому вместо bigint подойдет обычное текстовое поле.
2. bigint не способен хранить все возможные 19-значные числа. Например, 9234556789012345678 уже не входит в диапазон. То есть идея сомнительная.
3. В ODBC bigint действительно не пашет, даже подключиться к базе нельзя. И почему - вопрос интересный. Могу подтвердить, что это не глюк Квика, а воспроизводиться и на минимальной программе на С++. Пробовал запускать следующий код:
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
#include <sqlext.h>
#include <locale.h>
WCHAR szDSN[] = L"Driver={Microsoft Access Driver (*.mdb, *.accdb)};DSN='';DBQ=C:\\Test\\Database2016.accdb";
WCHAR query[] = L"SELECT * FROM Table1";
void DisplayError(SQLSMALLINT t, SQLHSTMT h) {
SQLWCHAR SqlState[6], Msg[SQL_MAX_MESSAGE_LENGTH];
SQLINTEGER NativeError;
SQLSMALLINT i, MsgLen;
SQLRETURN rc;
SQLLEN numRecs = 0;
SQLGetDiagField(t, h, 0, SQL_DIAG_NUMBER, &numRecs, 0, 0);
// Get the status records.
i = 1;
while (i <= numRecs && (rc = SQLGetDiagRec(t, h, i, SqlState, &NativeError,
Msg, sizeof(Msg), &MsgLen)) != SQL_NO_DATA) {
wprintf(L"Error %d: %s\n", NativeError, Msg);
i++;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
HENV hEnv = NULL;
HDBC hDbc = NULL;
HSTMT hStmt = NULL;
int iConnStrLength2Ptr;
WCHAR szConnStrOut[256];
SQLINTEGER rowCount = 0;
SQLSMALLINT fieldCount = 0, currentField = 0;
SQLWCHAR buf[128], colName[128];
SQLINTEGER ret;
/* ODBC API return status */
RETCODE rc;
setlocale(LC_ALL, "Russian");
/* Allocate an environment handle */
rc = SQLAllocEnv(&hEnv);
/* Allocate a connection handle */
rc = SQLAllocConnect(hEnv, &hDbc);
/* Connect to the database */
rc = SQLDriverConnect(hDbc, NULL, (WCHAR*)szDSN,
SQL_NTS, (WCHAR*)szConnStrOut,
255, (SQLSMALLINT*)&iConnStrLength2Ptr, SQL_DRIVER_NOPROMPT);
if (SQL_SUCCEEDED(rc))
{
wprintf(L"Successfully connected to database. Data source name: \n %s\n",
szConnStrOut);
/* Prepare SQL query */
wprintf(L"SQL query:\n %s\n", query);
rc = SQLAllocStmt(hDbc, &hStmt);
rc = SQLPrepare(hStmt, (SQLWCHAR*)query, SQL_NTS);
/* Excecute the query */
rc = SQLExecute(hStmt);
if (SQL_SUCCEEDED(rc))
{
wprintf(L"\n- Columns -\n");
SQLNumResultCols(hStmt, &fieldCount);
if (fieldCount > 0)
{
for (currentField = 1; currentField <= fieldCount; currentField++)
{
SQLDescribeCol(hStmt, currentField,
colName, sizeof(colName), 0, 0, 0, 0, 0);
wprintf(L"%d: %s\n", (int)currentField, colName);
}
wprintf(L"\n");
/* Loop through the rows in the result set */
rc = SQLFetch(hStmt);
while (SQL_SUCCEEDED(rc))
{
wprintf(L"- Record #%d -\n", (int)rowCount);
for (currentField = 1; currentField <= fieldCount; currentField++)
{
rc = SQLGetData(hStmt, currentField, SQL_C_WCHAR, buf, sizeof(buf), &ret);
if (SQL_SUCCEEDED(rc) == FALSE) {
wprintf(L"%d: SQLGetData failed\n", (int)currentField);
continue;
}
if (ret <= 0) {
wprintf(L"%d: (no data)\n", (int)currentField);
continue;
}
wprintf(L"%d: %s\n", (int)currentField, buf);
}
wprintf(L"\n");
rc = SQLFetch(hStmt);
rowCount++;
};
rc = SQLFreeStmt(hStmt, SQL_DROP);
}
else
{
wprintf(L"Error: Number of fields in the result set is 0.\n");
}
}
else {
wprintf(L"SQL Failed\n");
DisplayError(SQL_HANDLE_STMT, hStmt);
}
}
else
{
wprintf(L"Couldn't connect to %s\n", szDSN);
DisplayError(SQL_HANDLE_DBC, hDbc);
}
/* Disconnect and free up allocated handles */
SQLDisconnect(hDbc);
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
getchar();
return 0;
}
Результат:
Couldn't connect to Driver={Microsoft Access Driver (*.mdb, *.accdb)};DSN='';DBQ=C:\Test\Database2016.accdbМожете эти данные скинуть в платную поддержку, если будете обращаться.
Стоит Access Database Engine 2016 (правда у меня 32-битный). Более новой версии не нашел. Ну то есть, Access 2019 то можно поставить, но драйвер ODBC то все равно ставиться отдельно (или нет)? Есть у кого купленный Office 2019?
Автор: VadimTagil