From 9ed5ee9526d36df8d5b96fd461c08c7c56e1dc04 Mon Sep 17 00:00:00 2001
From: znone <glyc@sina.com.cn>
Date: Sat, 15 Apr 2017 09:32:33 +0000
Subject: [PATCH] 支持返回多结果集的查询

---
 include/qtl_odbc.hpp |   31 +++++++++++++++++++++++--------
 1 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/include/qtl_odbc.hpp b/include/qtl_odbc.hpp
index e021ef6..99a4c49 100644
--- a/include/qtl_odbc.hpp
+++ b/include/qtl_odbc.hpp
@@ -358,7 +358,7 @@
 				text[p.m_indicator]='\0';
 			}
 		};
-		verify_error(SQLBindCol(m_handle, index+1, SQL_C_CHAR, v, n-1, &m_params[index].m_indicator));
+		verify_error(SQLBindCol(m_handle, index+1, SQL_C_CHAR, v, n, &m_params[index].m_indicator));
 	}
 	void bind_field(SQLUSMALLINT index, wchar_t* v, size_t n)
 	{
@@ -373,20 +373,20 @@
 				text[p.m_indicator]='\0';
 			}
 		};
-		verify_error(SQLBindCol(m_handle, index+1, SQL_C_WCHAR, v, n-1, &m_params[index].m_indicator));
+		verify_error(SQLBindCol(m_handle, index+1, SQL_C_WCHAR, v, n, &m_params[index].m_indicator));
 	}
-	template<typename CharType>
-	void bind_field(SQLUSMALLINT index, std::basic_string<CharType>&& v)
+	template<typename T>
+	void bind_field(SQLUSMALLINT index, qtl::bind_string_helper<T>&& v)
 	{
 		SQLLEN length=0;
 		SQLColAttribute(m_handle, index+1, SQL_DESC_LENGTH, NULL, 0, NULL, &length);
-		v.resize(length);
-		bind_field(index, const_cast<char*>(v.data()), v.size()+1);
-		m_params[index].m_after_fetch=[&v](const param_data& p) {
+		typename qtl::bind_string_helper<T>::char_type* data=v.alloc(length);
+		bind_field(index, data, length+1);
+		m_params[index].m_after_fetch=[v](const param_data& p) mutable {
 			if(p.m_indicator==SQL_NULL_DATA)
 				v.clear();
 			else
-				v.resize(p.m_indicator);
+				v.truncate(p.m_indicator);
 		};
 	}
 	template<size_t N>
@@ -516,6 +516,21 @@
 		return false;
 	}
 
+	bool next_result()
+	{
+		SQLRETURN ret;
+		SQLSMALLINT count=0;
+		m_binded_cols=false;
+		do
+		{
+			ret=SQLMoreResults(m_handle);
+			if(ret==SQL_ERROR || ret==SQL_INVALID_HANDLE)
+				verify_error(ret);
+			verify_error(SQLNumResultCols(m_handle, &count));
+		}while(count==0);
+		return ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO;
+	}
+
 	SQLLEN affetced_rows()
 	{
 		SQLLEN count=0;

--
Gitblit v1.9.3