невозможно привязать программную переменную C к столбцу типа datetime в SQL Server - PullRequest
0 голосов
/ 13 октября 2011

Прямо сейчас используется вызов функции:

bcp_bind(hdbc1, (LPCBYTE)&dtime, 0, -1, (LPCBYTE) "", 1, SQLDATETIME, 5)

, где dttime - массив символов, содержащий значение datetime.Также попытался использовать тип TIMESTAMP_STRUCT.

Испытанные форматы даты и времени (значения даты и времени, указанные в файле данных):

mm/dd/yyyy hh:mm:ss.nnn
mm/dd/yyyy
yyyy-dd-mm hh:mm:ss.nnn
yyyy-dd-mm hh:mm:ss

Для всех случаев значения NULL вставляются в таблицу,

Вопросы, связанные с данной: Каким должен быть тип программной переменной при привязке типа данных datetime с использованием bcp API?Это может быть массив символов?Odbc api / SQL Server неявно способен конвертировать символьный тип в datetime?Если нет, предложите тип C, который можно использовать.

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Если у кого-то еще есть эта проблема, это то, что работает для меня:

bcp_bind(m_hdbc, (BYTE *)buffer, 4, sizeof(TIMESTAMP_STRUCT), 0, 0, SQLDATETIME2N, index);

И заполнение буфера выглядит так:

*(int*)buffer = sizeof(TIMESTAMP_STRUCT);

TIMESTAMP_STRUCT* datePtr = (TIMESTAMP_STRUCT*)((int*)buffer+1);

datePtr->year = value.Year();
datePtr->month = value.Month();
datePtr->day = value.Day();
datePtr->hour = value.Hour();
datePtr->minute = value.Minute();
datePtr->second = value.Second();
datePtr->fraction = value.Millisecond() * 1000000;
0 голосов
/ 13 октября 2011

Я думаю, что проблема в том, что ваш четвертый аргумент cbData -1. Это (по крайней мере, в моей системе) SQL_NULL_DATA, означающий, что все строки содержат NULL для этого столбца.

Что вам, вероятно, нужно, это sizeof(TIMESTAMP_STRUCT), предполагая, что dtime указывает на переменную данных этого типа.

Кроме того, я нигде не вижу SQLDATETIME. У меня есть SQL_DATETIME, но я не уверен, является ли это проблемой или разницей между платформами.

Я думаю, что пока вы устанавливаете свой eDataType, драйвер ODBC неплохо справляется с обработкой конверсий. Я только кратко изучил материал массового копирования, поэтому не уверен, есть ли здесь какое-либо отличие от стандартного ODBC, но для справки я обычно использую SQL_C_TYPE_TIMESTAMP и TIMESTAMP_STRUCT. Этот же C-тип хорошо работает для разных типов столбцов базы данных.

...