Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Обрезание строки из внешеней СУБД / 11 сообщений из 11, страница 1 из 1
27.05.2010, 11:23
    #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
27.05.2010, 15:21
    #36653206
Alexandr Minzer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обрезание строки из внешеней СУБД
IVS4, что-то похожее было

%ResultSet и %DynamicQueryGW:SQLGW к БД Oracle
...
Рейтинг: 0 / 0
27.05.2010, 17:02
    #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
27.05.2010, 17:28
    #36653632
Turk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обрезание строки из внешеней СУБД
Внимательно читайте описание класса %SQLGatewayConnection - там написано, что GetOneRow() и FetchRows() обрезают результат до 120 символов. Для получения данных полей без обрезки используйте метод GetData().
...
Рейтинг: 0 / 0
27.05.2010, 17:35
    #36653654
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обрезание строки из внешеней СУБД
Не думаю, что это правильно:
Код: plaintext
1.
2.
3.
For J= 1 : 1 :$LL(Row) {
	s d=$LG(Row,J)
    }
...
Рейтинг: 0 / 0
28.05.2010, 08:33
    #36654485
Turk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обрезание строки из внешеней СУБД
Alexey MaslovНе думаю, что это правильно:
Код: plaintext
1.
2.
3.
For J= 1 : 1 :$LL(Row) {
	s d=$LG(Row,J)
    }

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

Там просто приведен не весь код. Если уж так придираться, то и в первом посте похожая "ошибка".
...
Рейтинг: 0 / 0
28.05.2010, 16:09
    #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
31.01.2011, 01:33
    #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
31.01.2011, 11:41
    #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
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Обрезание строки из внешеней СУБД / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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