func (stmt *statement) bindByteArray(index int, value []byte, direction ParameterDirection) error { // Store both value and lenght, because we need a pointer to the lenght in // the last parameter of SQLBindParamter. Otherwise the data is assumed to // be a null terminated string. bindVal := &struct { value []byte length int }{ value, len(value), } sqlType := odbc.SQL_VARBINARY if bindVal.length > 4000 { sqlType = odbc.SQL_LONGVARBINARY } // Protect against index out of range on &bindVal.value[0] when value is zero-length. // We can't pass NULL to SQLBindParameter so this is needed, it will still // write a zero length value to the database since the length parameter is // zero. if bindVal.length == 0 { bindVal.value = []byte{'\x00'} } ret := odbc.SQLBindParameter(stmt.handle, odbc.SQLUSMALLINT(index), direction.SQLBindParameterType(), odbc.SQL_C_BINARY, sqlType, odbc.SQLULEN(bindVal.length), 0, odbc.SQLPOINTER(unsafe.Pointer(&bindVal.value[0])), 0, (*odbc.SQLLEN)(unsafe.Pointer(&bindVal.length))) if isError(ret) { return errorStatement(stmt.handle, fmt.Sprintf("Bind index: %v, Value: %v", index, value)) } return nil }
func (stmt *statement) bindBool(index int, value bool, direction ParameterDirection) error { stmt.bindValues[index] = &value ret := odbc.SQLBindParameter(stmt.handle, odbc.SQLUSMALLINT(index), direction.SQLBindParameterType(), odbc.SQL_C_BIT, odbc.SQL_BIT, 0, 0, odbc.SQLPOINTER(unsafe.Pointer(stmt.bindValues[index].(*bool))), 0, nil) if isError(ret) { return errorStatement(stmt.handle, fmt.Sprintf("Bind index: %v, Value: %v", index, value)) } return nil }
func (stmt *statement) bindNullParam(index int, paramType odbc.SQLDataType, direction ParameterDirection) error { nullDataInd := odbc.SQL_NULL_DATA stmt.bindValues[index] = &nullDataInd ret := odbc.SQLBindParameter(stmt.handle, odbc.SQLUSMALLINT(index), direction.SQLBindParameterType(), odbc.SQL_C_DEFAULT, paramType, 1, 0, 0, 0, &nullDataInd) if isError(ret) { return errorStatement(stmt.handle, fmt.Sprintf("Bind index: %v, Value: nil", index)) } return nil }
func (stmt *statement) bindDate(index int, value time.Time, direction ParameterDirection) error { var bindVal odbc.SQL_DATE_STRUCT bindVal.Year = odbc.SQLSMALLINT(value.Year()) bindVal.Month = odbc.SQLUSMALLINT(value.Month()) bindVal.Day = odbc.SQLUSMALLINT(value.Day()) stmt.bindValues[index] = &bindVal ret := odbc.SQLBindParameter(stmt.handle, odbc.SQLUSMALLINT(index), direction.SQLBindParameterType(), odbc.SQL_C_DATE, odbc.SQL_DATE, 10, 0, odbc.SQLPOINTER(unsafe.Pointer(stmt.bindValues[index].(*odbc.SQL_DATE_STRUCT))), 6, nil) if isError(ret) { return errorStatement(stmt.handle, fmt.Sprintf("Bind index: %v, Value: %v", index, bindVal)) } return nil }
func (stmt *statement) bindNumeric(index int, value float64, precision int, scale int, direction ParameterDirection) error { stmt.bindValues[index] = &value ret := odbc.SQLBindParameter(stmt.handle, odbc.SQLUSMALLINT(index), direction.SQLBindParameterType(), odbc.SQL_C_DOUBLE, odbc.SQL_DOUBLE, 0, 0, odbc.SQLPOINTER(unsafe.Pointer(stmt.bindValues[index].(*float64))), 0, nil) /* Must convert to SQL_NUMERIC_STRUCT for decimal to work - http://support.microsoft.com/kb/181254 ret := odbc.SQLBindParameter(stmt.handle, uint16(index), direction.SQLBindParameterType(), odbc.SQL_C_NUMERIC, odbc.SQL_DECIMAL, uint64(precision), int16(scale), uintptr(unsafe.Pointer(&bindVal)), 0, nil) odbc.SQLSetDescField(stmt.stmtDescHandle, odbc.SQLSMALLINT(index), odbc.SQL_DESC_TYPE, odbc.SQL_NUMERIC, 0) odbc.SQLSetDescField(stmt.stmtDescHandle, odbc.SQLSMALLINT(index), odbc.SQL_DESC_PRECISION, int32(precision), 0) odbc.SQLSetDescField(stmt.stmtDescHandle, odbc.SQLSMALLINT(index), odbc.SQL_DESC_SCALE, int32(scale), 0) */ if isError(ret) { return errorStatement(stmt.handle, fmt.Sprintf("Bind index: %v, Value: %v", index, value)) } return nil }
func (stmt *statement) bindString(index int, value string, length int, direction ParameterDirection) error { if length == 0 { length = len(value) } stmt.bindValues[index] = syscall.StringToUTF16(value) var sqlType odbc.SQLDataType if length < 4000 { sqlType = odbc.SQL_VARCHAR } else { sqlType = odbc.SQL_LONGVARCHAR } ret := odbc.SQLBindParameter(stmt.handle, odbc.SQLUSMALLINT(index), direction.SQLBindParameterType(), odbc.SQL_C_WCHAR, sqlType, odbc.SQLULEN(length), 0, odbc.SQLPOINTER(unsafe.Pointer(&stmt.bindValues[index].([]uint16)[0])), 0, nil) if isError(ret) { return errorStatement(stmt.handle, fmt.Sprintf("Bind index: %v, Value: %v", index, value)) } return nil }