goProject/trunk/goutil/dbUtil/dataTable.go
皮蛋13361098506 1b77f62820 初始化项目
2025-01-06 16:01:02 +08:00

190 lines
4.3 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package dbUtil
import (
"database/sql"
"errors"
)
// 数据表结构
type DataTable struct {
// 行对象集合
rowData []*DataRow
// 列名称集合
columnNames map[string]int
}
// 数据表初始化
// rows:原始的数据行信息
// 返回值:
// error:初始化的错误信息
func (this *DataTable) init(rows *sql.Rows) error {
defer func() {
rows.Close()
}()
// 读取列信息和保存列名称
tmpColumns, errMsg := rows.Columns()
if errMsg != nil {
return errMsg
}
this.columnNames = make(map[string]int)
for index, val := range tmpColumns {
this.columnNames[val] = index
}
// 读取行数据
this.rowData = make([]*DataRow, 0)
columnCount := len(this.columnNames)
args := make([]interface{}, columnCount)
for rows.Next() {
values := make([]interface{}, columnCount)
for i := 0; i < columnCount; i++ {
args[i] = &values[i]
}
rows.Scan(args...)
this.rowData = append(this.rowData, newDataRow(this, values))
}
return nil
}
// 获取原始单元格值(一般为:string或[]byte
// rowIndex:行序号
// cellIndex:单元格序号
// 返回值:
// interface{}:原始单元格值(一般为:string或[]byte
// error:获取错误信息
func (this *DataTable) OriginCellValueByIndex(rowIndex int, cellIndex int) (interface{}, error) {
if len(this.rowData) <= rowIndex {
return nil, errors.New("row out of range")
}
rowItem := this.rowData[rowIndex]
if len(rowItem.cells) <= cellIndex {
return nil, errors.New("column out of range")
}
return rowItem.OriginCellValue(cellIndex)
}
// 获取原始单元格值(一般为:string或[]byte
// rowIndex:行序号
// cellIndex:单元格序号
// 返回值:
// interface{}:原始单元格值(一般为:string或[]byte
// error:获取错误信息
func (this *DataTable) OriginCellValueByCellName(rowIndex int, cellName string) (interface{}, error) {
if len(this.rowData) <= rowIndex {
return nil, errors.New("row out of range")
}
rowItem := this.rowData[rowIndex]
return rowItem.OriginCellValueByName(cellName)
}
// 获取字符串的单元格值有可能为nil
// rowIndex:行序号
// cellIndex:单元格序号
// 返回值:
// interface{}:字符串的单元格值有可能为nil
// error:获取错误信息
func (this *DataTable) CellValueByIndex(rowIndex int, cellIndex int) (interface{}, error) {
if len(this.rowData) <= rowIndex {
return nil, errors.New("row out of range")
}
rowItem := this.rowData[rowIndex]
if len(rowItem.cells) <= cellIndex {
return nil, errors.New("column out of range")
}
return rowItem.CellValue(cellIndex)
}
// 获取字符串的单元格值有可能为nil
// rowIndex:行序号
// cellIndex:单元格序号
// 返回值:
// interface{}:字符串的单元格值有可能为nil
// error:获取错误信息
func (this *DataTable) CellValueByName(rowIndex int, cellName string) (interface{}, error) {
if len(this.rowData) <= rowIndex {
return nil, errors.New("row out of range")
}
rowItem := this.rowData[rowIndex]
return rowItem.CellValueByName(cellName)
}
// 获取行对象
// rowIndex:行序号
// 返回值:
// *DataRow:行对象
// error:错误信息
func (this *DataTable) Row(rowIndex int) (*DataRow, error) {
if len(this.rowData) <= rowIndex {
return nil, errors.New("row out of range")
}
return this.rowData[rowIndex], nil
}
// 根据列名获取列序号
// cellName:列名
// 返回值:
// int:列序号
func (this *DataTable) cellIndex(cellName string) int {
cellIndex, isExist := this.columnNames[cellName]
if isExist == false {
return -1
}
return cellIndex
}
// 获取所有列的名字
// 返回值:
// []string:列字段名集合
func (this *DataTable) Columns() []string {
result := make([]string, len(this.columnNames))
for key, val := range this.columnNames {
result[val] = key
}
return result
}
// 获取列数量
// 返回值:
// int:列数量
func (this *DataTable) ColumnCount() int {
return len(this.columnNames)
}
// 获取数据行数
// 返回值:
// int:行数
func (this *DataTable) RowCount() int {
return len(this.rowData)
}
// 新建数据表对象
// rows:数据行对象
// 返回值:
// *DataTable:数据表对象
// error:错误信息
func NewDataTable(rows *sql.Rows) (*DataTable, error) {
table := &DataTable{}
errMsg := table.init(rows)
if errMsg != nil {
return nil, errMsg
}
return table, nil
}