it-swarm.com.de

Stellen Sie über .NET eine Verbindung zu AS400 her

Ich versuche, eine .NET-Webanwendung mit SQL zu erstellen, um die AS400-Datenbank abzufragen. Dies ist mein erster Kontakt mit dem AS400.

Was muss ich auf meinem Computer (oder dem AS400-Server) installieren, um eine Verbindung herstellen zu können? (IBM iSeries Access für Windows ??)

Was sind die Komponenten der Verbindungszeichenfolge?

Wo finde ich Beispielcodes zum Erstellen der Datenzugriffsebene mit SQL-Befehlen?

Vielen Dank.

37
madatanic

Sie benötigen den AS400 .Net-Datenprovider. Überprüfen Sie hier: https://www-01.ibm.com/support/docview.wss?uid=isg3T1027163

Beispiele für Verbindungszeichenfolgen finden Sie hier: https://www.connectionstrings.com/as-400/

Schauen Sie sich auch das Redbook an, um Codebeispiele zu erhalten und loszulegen . http://www.redbooks.ibm.com/redbooks/pdfs/sg246440.pdf

26
dcp

Im Folgenden habe ich das Problem gelöst.

Installierte den IBM i Access for Windows. Nicht frei

Verweisen Sie die folgenden DLLs im Projekt

  • IBM.Data.DB2.iSeries.dll 
  • Interop.cwbx.dll (wenn Data Queue verwendet wird)
  • Interop.AD400.dll (wenn Data Queue verwendet wird)

Datenzugriff

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

Verbindungszeichenfolge 

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

UPDATE

IBM beabsichtigt nicht, IBM i Access für Windows auf Betriebssystemen jenseits von Windows 8.1 zu unterstützen. Das Ersatzprodukt ist IBM i Access Client Solutions

IBM i Access Client-Lösungen

10
Lijo

Wie in anderen Antworten erwähnt, können Sie, wenn Sie den IBM i Access-Client bereits installiert haben, das Paket IBM.Data.DB2.iSeries verwenden. 

Wenn Sie nicht über die IBM i Access-Software verfügen, können Sie JTOpen nutzen und die Java-Treiber verwenden. Sie benötigen das Nuget-Paket JT400.78 , das die IKVM-Runtime abruft.

In meinem Fall musste ich eine DB2-Datenbank auf einem AS400 abfragen und eine DataTable ausgeben. Ich habe einige Hinweise und kleine Code-Schnipsel gefunden, aber nichts umfassendes. Deshalb wollte ich mitteilen, was ich aufbauen konnte, falls es jemandem hilft:

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();

Die Konvertierung von RecordSet in DataTable ist etwas klobig und hat mir schlechte Rückschläge auf meine VBScript-Tage gebracht. Die Leistung ist wahrscheinlich nicht schnell zu blenden, aber es funktioniert.

2
Wildcat Matt

Ich habe kürzlich den ADO.Net-Treiber für NuGet gefunden. Ich habe den iSeries-Clientzugriff auf meinem PC installiert. Daher kann ich nicht sagen, ob er als Standalone-Gerät funktioniert, aber er stellt eine Verbindung her. Das einzige Problem ist, dass ich keine Tabellen oder Prozeduren sehen kann. Ich denke, es gibt vielleicht ein Schema oder eine Bibliothek oder etwas, auf das ich noch nicht gekommen bin. Ich werde posten, wenn ich die Antwort finde. Mittlerweile kann ich noch mit dem NuGet-Adapter zum Server gehen und den Großteil meines Codes schreiben. 

0
Joseph Morgan

Äußerst alte Frage - aber das ist immer noch relevant. Ich musste unser AS/400 mit .NET abfragen, aber keine der obigen Antworten funktionierte. Daher habe ich meine eigene Methode mit OleDb erstellt:

   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;
        }
    }

Und du würdest es gerne so benutzen:

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

Es gibt eine DataSet der zurückgegebenen Ergebnisse zurück. Wenn jemand eine Methode zum Einfügen/Aktualisieren von Werten innerhalb von IBM AS/400 benötigt/wünscht, hinterlasse einen Kommentar und ich teile ...

0
Mark

Ich verwende diesen Code und arbeite sehr gut für mich!

  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