package xugu // /查询结果:driver.Rows import ( "database/sql/driver" "fmt" "reflect" ) // type Row struct { // // Data information storage carrier of each column in the result set // columns []FieldDescri // // The name of each column in the result set of the current query // names []string // done bool // } type xuguRows struct { // A context handle pointer, which can be used to obtain // information about the result set //result unsafe.Pointer results *SelectResult // The return value of the function cgo_xgc_read_next() lastRowRelt int // The return value of the function cgo_xgc_next_result() lastRelt int // Boolean value, used to identify whether the executed // SQL statement has been prepared prepared bool // Context connection handle pointer rows_conn *xuguConn //rowset Row } // Next用于把数据集中的下一行填入提供的slice中。该slice的 // 长度应该跟Columns()的长度一致 // // 当没有数据行时,Next应该返回io.EOF // // dest不应被声明在Next之外(应该作为Next的一个成员变量) // 关闭Rows时应特别注意,不要修改dest中缓冲区的值 func (row *xuguRows) Next(dest []driver.Value) error { fmt.Println(">>>>>(self *xuguRows) Next() ") fmt.Println(" -- int(row.results.Field_Num)", int(row.results.Field_Num)) 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 fieldTypeDate: case fieldTypeBinary, fieldTypeLob, fieldTypeClob, fieldTypeBlob: case fieldTypeTime, fieldTypeTimeTZ: case fieldTypeDatetime, fieldTypeDatetimeTZ: default: fmt.Println(" ----(self *xuguRows) Next() default ") dest[j] = make([]byte, len(row.results.Values)) dest[j] = row.results.Values[j][0].Col_Data fmt.Println(" dest[j]:", dest[j]) fmt.Println(" row.results.Values[j][0].Col_Data:", string(row.results.Values[j][0].Col_Data)) } } fmt.Println(" -dest: ", dest) return nil } // Columns返回列的名字集,它的个数是从slice的长度中推断出来的。 // 如果不知道特定的列名,应该为该条目返回一个空的字符串 func (row *xuguRows) Columns() []string { fmt.Println(">>>>>(self *xuguRows) Columns() ") // if row.results == nil { // return nil // } // if row.results.Fields != nil { // //return self.results.Fields // } //columns := make([]string, int(row.results.Field_Num)) var columns []string fmt.Println("字段总数row.results.Field_Num", int(row.results.Field_Num)) for i, v := range row.results.Fields { columns = append(columns, v.FieldName) fmt.Println("ppend(columns, v.FieldName)", i, columns[i]) } fmt.Println(" -columns len ", len(columns)) for i, v := range columns { fmt.Println(" -columns: ", i, v) } return columns } func (row *xuguRows) ColumnTypeScanType(index int) reflect.Type { fmt.Println(">>>>>ColumnTypeScanType ") fmt.Printf(" -- row.results.Fields %#v \n", row.results.Fields) return row.results.Fields[index].scanType() } func (self *xuguRows) Close() error { fmt.Println(">>>>>((self *xuguRows) Close() ") return nil }