OberonCore https://forum.oberoncore.ru/ |
|
B6: SqlOdbc3: недоделка юникодизации в чтении строк https://forum.oberoncore.ru/viewtopic.php?f=116&t=2712 |
Страница 1 из 1 |
Автор: | Евгений Темиргалеев [ Вторник, 22 Июнь, 2010 17:07 ] |
Заголовок сообщения: | B6: SqlOdbc3: недоделка юникодизации в чтении строк |
Используемая SQLGetData Function требует размера буфера-приёмника в байтах. Возвращает размер тоже в байтах (если я верно понял, явно не написано). В процедурах чтения строк при переходе с SHORTCHAR забыли домножиться на SIZE(CHAR). (t: Table) ReadString (t: Table) ReadVarString Было бы неплохо, если у кого-нибудть нашлось время независимо обмозговать/проверить сабж. С "API"-функциями облажаться немудрено... Исправления в исходнике зелёным Код: StdCoder.Decode ..,, ..5t....3QwdONl9RhOO9vRbf9b8R7fJHPNGomCrlAyIhgs,CbKBhZ
xi2,CoruKu4qouqm8rtuGfa4.hOO9vRb1Y66wb8RTfQ9vQRtIdvPZHWKqtCa.E.U5UIj,6.5Qw dONlnayKmKKqCLLCJuGqayKm6F9vQ5nsH3.bnayKmKa2,Cor.kay4.qorGqmQCU2,CJuyKtQC9 8P9PP7ONbXmb.2.go9k5kCj.,6.,.vQ.cU.ktAcoZimBhWhiohgnZcZRC.,.D,0.p.0.4.0EJY jyC.6.VQ.EK4.1cUZj0E.69,U.UO.,Uz1,c8.2UEW.cOktE,8Mtf.2.02,.e,2.VZ.2.e0.,6Y UAU.Q2AUi.50q22K0k,8Mtf.2.412.e,2.AU.Ue.4.072Uj.541sH6,3gwJ.0..I16.wT2U.I3 .2G6.R01M5krE,m.0kFk.u00EB5.3M8Es7.3.0E,0.3M.2.l.3c16.L016R6.X,zT0VeITuE98 FfeI986F7Rp76dOM39P9P8,dI9PM7vIdfQHfPD96FdQTvRN765vPNPRPfPp76HeHdOFDOFZuC, tHf8J,tQdfQp761eIZOEn86TeF,tEFOEZO8rN1HM0hOEZ86ZPNb99,7P9fPp76.gV7Ic3xc7pd BAV7AcHRe3JeI3ZmxB,dDv76V79,dAVN8r761uIbOF.mHEGLL8rrSrtmGE8nMamRqk2A6UXxhg VUobx22cAHtC,NE..mHEGbXxhghCCLK0GNCnIin4a..df9b9RP9R,t6,7AN76GnIin4aUHhgo3 ejRicYig2YmxhrZ3.N76ZPNbP8rN1Ad43YmhA,ND,7A,7JFOFRO1Hk2morSKLCIo4KtWGFWGFa mR0GayqnumYuKuWGtyadQbUY7Q6EK8mIi1MGsMT1amR00Q6kI8mIin4M0Ee4KliHEmorMG6H9e HFtQdfQHN8rN1sEFPN5vOFtJHfPbOQNf9bOINuF99R7OMdPMF7RRtQ69,tIFuHZ8JFtMUUQZUA adYZUwedpB.zuEzuJ58G1eINN1HM0HM0.kdapdGpWqIL4IW8JICLu69,7H9eHUUIZUQe7Jf33Z 13d,N8N76NPNaGKqk2aU7cHH8HN76df9b1IiZN8UAVI,kYEqKKrQ5Ee.MGcQ9vQ.HWcYhZ76v7 6VN8,tHZ86F7PULBhi,EbKJamojGoUGpUaGEGJYKYUQioJiUIbx2YWIYUgcCZcBAV7sCNuPDf9 d0U7VA,YYdAZv2YAVI,kdGLta4Fd6Dd6,t8,tQdfQ,t8,d6Dd6HtCUAphBAV7gcCZcvgV7AVop Zmhgn3YugbUIiZRiBAV3p7,dI9PM.in4qk20Jdy2...1Hf4KtCJuAB00Y3.p,.,,ERQelZh2Ji dpiZJintIdnoM8rN1o8Ug.p,.CLR0mU83IapwaUwd432sCH68J76T9N796BvPZ965vPZfQ9vMd 965vPRfR9fQbPOTfP,tPB963PORPMZPS,7N19R196JN8PM03OF.10cQ2Yy.24..m185m0X,A6U X,0GT.8142.UwUX,C5C1.Eukq22Uo.Cpm.krY3YBY3M8kYcQ2YxEEUBk2m2C268Q5N0H0ZvPa0 kV.N,U7VXxBM8.50AZW.aEIeGEmorSaI,HeF,tQdHECGEuoYmIEGJY66NuPA7Y7UdAZUgcARe3 3YAxhbtIABWWCBdAJYd2Y3pd2RbUIZdg,HM0N0d0m2a2.HN8rN1sE..sF.F,69C3.66LlM..wf 1,Y3M0.kda3.AZg2YA,0GJ00.a0M8N,aUC,QCEtKad.m2G3.H0N1r,Y8.a28rm.A7EECGEuqrG okGrk0GeW2P.HMG23220nI..j0.u2..k2A7C5,ND,dHH8HUUod3xecQioJig2YlAZUgcCl2WGJ AggZhjxiUIiZRgtRggBhixgUwha3Ynlo663PS,NP1vOHfPD96VPMZPMPPNdPNZ96196hOEZ861 vN1PORvD,d8H,aUnZimpfUIbxc6qk2aU7gcARe7pcUYhZpBw8.kbyJeyIe4Ia0Gek4k223WqrS LEGrr0moqKs8rrOrm0Go4KrGKqaKrSaj,kt0mvaKuWKEKLrGqmOqouqmGKEmqmwgo3hz2YeA3M 0a2FtQdfQ,VClI0mbEaK2GbSBZUYbUY7M8H76d0,,EKYd3,g6g,A,b1,,b97PM0Hk2K29O1HM0 aU,,ojDZc23ZghAH79,NAV7AHtC,7P9fP,dCYhZpB7OGh86ZtCPM0Hk2A7UU...dHja0m4i00G e..NFqK4U3,M0a2N1xVAhcClI0GeW2P.HUnVUUntCPM0A,C2..S2EI.sIUX,.N,.wf1,Y3M0.Q 8.Euofds8,78NOFUh2YlAZUIZU.UdEImoWEuUh2YcYd3VdUlM8,d8..m4HVCBdAZ3.ICa0M0K2 U7ktEE.P.HkWuYBU7g6U7Q56J.A7dHaUo77H,Ee.sIABWWb66QC0mJI2a0Ea.98H.H6HsIABcP T967PMdHFamR00Y7kWu2g6i1G5CbuEtM1EE..Qb0CyIhACoruKu8rrmKqKKtCLL6N58RZ9P7ON bvM,Mwd0.UiQcjpho,YcZRiX3.5011o3cQ...sQR,.G20EtV.UIU.U76.0E..k.8ssHpmcIf9P 9fQbf9bWGhigFWE.4Te.sQRdIf9P9HWE.8z,E.0.L3D.5J.2U.sU.ktumdsIdPSNPN7ONbH.4D .o3aLq.,cwF.,.E2EhU.E,NN.oZ,ZC.G20U2U...G00k.0.0.0mFf3,E.4vl5UTyB4.4.0E.cU Zj0E..UO.,.1.eWM2y,.,6Y1.0..QB,... --- end of encoding --- |
Автор: | Евгений Темиргалеев [ Вторник, 22 Июнь, 2010 17:27 ] |
Заголовок сообщения: | Re: SqlOdbc3: недоделка юникодизации в чтении строк |
Такая поправка для (t: Table) ReadCurrency Цитата: Check(WinSql.SQLGetData(t.stmt, SHORT(column + 1), WinSql.SQL_C_WCHAR,
SYSTEM.ADR(str), LEN(str)*SIZE(CHAR), len), NIL, t.stmt, res); |
Автор: | Иван Кузьмицкий [ Понедельник, 09 Август, 2010 21:35 ] |
Заголовок сообщения: | Нашёл ошибку в драйвере SqlODBC3 |
Метод таблицы (t: Table) ReadString вызывается, если надо прочесть значение поля типа Char (строка фиксированной длины). При этом, неверно определяется длина строки, которую надо указать в байтах, а вместо этого передаётся кол-во символов. Поскольку уникод, то длина байтового массива получается урезанной вдвое. Умножил LEN(str) на 2 и строки стали читаться правильно, с точностью до символа. Вот правленный код: Код: PROCEDURE (t: Table) ReadString (row, column: INTEGER; OUT str: ARRAY OF CHAR); ... Check(WinSql.SQLGetData(t.stmt, SHORT(column + 1), WinSql.SQL_C_WCHAR, SYSTEM.ADR(str), LEN(str)*2, len), ... NIL, t.stmt, res); P.S. И, конечно, лучше умножать не на 2, а на SIZE(CHAR). При этом, конечно, учитывается допущение, что размер CHAR соответствует коэффициенту SQL_C_WCHAR. (модератор) прикреплено к существующей теме |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |