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.
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
Im Folgenden habe ich das Problem gelöst.
Installierte den IBM i Access for Windows
. Nicht frei
Verweisen Sie die folgenden DLLs im Projekt
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
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.
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.
Ä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 ...
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