SQL Server 2005 — Отправка нулевых значений в целочисленный столбец в таблице SQL из приложения C ++

Я делаю массовую копию программных переменных в таблицу SQL Server 2005, и я использую bcp_bind а также bcp_sendrow в приложении C ++

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

Документация на bcp_bind говорит:

Массовое копирование строки на сервер, содержащей значение NULL для привязки
столбце, значение элемента iIndicator экземпляра должно быть установлено в
SQL_NULL_DATA

Однако это все еще не проясняет ситуацию. Я должен иметь 2 разных звонка bcp_sendrow: один для ненулевого случая и другой для нулевого случая?

0

Решение

Интерфейс массового копирования SQL-сервера имеет два различных метода объявления нулевых значений:

  1. Вы можете указать SQL_NULL_DATA в качестве параметра cbData для bcp_bind. Это указывает на то, что все строки, отправленные на сервер, будут иметь значение NULL

  2. Вы можете использовать переменную-индикатор, чтобы сказать, когда столбец содержит целое число и когда он содержит 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);
    
0

Другие решения

Других решений пока нет …