def prepare(self, query_string):
"""prepare a query"""
#self._free_results(FREE_STATEMENT)
if not self.connection:
self.close()
if type(query_string) == unicode:
c_query_string = wchar_pointer(UCS_buf(query_string))
ret = ODBC_API.SQLPrepareW(self.stmt_h, c_query_string, len(query_string))
else:
c_query_string = ctypes.c_char_p(query_string)
ret = ODBC_API.SQLPrepare(self.stmt_h, c_query_string, len(query_string))
if ret != SQL_SUCCESS:
check_success(self, ret)
self._PARAM_SQL_TYPE_LIST = []
if self.connection.support_SQLDescribeParam:
# SQLServer's SQLDescribeParam only supports DML SQL, so avoid the SELECT statement
if True:# 'SELECT' not in query_string.upper():
#self._free_results(NO_FREE_STATEMENT)
NumParams = c_short()
ret = ODBC_API.SQLNumParams(self.stmt_h, ADDR(NumParams))
if ret != SQL_SUCCESS:
check_success(self, ret)
for col_num in range(NumParams.value):
ParameterNumber = ctypes.c_ushort(col_num + 1)
DataType = c_short()
ParameterSize = ctypes.c_size_t()
DecimalDigits = c_short()
Nullable = c_short()
ret = ODBC_API.SQLDescribeParam(
self.stmt_h,
ParameterNumber,
ADDR(DataType),
ADDR(ParameterSize),
ADDR(DecimalDigits),
ADDR(Nullable),
)
if ret != SQL_SUCCESS:
try:
check_success(self, ret)
except DatabaseError:
if sys.exc_info()[1].value[0] == '07009':
self._PARAM_SQL_TYPE_LIST = []
break
else:
raise sys.exc_info()[1]
except:
raise sys.exc_info()[1]
self._PARAM_SQL_TYPE_LIST.append((DataType.value,DecimalDigits.value))
self.statement = query_string
评论列表
文章目录