Posted to tcl by greycat at Thu Aug 15 13:39:55 GMT 2024view raw
- I am trying to read and write binary data to a SQL Server database from Tcl.
- Reading works fine.
- Writing does not. My current attempt is using CONVERT(), and something
- is adding curly braces around the binary data.
- In this transcript, I am doing an update command with two different data
- payloads. The payload with all lowercase letters works. The payload with
- punctuation characters does not. Curly braces are being added.
- I get the same results if I try CONVERT() with style argument 2 and remove
- the leading 0x from the data payload.
- Script started on 2024-08-15 09:04:43-04:00 [TERM="screen" TTY="/dev/pts/17" COLUMNS="80" LINES="24"]
- wooledg:~/queries/new$ cat query-helper-minimal
- # ~/.ebase.db contains arrays with database connection info, of the form:
- # array set production {
- # host {hostname.domain\something}
- # port {1433}
- # db {eBASE}
- # user {username}
- # pass {password}
- # }
- # array set testing {
- # ...
- # }
- # Setting DB to one of these array names before sourcing this file lets
- # you pick a different database to connect to. The default is production.
- source ~/.ebase.db
- if {! [info exists DB]} {set DB production}
- array set db [array get $DB]
- package require tdbc::odbc
- set drv /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
- set conn "Driver=$drv;Server=$db(host);Port=$db(port);Database=$db(db);UID=$db(user);PWD=$db(pass)"
- tdbc::odbc::connection create db $conn
- wooledg:~/queries/new$ cat z1
- #!/usr/bin/tclsh
- set DB development
- source query-helper-minimal
- set sql {
- update data.PdfConversions
- set InputData = CONVERT(varbinary(max), :data, 1)
- where Id = 1
- }
- #set data 0x192122232425
- set data 0x656667686970
- set d [dict create data $data]
- db allrows -as lists -- $sql $d
- wooledg:~/queries/new$ ./z1
- wooledg:~/queries/new$ cat z2
- #!/usr/bin/tclsh
- set DB development
- source query-helper-minimal
- set sql {
- select InputData from data.PdfConversions where Id = 1
- }
- fconfigure stdout -translation binary
- set data [lindex [db allrows -as lists -- $sql] 0]
- puts -nonewline $data
- wooledg:~/queries/new$ ./z2 | hd
- 00000000 65 66 67 68 69 70 |efghip|
- 00000006
- wooledg:~/queries/new$ vi z1
- [...]
- wooledg:~/queries/new$ cat z1
- #!/usr/bin/tclsh
- set DB development
- source query-helper-minimal
- set sql {
- update data.PdfConversions
- set InputData = CONVERT(varbinary(max), :data, 1)
- where Id = 1
- }
- set data 0x192122232425
- #set data 0x656667686970
- set d [dict create data $data]
- db allrows -as lists -- $sql $d
- wooledg:~/queries/new$ ./z1
- wooledg:~/queries/new$ ./z2 | hd
- 00000000 7b 19 21 22 23 24 25 7d |{.!"#$%}|
- 00000008
- wooledg:~/queries/new$
- exit
- Script done on 2024-08-15 09:05:46-04:00 [COMMAND_EXIT_CODE="0"]