views:

354

answers:

3

I'm trying to get data out of a Progress 4GL database, into SQL Server.

Ideally, I'd like to do this directly and within .NET, rather than through an ODBC driver since the ODBC driver gateway in Progress doesn't support multiple-cores (at least on the version we have).

Do you know how to connect to a Progress 4GL database from .NET (ideally in C#, but I'm flexible here... ;) ) ?

Cheers

Nick

A: 

At first you should have a look at SQL Server Integration Services when you want to migrate data to a Microsoft SQL Server. If you want to code the transformation rules in .NET, have a look at the Npgsql provider. It even supports the ADO.NET Entity Framework, hence it should be quite easy to develop a migration application.

Daniel Brückner
Thanks for the prompt response, but I'm not sure that the NpgSql provider would help as thats for PostGres, not Progress..... ;)
Nick Haslam
I read it as Postgres ... just edit your question ... :D I already paused because of the 4GL.
Daniel Brückner
+1  A: 

If you are using Progress OpenEdge version 10.2 or better you can embed .NET controls directly into a 4GL program. But that would be like swatting a fly with a sledghammer... And even if it wasn't the Progress 4GL (the programming language) is aggressively single-threaded and will not support multi-threaded .NET controls.

Both the 4GL and the SQL-92 db engines (Progress supports 2 different interfaces top the storage engine) are multi-threaded and perfectly happy to take advantage of as many cores as you have.

You may however, have a licensing restriction -- the "work group" license uses a semaphore based concurrency algorithm in v9 and early v10. (Later versions use a very limited mutex (spin lock).) The "enterprise" db has no such restriction.

Or it is possible that the target system simply hasn't been setup to support multiple ODBC connections (the db admin should know, key parameters are -Mn, -Ma and possibly -Mpb).

If I were doing this I think that I would simply fake multi-threaded access by starting multiple ODBC sessions against different segments of the data.

Tom Bascom
Hmm.. I like the 'multiple ODBC sessions against different segments' idea. Hadn't thought of that... Cheers!
Nick Haslam
+1  A: 

It's easier if you use Java+JDBC drivers, from JDBC it's fairly simple to work with the OpenEdge DB.

Not sure about MS-SQL Server but MySQL has a database migration that happily connects to OpenEdge via JDBC and imports selections or all tables for you.

I've always found the Progress ODBC drivers buggy and troublesome with .NET, I avoid them as much as I can.

You've also got the app-server to work with, though this is just as bad, it's single threaded and you'll have a limited connection limit for multi-threaded access. If you do choose this option setup stateless services.

Brett Ryan