package xugu import ( "database/sql/driver" "encoding/binary" "errors" "fmt" "reflect" "time" ) type xuguRows struct { rows_conn *xuguConn results *SelectResult colIdx int prepared bool } func (row *xuguRows) Next(dest []driver.Value) error { gt("Next()") defer gt("Next() end") fmt.Println("rowIdx", row.results.rowIdx, len(row.results.Values[0])) if row.results.rowIdx >= len(row.results.Values[0]) { return errors.New("The result set has been released") } // fmt.Println(" -- int(row.results.Field_Num)", int(row.results.Field_Num)) fmt.Printf("这个 %#v", row.results.Values) for j := 0; j < int(row.results.Field_Num); j++ { coluType := row.results.Fields[j].FieldType //fmt.Println(" --coluType: ", coluType, row.results.Fields[j].typeDatabaseName()) switch coluType { case fieldType_DATE: case fieldType_BINARY, fieldType_CLOB, fieldType_BLOB: dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data case fieldType_TIME, fieldType_TIME_TZ: tv, _ := time.Parse("15:04:05", string(row.results.Values[j][row.results.rowIdx].Col_Data)) dest[j] = tv case fieldType_DATETIME, fieldType_DATETIME_TZ: tv, _ := time.Parse("2006-01-02 15:04:05", string(row.results.Values[j][row.results.rowIdx].Col_Data)) dest[j] = tv case fieldType_I1: dest[j] = int8(row.results.Values[j][row.results.rowIdx].Col_Data[0]) case fieldType_I4: dest[j] = binary.LittleEndian.Uint32(reverseBytes(row.results.Values[j][row.results.rowIdx].Col_Data)) case fieldType_CHAR: dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data default: //填入一行的数据 //TODO这里长度改为一行长度 dest[j] = make([]byte, len(row.results.Values)) // Values[字段][0] dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data } } row.results.rowIdx++ return nil } // Columns返回列的名字集,它的个数是从slice的长度中推断出来的。 // 如果不知道特定的列名,应该为该条目返回一个空的字符串 func (row *xuguRows) Columns() []string { gt("Columns()") defer gt("Columns() end") var columns []string for i, v := range row.results.Fields { columns = append(columns, v.FieldName) fmt.Printf("append(columns, v.FieldName) 个数%d ,v: %s\n", i+1, columns[i]) } return columns } func (row *xuguRows) ColumnTypeScanType(index int) reflect.Type { fmt.Println(">>>>>ColumnTypeScanType ") fmt.Printf(" -- row.results.Fields %#v \n", row.results.Fields[index].FieldType) fmt.Printf(" -- row.results.Fields %#v \n", row.results.Fields[index].scanType()) return row.results.Fields[index].scanType() } func (self *xuguRows) Close() error { fmt.Println(">>>>>((self *xuguRows) Close() ") return nil }