powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Обрезание строки из внешеней СУБД
11 сообщений из 11, страница 1 из 1
Обрезание строки из внешеней СУБД
    #36652245
IVS4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Настроил ODBC источник к MS SQL базе. Подключаюсь в каше к этой базе:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	    Set Connection=##class(%SQLGatewayConnection).%New()
	    Set res = Connection.Connect("4B")
	    Set ResSet=##class(%ResultSet).%New("%DynamicQueryGW:SQLGW")
	    s SQLq="SELECT * FROM DOC"
	    Do ResSet.Prepare(SQLq,,Connection)
	    Do ResSet.Execute()
	    while ResSet.Next(){
                 s t=ResSet.Data("DATA")
           } 
           d ResSet.Close()
	    d Connection.Disconnect()

Проблема с строковыми данными большой длинны. Почему-то вышеописанный код получает только первые 119 символов больших строк, а остальное отбрасывает. Похоже проблема не новая, но решения что-то не найти. Cache 5.0.18.

Буду признателен за помощь.
...
Рейтинг: 0 / 0
Обрезание строки из внешеней СУБД
    #36653206
Alexandr Minzer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IVS4, что-то похожее было

%ResultSet и %DynamicQueryGW:SQLGW к БД Oracle
...
Рейтинг: 0 / 0
Обрезание строки из внешеней СУБД
    #36653524
IVS4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Видел я тот пост. Решения как такового не нашел.

Я тут проделал следующие манипуляции:
1. Попробовал другой вариант подключения

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Set Connection=##class(%SQLGatewayConnection).%New()
Do Connection.Connect("4B")
Set sc=Connection.AllocateStatement(.Stat)
Set sc=Connection.Prepare(Stat,"SELECT * FROM DOC")

Set sc=Connection.Execute(Stat)
For { 
	Q:'Connection.Fetch(Stat)
    S Sc=Connection.GetOneRow(Stat,.Row)
    For J= 1 : 1 :$LL(Row) {
	s d=$LG(Row,J)
    }
}

Set sc=Connection.DropStatement(Stat)
Set sc=Connection.Disconnect()

Здесь размер строки учитывается полностью, но после 55 символа начинается выводиться абракадабка типа
Код: plaintext
1.
2.
3.
 33 =
 39 =
 100 =МОЛОКО???????

2. Попробовал поработать с таблицей не программно, а через проекцию SQL таблицы в Cache класс через мастер связи таблиц, так вот там с длинными строками проблем нет.


Вообще то не хотелось завязываться на проекцию таблиц, поэтому может кто подскажет в каком направлении копать, чтобы работать все-таки через %SQLGatewayConnection.
...
Рейтинг: 0 / 0
Обрезание строки из внешеней СУБД
    #36653632
Turk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Внимательно читайте описание класса %SQLGatewayConnection - там написано, что GetOneRow() и FetchRows() обрезают результат до 120 символов. Для получения данных полей без обрезки используйте метод GetData().
...
Рейтинг: 0 / 0
Обрезание строки из внешеней СУБД
    #36653654
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не думаю, что это правильно:
Код: plaintext
1.
2.
3.
For J= 1 : 1 :$LL(Row) {
	s d=$LG(Row,J)
    }
...
Рейтинг: 0 / 0
Обрезание строки из внешеней СУБД
    #36654485
Turk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey MaslovНе думаю, что это правильно:
Код: plaintext
1.
2.
3.
For J= 1 : 1 :$LL(Row) {
	s d=$LG(Row,J)
    }

Правильно (с точки зрения отбора значений полей, а не обрезки данных).
...
Рейтинг: 0 / 0
Обрезание строки из внешеней СУБД
    #36655107
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неправильно, т.к. многократно перезаписывается одна переменная (d).
Код: plaintext
1.
2.
For J= 1 : 1 :$LL(Row) {
	s d=$LG(Row,J)
    }
...
Рейтинг: 0 / 0
Обрезание строки из внешеней СУБД
    #36655667
Turk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey MaslovНеправильно, т.к. многократно перезаписывается одна переменная (d).
Код: plaintext
1.
2.
For J= 1 : 1 :$LL(Row) {
	s d=$LG(Row,J)
    }

