mattn / go-adodb

Microsoft ActiveX Object DataBase driver for go that using exp/sql
http://mattn.kaoriya.net/
MIT License
142 stars 36 forks source link

read/write a "Memo" field in Access(.mdb) #22

Open toreal opened 8 years ago

toreal commented 8 years ago

With a [ ]byte type, we can read its value from a memo field. But we can not write it back. (Code is a memo field) sqlstr = "SELECT Code FROM Texts" rows, err = dbsrc.Query(sqlstr) defer rows.Close() if err != nil { fmt.Println("select", err) } for rows.Next() { var Code [] byte err = rows.Scan(&Code) _, err = db.Exec("insert into Texts ( Code) values (?)", Code) }

mattn commented 8 years ago

What is your DDL?

toreal commented 8 years ago

create table Texts(Code Memo)

mattn commented 8 years ago

Then you should use string instead of []byte maybe.

toreal commented 8 years ago

Thanks

toreal commented 8 years ago

A Memo field can store up to 65,536 characters. But I can not save more than 400 characters in this way.

val:=fmt.Println("こんにちわ世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界こんにちわ世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界こんにちわ世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界こんにちわ世界世界世界世界世界世界世界世界世界世界世界世界世界世界こんにちわ世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界こんにちわ世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界こんにちわ世界世界世界世界世界世界世界世界世界世界世界世界世界世界こんにちわ世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界こんにちわ世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界こんにちわ世界世界世界世界世界世界世界世界世界世界世界世界世界世界こんにちわ世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界こんにちわ世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界こんにちわ世界世界世界世界世界世界世界世界世界世界世界世界世界世界こんにちわ世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界こんにちわ世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界こんにちわ世界世界世界世界世界世界世界世界世界世界世界世界世界世界こんにちわ世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界こんにちわ世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界") _, err = stmt.Exec(val)

mdb_go.txt

toreal commented 8 years ago

I try to modify bind function in this way. Then I can chang input value as [] bye. But it is still no lucky. I still can not process long text.

func (s *AdodbStmt) bind(args []driver.Value) error { if s.b != nil { for i, v := range args { var b string = "?" if len(s.b) < i { b = s.b[i] } unknown, err := oleutil.CallMethod(s.s, "CreateParameter", b, 12, 1) if err != nil { return err } param := unknown.ToIDispatch() defer param.Release() _, err = oleutil.PutProperty(param, "Value", v) if err != nil { return err } _, err = oleutil.CallMethod(s.ps, "Append", param) if err != nil { return err } } } else { for i, v := range args { fmt.Println("in bind:", i, v) var varval ole.VARIANT varval.VT = ole.VT_I4 varval.Val = int64(i) val, err := oleutil.CallMethod(s.ps, "Item", &varval) if err != nil { return err } item := val.ToIDispatch() defer item.Release() t, err := oleutil.GetProperty(item, "Type") fmt.Println("type:", t.Val) if t.Val == 202 { _, err := oleutil.CallMethod(item, "AppendChunk", v) if err != nil { fmt.Println("err:", err) return err } } else { _, err = oleutil.PutProperty(item, "Value", v) if err != nil { return err } } } } return nil }

mattn commented 8 years ago

Hmm, seems not work for Memo field.

flibustenet commented 5 years ago

I had the same problem with alexbrainman/odbc https://github.com/alexbrainman/odbc/issues/106 It was resolved, maybe it can help to understand ?

An other workaround at app level is to cut the memo in parts and update with memofield=memofield+part[n]