web-dev-qa-db-fra.com

Connectez-vous à AS400 en utilisant .NET

J'essaie de créer une application Web .NET en utilisant SQL pour interroger la base de données AS400. C'est la première fois que je rencontre l'AS400.

Que dois-je installer sur ma machine (ou le serveur AS400) pour me connecter? (IBM iSeries Access for Windows ??)

Quels sont les composants de la chaîne de connexion?

Où puis-je trouver des exemples de codes sur la construction de la couche d'accès aux données à l'aide de commandes SQL?

Merci.

37
madatanic

Voici ce que j'ai fait pour résoudre le problème.

Installé le IBM i Access for Windows. Pas libre

Référé les dll suivantes dans le projet

  • IBM.Data.DB2.iSeries.dll 
  • Interop.cwbx.dll (si la file d'attente de données est utilisée)
  • Interop.AD400.dll (si file d'attente de données utilisée)

Accès aux données

  using (iDB2Command command = new iDB2Command())
        {
            command.Connection = (iDB2Connection)_connection;
            command.CommandType = CommandType.Text;
            command.Parameters.AddWithValue(Constants.ParamInterfaceTransactionNo, 1);
            command.CommandText = dynamicInsertString;
            command.ExecuteScalar();
        }

Chaîne de connexion 

<add name="InterfaceConnection" 
connectionString="Data Source=myserver.mycompany.com;User ID=idbname;Password=mypassxxx;
Default Collection=ASIPTA;Naming=System"/>

METTRE &AGRAVE; JOUR

IBM ne prévoit pas prendre en charge IBM i Access for Windows sur des systèmes d'exploitation autres que Windows 8.1. Le produit de remplacement est IBM i Access Client Solutions.

Solutions client IBM i Access

10
Lijo

Comme indiqué dans d'autres réponses, si le client IBM i Access est déjà installé, vous pouvez utiliser le package IBM.Data.DB2.iSeries. 

Si vous ne possédez pas le logiciel IBM i Access, vous pouvez utiliser JTOpen et utiliser les pilotes Java. Vous aurez besoin du paquet de nuget JT400.78 qui extraira le runtime IKVM.

Dans mon cas, j'avais besoin d'interroger une base de données DB2 sur un AS400 et de générer un DataTable. J'ai trouvé plusieurs astuces et petits bouts de code, mais rien de complet, je voulais donc partager ce que j'ai pu construire au cas où cela aiderait quelqu'un d'autre:

using com.ibm.as400.access;
using Java.sql;

var sql = "SELECT * FROM FOO WITH UR";

DriverManager.registerDriver(new com.ibm.as400.access.AS400JDBCDriver());
Connection conn = DriverManager.getConnection(
    "jdbc:as400:" + ServerName + ";Prompt=false", UserName, Password);

Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
ResultSetMetaData md = rs.getMetaData();
int ct = md.getColumnCount();

DataTable dt = new DataTable();
for(int i=1; i<=ct; i++)
    dt.Columns.Add(md.getColumnName(i));

while (rs.next())
{
    var dr = dt.NewRow();
    for (int i = 1; i <= ct; i++)
        dr[i - 1] = rs.getObject(i);
    dt.Rows.Add(dr);
}
rs.close();

La conversion de RecordSet à DataTable est un peu maladroite et m'a donné de mauvais flashbacks à mes jours VBScript. Les performances ne sont probablement pas aveuglantes, mais cela fonctionne.

2
Wildcat Matt

J'ai récemment trouvé le pilote ADO.Net disponible sur NuGet. L’accès client iSeries est installé sur mon ordinateur. Je ne peux donc pas dire s’il fonctionne en mode autonome, mais il se connecte. Le seul problème est que je ne vois pas réellement de tables ou de procédures. Je pense qu'il peut y avoir un schéma ou une bibliothèque ou quelque chose que je n'ai pas encore compris. Je posterai si je trouve la réponse. En attendant, je peux toujours accéder au serveur et écrire la plupart de mon code avec l'adaptateur NuGet. 

0
Joseph Morgan

Question extrêmement ancienne - mais cela reste pertinent. J'avais besoin d'interroger notre AS/400 en utilisant .NET mais aucune des réponses ci-dessus n'a fonctionné et j'ai donc créé ma propre méthode en utilisant OleDb:

   public DataSet query_iseries(string datasource, string query, string[] parameterName, string[] parameterValue)
    {
        try
        {
            // Open a new stream connection to the iSeries
            using (var iseries_connection = new OleDbConnection(datasource))
            {
                // Create a new command
                OleDbCommand command = new OleDbCommand(query, iseries_connection);

                // Bind parameters to command query
                if (parameterName.Count() >= 1)
                {
                    for (int i = 0; i < parameterName.Count(); i++)
                    {
                        command.Parameters.AddWithValue("@" + parameterName[i], parameterValue[i]);
                    }
                }

                // Open the connection
                iseries_connection.Open();

                // Create a DataSet to hold the data
                DataSet iseries_data = new DataSet();

                // Create a data adapter to hold results of the executed command
                using (OleDbDataAdapter data_adapter = new OleDbDataAdapter(command))
                {
                    // Fill the data set with the results of the data adapter
                    data_adapter.Fill(iseries_data);

                }

                return iseries_data;
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            return null;
        }
    }

Et vous l'utiliseriez comme ceci:

DataSet results = query_iseries("YOUR DATA SOURCE", "YOUR SQL QUERY", new string[] { "param_one", "param_two" }, new string[] { "param_one_value", "param_two_value"}); 

Il retourne une DataSet des résultats renvoyés. Si quelqu'un a besoin/veut une méthode pour insérer/mettre à jour des valeurs dans IBM AS/400, laissez un commentaire et je le partagerai ...

0
Mark

J'utilise ce code et fonctionne très bien pour moi!

  Try
        Dim sqltxt As String = "SELECT * FROM mplib.pfcarfib where LOTEF=" & My.Settings.loteproceso
        dt1 = New DataTable
        Dim ConAS400 As New OleDb.OleDbConnection
        ConAS400.ConnectionString = "Provider=IBMDA400;" & _
        "Data Source=192.168.100.100;" & _
        "User ID=" & My.Settings.usuario & ";" & _
        "Password=" & My.Settings.contrasena
        Dim CmdAS400 As New OleDb.OleDbCommand(sqltxt, ConAS400)
        Dim sqlAS400 As New OleDb.OleDbDataAdapter
        sqlAS400.SelectCommand = CmdAS400
        ConAS400.Open()
        sqlAS400.Fill(dt1)
        grid_detalle.DataSource = dt1
        grid_detalle.DataMember = dt1.TableName
    Catch ex As Exception
        DevExpress.XtraEditors.XtraMessageBox.Show("Comunicación Con El AS400 No Establecida, Notifique a Informatica..", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Me.Close()
    End Try
0
raabsoft