为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】: 8
【操作系统】:win10
【CPU】:
【问题描述】*:
开发时不知到查询那个表,有激烈,列的数据类型也不知道,如何出来返回结果。
比如 select * from tablename
rows.Scan(这参数如何定 ?)
//查询产品信息表
func queryTable() error {
var productid int
var name string
var author string
var description dm.DmClob
var photo dm.DmBlob
var sql = "SELECT productid,name,author,description,photo FROM production.product WHERE productid=11"
rows, err := db.Query(sql)
if err != nil {
return err
}
defer rows.Close()
fmt.Println("queryTable results:")
for rows.Next() {
if err = rows.Scan(&productid, &name, &author, &description, &photo); err != nil {
return err
}
blobLen, _ := photo.GetLength()
fmt.Printf("%v %v %v %v %v\n", productid, name, author, description, blobLen)
}
return nil
}
自己搞定了
/* 查询表数据 */
func selectData(sqlSelect string) string {
// 连接数据库
DB := connDB(ConnString)
//延迟关闭连接
defer DB.Close()
// 准备查询语句
statement, err := DB.Prepare(sqlSelect)
if err != nil {
fmt.Println("prepare statement failed:", err.Error())
return ""
}
defer statement.Close()
// 1查询
rows, err := statement.Query()
if err != nil {
fmt.Println("query failed:", err.Error())
}
// 2查询的列名称切片
columns, err := rows.Columns()
if err != nil {
fmt.Println(err.Error())
return ""
}
//fmt.Println(columns)
// 3数据库列类型
cType, err := rows.ColumnTypes()
if err != nil {
log.Fatal(err)
}
//fmt.Println(cType[0].Name(), cType[0].DatabaseTypeName())
// 4列名类型map
coltyp := colType(cType)
// 5初始化列值接收变量
row := make([]sql.RawBytes, len(columns))
scanArgs := make([]interface{}, len(row))
for i := range row {
scanArgs[i] = &row[i]
}
// 查询结果数据集
var dataset []map[string]interface{} //元素为map的切片
for rows.Next() {
err := rows.Scan(scanArgs...)
if err != nil {
panic(err.Error())
}
// row
var row1 map[string]interface{} = make(map[string]interface{})
for pos, col := range row {
//fmt.Println(columns[pos], ":", string(col))
colname := columns[pos]
svalue := string(col)
//数据类型处理
value := typeConv(colname, svalue, coltyp)
row1[colname] = value
}
//fmt.Println("row1:", row1)
dataset = append(dataset, row1)
//fmt.Println()
}
if err != io.EOF {
dieOnError("Can't Next", err)
}
//切片转json
jsonBytes, err := json.Marshal(dataset)
dieOnError("slice 转 json失败:", err)
//fmt.Println(string(jsonBytes))
return string(jsonBytes)
}
// 生成列名和类型 map
func colType(cType []*sql.ColumnType) map[string]string {
var colTyp map[string]string = make(map[string]string)
for _, col := range cType {
colTyp[col.Name()] = col.DatabaseTypeName()
}
//fmt.Println(colTyp)
return colTyp
}
// 字符根据数据库类型转为go数据类型
func typeConv(colname string, svalue string, ct map[string]string) interface{} {
var ret interface{}
switch ct[colname] {
case "VARCHAR2":
ret = svalue
case "NUMBER":
if len(svalue) > 0 {
flt, err := strconv.ParseFloat(svalue, 64)
if err != nil {
fmt.Println("转换失败:", colname, svalue, err)
} else {
ret = flt
}
} else { //空串处理
ret = nil
}
default:
ret = svalue
}
return ret
}