gpt4 book ai didi

c++ - 长度未知时如何在 SQL Server 中存储 varbinary(max) 和 varchar(max) 数据(使用 C++ ODBC)

转载 作者:行者123 更新时间:2023-12-02 10:31:15 26 4
gpt4 key购买 nike

如何存放varbinary(max)varchar(max)使用 C++ ODBC API 的列。这里有什么建议吗?

我正在使用 SQL Server native 客户端。

我是使用按列绑定(bind) 绑定(bind)参数数组.这里的目的是一次准备语句并一次插入/更新多行以提高性能。我从这个链接得到了一个示例代码,
https://docs.microsoft.com/en-us/sql/odbc/reference/develop-app/binding-arrays-of-parameters?view=sql-server-ver15

还找到了这个链接,其中给出了 SQLPutData 的使用。
https://docs.microsoft.com/en-us/sql/odbc/reference/syntax/sqlputdata-function?view=sql-server-ver15
但在此链接中,示例是使用 给出的SQL_LEN_DATA_AT_EXEC 列的长度在编译时是已知的 . 当之前不知道数据长度或同一列的数据长度每行都发生变化时,应该如何解决 . 在这种情况下我们应该如何绑定(bind)这些列?

我尝试通过 SQL_SS_LENGTH_UNLIMITED 作为 列大小参数 SQLBindPaameter 但这甚至无法编译。

我还尝试将 0 作为 columnSize 参数传递给 SQLBindParameter,希望它能以某种方式工作,但这也不起作用。

我有一个名为“Parts”的表,其中 2 列中有 5 列是 varchar(MAX)我正在尝试插入 3 行。下面是我的代码。我有 TEXTSIZE 定义为 12000 .由于我的示例应用程序数据长度不会超过 12000,因此我暂时使用此值。但在实际应用程序中,数据可能比这更大。

示例应用程序代码

SQLBindParameter(hstmt1, 1, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 5, 0,
PartIDArray, 0, PartIDIndArray);
SQLBindParameter(hstmt1, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, DESC_LEN - 1, 0,
DescArray, DESC_LEN, DescLenOrIndArray);
SQLBindParameter(hstmt1, 3, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 7, 0,
PriceArray, 0, PriceIndArray);
retcode = SQLBindParameter(hstmt1, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, TEXTSIZE, 0,
(VOID *)4, 0, cbTextSize);
retcode = SQLBindParameter(hstmt1, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, TEXTSIZE, 0,
(VOID *)5, 0, cbTextSize1);

for (i = 0; i < ARRAY_SIZE; i++) {
//GetNewValues(&PartIDArray[i], DescArray[i], &PriceArray[i]);
std::cout << "Enter the value for PartID(integer)" << std::endl;
std::cin >> PartIDArray[i];
std::cout<< std::endl;

std::cout << "Enter the value for description(string)" << std::endl;
std::cin >> DescArray[i];
std::cout << std::endl;

std::cout << "Enter the value for price(integer)" << std::endl;
std::cin >> PriceArray[i];
std::cout << std::endl;

PartIDIndArray[i] = 0;
DescLenOrIndArray[i] = SQL_NTS;
PriceIndArray[i] = 0;

cbTextSize[i] = SQL_DATA_AT_EXEC;
cbTextSize1[i] = SQL_DATA_AT_EXEC;
}

retcode = SQLPrepare(hstmt1, (SQLCHAR*)TEXT("INSERT INTO Parts (PartID, Description, Price, memo, memo1) VALUES (?, ?, ?, ?, ?)"), SQL_NTS);
// Execute the statement.
retcode = SQLExecute(hstmt1);
if ((retcode != SQL_SUCCESS) && (retcode != SQL_NEED_DATA) && (retcode != SQL_SUCCESS_WITH_INFO)) {
printf("SQLExecDirect Failed\n\n");
Cleanup();
return(9);
}
PTR pParmID;
int index1 = -1;
for (i = 0; i < 6; i++)
{
if (i % 2 == 0)
index1++;

retcode = SQLParamData(hstmt1, &pParmID);
size_t index = ((size_t)pParmID) - 4;
char* data = Data[index][index1];
lbytes = strlen(data);
if (retcode == SQL_NEED_DATA) {
while (lbytes > 256) {
retcode = SQLPutData(hstmt1, (SQLPOINTER)data, 256);
lbytes -= 256;
}
// Put final batch.
retcode = SQLPutData(hstmt1, (SQLPOINTER)data, lbytes);
}

if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO)) {
printf("SQLParamData Failed\n\n");
Cleanup();
return(9);
}
}


// Make final SQLParamData call.
retcode = SQLParamData(hstmt1, &pParmID);
if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO)) {
printf("Final SQLParamData Failed\n\n");
Cleanup();
return(9);
}

如果我们对此有任何解决方案,请告诉我。

最佳答案

如果我没记错的话,我已经使用 SQLDescribeParam Function 从数据源动态查询了该信息。 .

而且,如果我没记错的话,如果你只想传输你感兴趣的二进制值 Transfer Octet Length , 而如果你想得到一个字符串的结果,你可能想得到 Display Size .

抱歉,我不记得细节了,但我很确定动态获取所需大小的入口点在这些页面上:

  • SQLDescribeParam: https://docs.microsoft.com/en-us/sql/odbc/reference/syntax/sqldescribeparam-function?view=sql-server-ver15
  • 列大小、十进制数字、传输八位字节长度和显示大小:https://docs.microsoft.com/en-us/sql/odbc/reference/appendixes/column-size-decimal-digits-transfer-octet-length-and-display-size?view=sql-server-ver15

  • 注意驱动程序作为结果代码返回的内容 - 一些数据库/驱动程序不支持提前计算这些值,因此您需要测试您想要支持的每个数据库/驱动程序。
    祝你好运

    关于c++ - 长度未知时如何在 SQL Server 中存储 varbinary(max) 和 varchar(max) 数据(使用 C++ ODBC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62148064/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com