如何解决使用SQLBindCol是否可以提高VARCHAR max的ODBC性能?
我已经在应用程序中开发了一个简单的ODBC接口,该接口允许通过SQL语句查询任意数据,并将数据集传递给应用程序。
这是通过获取数据集,使用ERROR o.a.tomcat.jdbc.pool.ConnectionPool
- Unable to create initial connections of pool.
com.microsoft.sqlserver.jdbc.SQLServerException: Cannot login with Kerberos principal my_user,check your credentials. Kerberos Login failed: Integrated authentication failed. ClientConnectionId:2ee0b176-ebf7-46fe-91af-b16dead75108 due to javax.security.auth.login.LoginException (connect timed out)
at com.microsoft.sqlserver.jdbc.KerbAuthentication.intAuthInit(KerbAuthentication.java:100)
at com.microsoft.sqlserver.jdbc.KerbAuthentication.generateClientContext(KerbAuthentication.java:207)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.sendLogon(SQLServerConnection.java:4979)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.logon(SQLServerConnection.java:3988)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.access$000(SQLServerConnection.java:85)
at com.microsoft.sqlserver.jdbc.SQLServerConnection$LogonCommand.doExecute(SQLServerConnection.java:3932)
迭代光标并通过SQLFetchScroll
读取数据来实现的。通过一次调用,即可处理固定长度的数据类型,例如SQLGetData
和int
。它还适用于具有变量的数据类型,并且通过调用循环可能会产生非常大的数据。
以下是此方法的示例代码:
double
这原则上可行,但是会导致很多小的TCP程序包,当带宽受限时,这可能会成为问题。我知道可以对属性for (SQLReturn status = SQLFetchScroll(hStmt,SQL_FETCH_FIRST,0); SQL_SUCCEEDED(status); status = SQLFetchScroll(hStmt,SQL_FETCH_NEXT,0))
{
for (int nCol=1; nCol<=nCols; ++nCol)
{
switch(type)
{
case SQL_INTEGER:
::SQLGetData(hStmt,nCol,...);
break;
case SQL_DOUBLE:
::SQLGetData(hStmt,...);
break;
case SQL_WCHAR:
case SQL_WVARCHAR:
case SQL_WLONGVARCHAR:
{
wstring strData;
do
{
SQLLEN od;
BYTE byteBuffer[1024];
status = ::SQLGetData(hStmt,SQL_WCHAR,byteBuffer,sizeof(byteBuffer),&od);
if (status != SQL_SUCCESS_WITH_INFO && status != SQL_SUCCESS)
return false;
if (od != SQL_NULL_DATA)
strData += (wchar_t*)m_byteBuffer;
}
while (status == SQL_SUCCESS_WITH_INFO);
}
break;
}
}
使用SQLBindCol
甚至SQLSetStmtAttr
来绑定完整的数组的可能性。这样可以有效地减少TCP软件包的数量。
但是,我找不到通过这种方法正确处理SQL_ATTR_ROW_ARRAY_SIZE
类型的方法。像上面我的代码示例一样,是否唯一可能使它们免于绑定并通过NVARCHAR(MAX)
读取它们?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。