SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Microsoft SQL Server » Запись бинарных данных в поле VARBINARY(MAX) (Сохраняются не все данные, а только до 'x0')
Запись бинарных данных в поле VARBINARY(MAX) [сообщение #2156] Tue, 02 May 2023 12:22 Переход к следующему сообщению
ezus в настоящее время не в онлайне  ezus
Сообщений: 2
Зарегистрирован: May 2023
Junior Member
Добрый день.
Пытаюсь сохранить бинарные данные в поле типа VARBINARY(MAX).
Проблема: сохраняются не все данные, а только до '\x0'.

Программа на с++ в MS VStudio

Основной алгоритм:
CDbFta db; // CDatabase db;

int m_TreeID = ...;
int ipart = 1;
int szPart = 16;

char* buf = (char*)malloc(szData + 1);

... заполнение буфера

sql.Format("INSERT INTO Diagrams (treeId, partNb, size, part) VALUES(%d, %d, %d, ? );", m_TreeID, ipart, szPart);

db.setBindParameters((BYTE*)frBuf, szPart, sql);

db.ExecuteSQL(sql);
Класс CDbFta:
class CDbFta : public CDatabase
{
public:
	unsigned char*   m_pabImage;  // address of the data of the blob  //BYTE*
	int     m_nImageLen; // sizeof the data in the image, in bytes
	CString m_sStmt;     // looks like "UPDATE MyTable SET myFld=? WHERE idxFld=123"

public:
	virtual void BindParameters(HSTMT hstmt);
	void setBindParameters(BYTE* pabImage, int nImageLen, CString sStmt);

	void clearBindParameters();
	void ReadRawData(SQLHSTMT v_SearchHandleIndex, int fieldNb, void* _Raw, SQLINTEGER& RawInd);
};
void CDbFta::setBindParameters(BYTE* pabImage, int nImageLen, CString sStmt)
{
	m_pabImage = pabImage;  // buffer;
	m_nImageLen = nImageLen;
	m_sStmt = sStmt;
}
void CDbFta::BindParameters(HSTMT hstmt)
{
	SQLINTEGER nLenOrInd = m_nImageLen;  // use SQL_NTS only for null-terminated string data
	SQLRETURN  rc;

	if(m_sStmt == "" || m_sStmt.Find("?") == -1) return;

	rc = SQLBindParameter(
		hstmt, (SQLSMALLINT)1, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_VARBINARY,
		m_nImageLen, 0, (SQLPOINTER)m_pabImage, m_nImageLen, NULL);   // &nLenOrInd );
}
Вроде везде указано BINARY и BYTE*, но все равно '\x0' интерпретируется как конец данных.
Где ошибка, и Что можно с этим сделать?



[Обновления: Tue, 02 May 2023 12:31]

Известить модератора

Re: Запись бинарных данных в поле VARBINARY(MAX) [сообщение #2157 является ответом на сообщение #2156] Tue, 02 May 2023 12:30 Переход к предыдущему сообщениюПереход к следующему сообщению
ezus в настоящее время не в онлайне  ezus
Сообщений: 2
Зарегистрирован: May 2023
Junior Member
Пардон, не указал ,что программа на С++
Re: Запись бинарных данных в поле VARBINARY(MAX) [сообщение #2158 является ответом на сообщение #2157] Tue, 02 May 2023 14:19 Переход к предыдущему сообщению
SD в настоящее время в онлайне  SD
Сообщений: 411
Зарегистрирован: August 2022
Senior Member
RTFM https://learn.microsoft.com/en-us/sql/odbc/reference/syntax/ sqlbindparameter-function?view=sql-server-ver16
Цитата:
If StrLen_or_IndPtr is a null pointer, the driver assumes that all input parameter values are non-NULL and that character and binary data is null-terminated.
Предыдущая тема: Как на MS SQL Server 2012 Express очистить базу данных не зная пароля к ней?
Следующая тема: Нет удаленного подключения к инстанту
Переход к форуму:
  


Текущее время: Thu Nov 21 16:01:47 GMT+3 2024

Общее время, затраченное на создание страницы: 0.00664 секунд