Lotus и MS SQL

  • Автор темы Автор темы IsAvailable
  • Дата начала Дата начала
ВарЬЯнт: LSX (хоть и через ODBC).
В LSX есть замечательные методы класса LCStream, позволяющие восстановить любые(?) кракозябры.

Именно так мне пришлось действовать, когда IBM-еры не признали ошибку коннектора Oracle
 
IBM-еры не признали ошибку коннектора Oracle
ну как раз с ораклом никаких граблей в плане кодировок не наблюдалось.. а вот MSSQL...
например, DECS в коннекшене даже не видит русские имена полей в таблице:
Owner: dbo
Name: Table_1
Field(s): ????1 (Text)
???2 (Text)


нарыл вот странное

напряг админов, ща переустановят с бубном - мож что и получится...

а сам пока LCStream погляжу...
 
ну как раз с ораклом никаких граблей в плане кодировок не наблюдалось..
Ещё не всё потеряно. Зависит от комбинации кодировок сервера Oracle и того Oracle-клиента, которого юзает Lotus. Если, к примеру, оракл отдаёт данные в 1251, а LND живёт на Виндозе, то с кодировками всё будет Ok. Или Оракл отдаётся в utf8, а Домина живёт на Линухе - тоже будет Ok. А вот в других комбинациях... <_<
 
это гипотетически... не хватало ещё в корпоративной среде иметь много "других" комбинаций :rolleyes:
Не хватало. Контора организованно переезжает с Винюков на Линухи. Переходный период - сосуществование платформ.
А дай Бог ещё и до RISC-ов или mainfreim-ов дорастём..
 
Есть SQL база, где в одной из таблиц хранятся фотографии объектов.
В лотусе надо по коду объекта получать фотку (для еачала хотя-бы в файл).
написал<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">так</div></div><div class="sp-body"><div class="sp-content">
Код:
	Dim FS As NotesStream
Dim FileName As String
Dim AdrNo As Long
Dim PhotoFile As String
Dim PhotoDate As Variant

Set con =New ODBCConnection
Set qry =New ODBCQuery
Set rs =New ODBCResultSet

Call con.ConnectTo("Server1","sa","sa")
Set qry.Connection = con
Set rs.Query = qry

Set wks =New NotesUIWorkspace	
Set Sess =New NotesSession
Set CurDoc =wks.CurrentDocument.Document
qry.SQL = "SELECT format, Date FROM img.dbo.images WHERE AdrNo=" & CurDoc.UnitCode(0)
rs.Execute
FileName = "c:\work\View.jpg"	 

Dim RetCode As Variant
RetCode =rs.NextRow

If rs.GetValue("Format") = "jpg" Then	 
Set FS = Sess.CreateStream
Call FS.Open(FileName)
qry.SQL = "SELECT Image FROM img.dbo.images WHERE AdrNo=" & CurDoc.UnitCode(0)
rs.Execute
RetCode =rs.NextRow
Call FS.Write( rs.GetValue("Image"))
Call FS.Close
End if
rs.Close( DB_CLOSE )
con.Disconnect
Так вот:
Call FS.Write( rs.GetValue("Image")) говорит, что данные должны быть бинарные
Call FS.WriteText( rs.GetValue("Image")) в выходной файл пишется слово "jpg"

Кто может знает - как?
 
1 - не уверен, что ОДБЦ могет получать блобы
2 - нет уверенности что в блобе будет байнари (возможен и base64)
ну и в завершении
для инфы о перекодировки бинарноков в базе64 и обратно
для лучшего резалта - java
 
допиши второй параметр при открытии stream
Код:
Call FS.Open(FileName, "binary")
и используй Write - только писать надо кусками (размером около 30К)
 
1 - не уверен, что ОДБЦ могет получать блобы
2 - нет уверенности что в блобе будет байнари (возможен и base64)
ну и в завершении
для инфы о перекодировки бинарноков в базе64 и обратно
для лучшего резалта - java
В базе хранятся фотки. Сейчас есть задача 1998(?) года на ACCESS. Там фотки дергаются через:
Код:
	 Dim r As Recordset
Dim FS As Stream
....
Set FS = New Stream
FS.Open
FS.Type = adTypeBinary
Set r = SQLConnect.OpenRecordset("SELECT image, date FROM images.dbo.images WHERE type=4 and adrno=" & AdrNo, dbOpenSnapshot)
FS.Write r!Image
Путь = "c:\work\View.jpg"
FS.SaveToFile Путь, adSaveCreateOverWrite
'SQLConnect.Execute "DELETE FROM images.dbo.Images WHERE type=4 AND adrNo = " & AdrNo ', dbSeeChanges
Про java думал, но чем лучше, объектная модель та же самая...
 
Про java думал, но чем лучше, объектная модель та же самая...
jdbc помощнее будет и не требует настройки на клиенте
не будет заморочек с нотусёвым стримом и конвертацией (коле на то будет потребность) base64<->binary
 
Посмотрите код, картинку брали из БЛОБа Информикса, но это не существенно, т.к. объекты АДО - теже.
И вот полезный линк вам:

<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">код (ADO)</div></div><div class="sp-body"><div class="sp-content">
Код:
Sub Click(Source As Button)
Dim ADOConnection As Variant, ADOCmd As Variant	, RecordSet As Variant, ADOStream As Variant, ADOField As Variant
Dim RecordsCnt As Long, intLoop As Long, FileLength As Long, NumBlocks As Long, LeftOver As Long


Const adTypeBinary = 1
Const adSaveCreateOverWrite = 2
Const Blocksize = 4096

Set ADOConnection = CreateObject( "ADODB.Connection" )	
ADOConnection.Open "Provider=Ifxoledbc;Data Source=clipper@ol_asu;User ID=lotus-user;Password=09032010;Persist Security Info=true;"

If ADOConnection.State = 0 Then
Exit Sub
End If

Set RecordSet = CreateObject( "ADODB.Recordset" )
RecordSet.Open "foto", ADOConnection

If RecordSet.State = 0 Then
Print "==================== RecordSet.State = 0 ===================="
Goto l_finish
End If

If Not( ( RecordSet.BOF <> True ) Or ( RecordSet.EOF <> True ) ) Then
Goto l_finish
End If

Set ADOStream = CreateObject( "ADODB.Stream" )
ADOStream.Type = adTypeBinary

RecordSet.MoveFirst

Do
RecordsCnt = RecordsCnt + 1			

Call ADOStream.Open		
Set ADOField = RecordSet.Fields( "foto" )

FileLength = ADOField.ActualSize
NumBlocks = FileLength \ BlockSize
LeftOver = FileLength Mod BlockSize

If LeftOver <> 0 Then
ADOStream.Write ADOField.getchunk( LeftOver ) 'This gathers the remainder portion of the stream first, you could do it last if you want			
End If

For intLoop = 1 To NumBlocks 'Now loop through the majority of the stream
ADOStream.Write ADOField.getchunk( BlockSize )
Next

Call ADOStream.SaveToFile( "C:\IBM\Photos\" + Cstr( RecordSet( "lc" ).value ) + ".gif", adSaveCreateOverWrite )
Call ADOStream.Close

If ( RecordsCnt Mod 50 ) = 0 Then
Print "==================== обработано записей: " + Cstr( RecordsCnt ) + " ===================="
End If

RecordSet.MoveNext
Loop	While RecordSet.EOF = False 		

l_finish:

RecordSet.Close	
ADOConnection.Close

Exit Sub


onerr:
Call LogErrorEx( Cstr( Getthreadinfo(1) ), 1, Nothing )
Resume rez
rez:		
End Sub
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!