Я делаю массовую копию программных переменных в таблицу SQL Server 2005, и я использую bcp_bind
а также bcp_sendrow
в приложении C ++
Однако некоторые целочисленные столбцы в таблице позволяют null
ценности. Я не совсем уверен, как я должен отправлять null
значения во время выполнения, используя bcp_sendrow
когда возникает необходимость отправить null
значение для одного из столбцов.
Документация на bcp_bind
говорит:
Массовое копирование строки на сервер, содержащей значение NULL для привязки
столбце, значение элемента iIndicator экземпляра должно быть установлено в
SQL_NULL_DATA
Однако это все еще не проясняет ситуацию. Я должен иметь 2 разных звонка bcp_sendrow
: один для ненулевого случая и другой для нулевого случая?
Интерфейс массового копирования SQL-сервера имеет два различных метода объявления нулевых значений:
Вы можете указать SQL_NULL_DATA в качестве параметра cbData для bcp_bind. Это указывает на то, что все строки, отправленные на сервер, будут иметь значение NULL
Вы можете использовать переменную-индикатор, чтобы сказать, когда столбец содержит целое число и когда он содержит NULL. Чтобы сделать это, вам нужно выделить свободное место непосредственно перед вашим int для 64-битной индикаторной переменной. Документация показывает это в небольшой структуре, например:
typedef struct tagBCPBOUNDINT
{
__int64 iIndicator;
int Value;
} BCPBOUNDINT;
(Я изменил iIndicator на явное 64-битное целое число здесь; важно, чтобы оно не было короче.)
Когда вы вызываете bcp_bind, вы указываете на структуру, а не на значение, и указываете, что используете 8-байтовый индикатор и длина данных является переменной.
bcp_bind(hdbc, &local_struct, 8, SQL_VARLEN_DATA, NULL, 0, SQLINT4, colIndex);
Чтобы отправить строку с данными в этом столбце, задайте для iIndicator размер целочисленного поля (4) и укажите значение в поле «Значение». Если столбец должен быть нулевым, установите для iIndicator значение SQL_NULL_DATA и не беспокойтесь о значении:
if (my_int_is_null) {
local_struct.iIndicator = SQL_NULL_DATA;
} else {
local_struct.iIndicator = sizeof(int);
local_struct.Value = my_int_value;
}
/* Fill the rest of the columns in a similar way */
/* ... */
/* finally, queue the row */
bcp_sendrow(hdbc);
Других решений пока нет …