zoukankan      html  css  js  c++  java
  • golang gbk转utf8 mssql access

    package ms2mysql
    import ( 
        "bytes" 
        "golang.org/x/text/encoding/simplifiedchinese" 
        "golang.org/x/text/transform" 
        "io/ioutil" 
    ) 
    func Decode(s []byte) ([]byte, error) { 
        I := bytes.NewReader(s)
        O := transform.NewReader(I, simplifiedchinese.GBK.NewDecoder())
        d, e := ioutil.ReadAll(O)
        if e != nil {
            return nil, e
        }
        return d, nil
    }

    win7 64位下试了好几个其他方式,结果都不行,也就这个可以,记录下来

    package main
    
    import (
        "fmt"
        "reflect"
        "unsafe"
    
        "ms2mysql/lib"
    
        "github.com/go-xorm/core"
        "github.com/go-xorm/xorm"
        _ "github.com/lunny/godbc"
    )
    
    var engine *xorm.Engine
    
    func BytesToString(b []byte) string {
        bh := (*reflect.SliceHeader)(unsafe.Pointer(&b))
        sh := reflect.StringHeader{bh.Data, bh.Len}
        return *(*string)(unsafe.Pointer(&sh))
    }
    
    func StringToBytes(s string) []byte {
        sh := (*reflect.StringHeader)(unsafe.Pointer(&s))
        bh := reflect.SliceHeader{sh.Data, sh.Len, 0}
        return *(*[]byte)(unsafe.Pointer(&bh))
    }
    func main() {
        var err error
        engine, err := xorm.NewEngine("odbc", "driver={SQL Server};Server=127.0.0.1;Database=test;uid=sa;pwd=123456;")
        if err != nil {
            fmt.Println(err)
            return
        }
        if err := engine.Ping(); err != nil {
            fmt.Println(err)
        }
        engine.ShowSQL(true)
        engine.Logger().SetLevel(core.LOG_DEBUG)
        //encode:=mahonia.NewEncoder("utf-8")
        sql := "SELECT * FROM "USERINFO";"
        rowArray, _ := engine.Query(sql)
        for _, row := range rowArray {
            for colname, colvalue := range row {
                v, _ := ms2mysql.Decode(colvalue)
                value := BytesToString(v)
                fmt.Println(colname, value)
            }
        }
    }

     也许可以这样连接access文件(64位win7系统测试不成功,也不想测试了,感觉微软的东西用32位系统应该可以,这里作为记录,或许以后用得到)如下:

    package main
    
    import (
        "database/sql"
        "fmt"
    
        "github.com/go-ole/go-ole"
        "github.com/go-ole/go-ole/oleutil"
        _ "github.com/mattn/go-adodb"
    )
    
    func createMdb(f string) error {
        unk, err := oleutil.CreateObject("ADOX.Catalog")
        if err != nil {
            return err
        }
        cat, err := unk.QueryInterface(ole.IID_IDispatch)
        if err != nil {
            return err
        }
        _, err = oleutil.CallMethod(cat, "Create", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+f+";")
        if err != nil {
            return err
        }
        return nil
    }
    
    func main() {
        ole.CoInitialize(0)
    
        f := "E:\access\x.mdb"
    
        /*os.Remove(f)
    
        err := createMdb(f)
        if err != nil {
            fmt.Println("create mdb", err)
            return
        }*/
    
        db, err := sql.Open("adodb", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+f+";")
        if err != nil {
            fmt.Println("open", err)
            return
        }
        fmt.Println(db)
        /*
            _, err = db.Exec("create table foo (id int not null primary key, name text not null, created datetime not null)")
            if err != nil {
                fmt.Println("create table", err)
                return
            }
    
            tx, err := db.Begin()
            if err != nil {
                fmt.Println(err)
                return
            }
            stmt, err := tx.Prepare("insert into foo(id, name, created) values(?, ?, ?)")
            if err != nil {
                fmt.Println("insert", err)
                return
            }
            defer stmt.Close()
    
            for i := 0; i < 100; i++ {
                _, err = stmt.Exec(i, fmt.Sprintf("xxx", i), time.Now())
                if err != nil {
                    fmt.Println("exec", err)
                    return
                }
            }
            tx.Commit()*/
    
        rows, err := db.Query("select UserID, DeviceID from UserACPrivilege")
        if err != nil {
            fmt.Println("select", err)
            return
        }
        defer rows.Close()
    
        for rows.Next() {
            var id int
            var name string
            err = rows.Scan(&id, &name)
            if err != nil {
                fmt.Println("scan", err)
                return
            }
            fmt.Println(id, name)
        }
    }
  • 相关阅读:
    C++ 虚函数在基类与派生类对象间的表现及其分析
    借@阿里巴巴 耍了个帅——HTML5 JavaScript实现图片文字识别与提取
    Dede(织梦) CMS SQL Injection Vulnerability
    dedecms v5.5 final getwebshell exploit(datalistcp.class.php)
    DEDECMS网站管理系统Get Shell漏洞
    织梦(Dedecms)select_soft_post.php页面变量未初始漏洞
    织梦(Dedecms) 5.1 feedback_js.php 注入漏洞
    织梦(DEDE)CMS V5.3 覆盖任意变量导致远程包含漏洞
    dedecms织梦 v5.5 两处跨站漏洞
    dedecms织梦 v5.6 两处跨站漏洞
  • 原文地址:https://www.cnblogs.com/benlightning/p/5418393.html
Copyright © 2011-2022 走看看