Там просто приведен не весь код. Если уж так придираться, то и в первом посте похожая "ошибка".
...
Рейтинг: 0 / 0
Обрезание строки из внешеней СУБД
    #36655854
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IVS4,

Попробовал тест на Caché 2010.1.FT3 и Microsoft SQL Server 9.00.4035.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE
    TABLE test
    (
        id INT NOT NULL IDENTITY,
        d VARCHAR( 8000 ) COLLATE Cyrillic_General_CS_AS_WS,
        PRIMARY KEY (id)
    )
Значение возвращается полностью без обрезаний.
Код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Set Connection=##class(%SQLGatewayConnection).%New()
Set res = Connection.Connect("ODBC_DSN_MSSQL","login","password")
Set ResSet=##class(%ResultSet).%New("%DynamicQueryGW:SQLGW")
Set SQLq="SELECT * FROM dbo.test"
Do ResSet.Prepare(SQLq,,Connection)
Do ResSet.Execute()
while ResSet.Next(){
  Set d=ResSet.Get("d")
  w $length(d),!
  w d,!
} 
Do ResSet.Close()
Connection.Disconnect()
...
Рейтинг: 0 / 0
Обрезание строки из внешеней СУБД
    #37087375
13-й Пилигрим
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitIVS4,

Попробовал тест на Caché 2010.1.FT3 и Microsoft SQL Server 9.00.4035.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE
    TABLE test
    (
        id INT NOT NULL IDENTITY,
        d VARCHAR( 8000 ) COLLATE Cyrillic_General_CS_AS_WS,
        PRIMARY KEY (id)
    )
Значение возвращается полностью без обрезаний.
+
Код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Set Connection=##class(%SQLGatewayConnection).%New()
Set res = Connection.Connect("ODBC_DSN_MSSQL","login","password")
Set ResSet=##class(%ResultSet).%New("%DynamicQueryGW:SQLGW")
Set SQLq="SELECT * FROM dbo.test"
Do ResSet.Prepare(SQLq,,Connection)
Do ResSet.Execute()
while ResSet.Next(){
  Set d=ResSet.Get("d")
  w $length(d),!
  w d,!
} 
Do ResSet.Close()
Connection.Disconnect()


Могу я вас попросить скинуть классы %Library.SQLGatewayConnection, %Library.Resultset и cgate.dll мне на почту
...
Рейтинг: 0 / 0
Обрезание строки из внешеней СУБД
    #37087794
13-й Пилигрим
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все, разобрался сам :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
TestODBC()
	s $zt = "ODBCErrorTrap"
	s gc=##class(%SQLGatewayConnection).%New() s:gc="" $EC=$$Error^%apiOBJ( 5001 ,"Can not create %SQLGatewayConnection.")
	s sc=gc.Connect("SD.KKM","SD_CREPORT","sd2007crep", 0 ) s:'sc $EC=sc
	s:gc.ConnectionHandle="" $EC=$$Error^%apiOBJ(5001,"Connection failed")
	s hstmt="",sc=gc.AllocateStatement(.hstmt) s:'sc $EC=sc
	s sql="select id, deadline, status, impact, classification, information, KKM_id, KKM_description, location_name, org_name, solution, closurecode, planstart, planduration from sd_creport.v_sf_kkm_scall"
	s sc=gc.Prepare(hstmt,sql) s:'sc $EC=sc
	s sc=gc.Execute(hstmt) s:'sc $EC=sc
	s sc=gc.DescribeColumns(hstmt,.columns) s:'sc $EC=sc
	f column= 2 : 1 :$ll(columns) {
		w $li($li(columns,column), 1 )_$c( 9 )
	}
	w !
	while gc.Fetch(hstmt) {
		f column= 2 : 1 :$ll(columns) {
			s length =  0 
			while gc.GetData(hstmt,column- 1 , 1 ,.piece) {
				i $i(length,$l(piece))
			}
			w length_$c( 9 )
		}
		w !
	}
	q $$$OK

ODBCErrorTrap()
	s $zt=""
	d DisplayError^%apiOBJ($EC)
	s $EC=""
	s sc=gc.DropStatement(hstmt)
	s sc=gc.Disconnect()
	q  0 
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Обрезание строки из внешеней СУБД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]