Problem z bazą danych InterSystems Cache

0

Witam wszystkich serdecznie!

Mam problem, który występuje podczas odczytu danych z bazy InterSystems Cache (wersja 5.0).
Używam Visual Studio 2005 i pobrałem sobie oryginalny sterownik ADO .NET ze strony www.intersystems.cache
Połączenie do bazy Cache działa prawidłowo, ale problem pojawia się podczas odczytu danych z pól typu TEXT (LONGVARCHAR). Sterownik prawidłowo rozpoznaje typ pola (String), ale w żadnym przypadku nie chce odczytac jego wartosci.

Byłbym bardzo wdzięczny za wszlekie wskazówki.

0

A podaj jeszcze przyklad odczytu, bo raczej malo kto korzystal z takiej bazy, wiec moze z kodem cos wiecej da sie poradzic.

pozdrawiam
johny

0

Zdaję sobie sprawę, że baza jest mało znana (zwłaszcza w Poslce).

Oczywiście podaję fragmewnt kodu odczytującego (dodam tylko że odczyt działa prawidłowo na bazach MSSQL, MySQL i MS Access (w tym ostatnim przypadku dostęp zarówno przez ODBC jak i OLE DB).

mamy tabelkę

CREATE TABLE test (pole TEXT);

pole typu TEXT jest odpowiednikiem CLOB (w przypadku Oracle-a) - do przechowywania długich strumieni tekstowych.

Fragment kodu odczytującego

using InterSystems.Data.CacheClient;
using MySql.Data.MySqlClient;

...

private IDbConnection createConnection(String db)
{
IDbConnection conn = null;
try
{
switch (db) // W zaleznosci od ustawnienia (zmienna db) wybieram okreslony sterownik do bazy danych
{
case "A1": // MS Access - ODBC - by source name.
conn = new OdbcConnection("dsn=baza_odbc;driverid=25;fil=MS Access;maxbuffersize=2048;pagetimeout=5");
break;

		case "A2": // MS Access - ODBC - by file path.
			conn = new OdbcConnection("Driver={Microsoft Access Driver (*.mdb)};Dbq=D:\\plik.mdb");
			break;

		case "A3": // MS Access - Microsoft Jet (OLE DB).
			conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\plik.mdb");
			break;

		case "MS": // MSSQL
			conn = new SqlConnection("Data Source=localhost;Initial Catalog=baza_mssql;User ID=uzytkownik;Password=haslo");
			break;

		case "MY": // MySQL
			conn = new MySqlConnection("Data Source=serwer;Database=baza_mysql;User ID=uzytkownik;Password=haslo");
			break;
		
		case "CA": // InterSystems Cache
			conn = new CacheConnection("Server=localhost;Port=1972;Namespace=baza_cache;Password=haslo;User ID=uzytkownik");
			break;
	}
	conn.Open();
}
catch (Exception)
{
	MessageBox.Show("nie można się połączyc");
	conn = null;
}

return conn;

}

private void test()
{
IDbConnection conn = createConnection("CA");
if (conn != null)
{
IDbCommand cmd = conn.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT pole FROM test";
IDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
Object oValue = reader["pole"];
// do sth with oValue
}
}
}

0

Dodam jeszcze tylko, że jeżeli pole jest typu VARCHAR, to odczyt działa prawidłowo.
Problem jest w przypadku pół typu TEXT

0

najprawdopodobniej pole to traktowane jest jak BLOB i tak je trzeba odczytać

0

Dzięki za sugetsię...

Włąśnie wykonałem taką próbę - zamieniłem funkcję tesową na następującą:

private void test()
{
IDbConnection conn = createConnection("CA");
if (conn != null)
{
IDbCommand cmd = conn.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT pole FROM test";
IDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
byte[] blob = new byte[10000];
try
{
reader.GetBytes(0 , 0 , blob , 0 , 10000);
}
catch (Exception ex)
{
// do sth with ex
}
}
}
}

Niestety w trakcie odczytu rzuca wyjątkiem

Data {System.Collections.ListDictionaryInternal} System.Collections.IDictionary {System.Collections.ListDictionaryInternal}

Restricted data type attribute violation

0

Jeszcze może nadmienię, że odczytuję to pole za pomocą JDBC (JAVA) i tam to działa bez zarzutów, więc chyba po stronie bazy jest ok....

Co może być nie tak, że ten sterownik pod .NET nie może sobie z tym poradzić....

0

Znalazłem działające rozwiązanie!!! (może się komuś kiedyś przyda :)

private void test()
{
IDbConnection conn = createConnection("CA");
if (conn != null)
{
IDbCommand cmd = conn.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT pole FROM test";
IDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
try
{
CacheDataReader creader = (CacheDataReader)reader;
System.IO.StreamReader sr = creader.getCharacterStream(0);
int _BLOCK_SIZE = 4096;
char[] clob = new char[_BLOCK_SIZE];
sr.ReadBlock(clob , 0 , _BLOCK_SIZE);
sr.Close();
// do sth with clob
}
catch (Exception ex)
{
// do sth with ex
}
}
}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1