c# - as400 - ibm data db2 iseries
Conéctese a AS400 usando.NET (7)
Estoy intentando construir una aplicación web .NET usando SQL para consultar la base de datos AS400. Esta es la primera vez que encuentro el AS400.
¿Qué tengo que instalar en mi máquina (o el servidor AS400) para conectarme? (¿IBM iSeries Access para Windows?)
¿Cuáles son los componentes de la cadena de conexión?
¿Dónde puedo encontrar ejemplos de códigos para construir la capa de acceso a datos usando comandos SQL?
Gracias.
¡Estoy usando este código y me funciona muy bien!
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
Como se menciona en otras respuestas, si ya tiene instalado el cliente de IBM i Access, puede usar el paquete IBM.Data.DB2.iSeries.
Si no tiene el software IBM i Access, puede aprovechar JTOpen y utilizar los controladores de Java. Necesitarás el paquete JT400.78 que JT400.78 el Runtime de IKVM.
En mi caso, necesitaba consultar una base de datos DB2 en un AS400 y generar una DataTable. Encontré varias pistas y pequeños fragmentos de código, pero nada exhaustivo, así que quería compartir lo que pude crear en caso de que ayudara a alguien más:
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 conversión de RecordSet a DataTable es un poco torpe y me dio malos recuerdos de mis días de VBScript. Es probable que el rendimiento no sea cegador, pero funciona.
Lo siguiente es lo que hice para resolver el problema.
Instalado IBM i Access for Windows
. No gratuito
Referido los siguientes dlls en el proyecto
- IBM.Data.DB2.iSeries.dll
- Interop.cwbx.dll (si se utilizó Data Queue)
- Interop.AD400.dll (si se utilizó Data Queue)
Acceso a los datos
using (iDB2Command command = new iDB2Command())
{
command.Connection = (iDB2Connection)_connection;
command.CommandType = CommandType.Text;
command.Parameters.AddWithValue(Constants.ParamInterfaceTransactionNo, 1);
command.CommandText = dynamicInsertString;
command.ExecuteScalar();
}
Cadena de conexión
<add name="InterfaceConnection"
connectionString="Data Source=myserver.mycompany.com;User ID=idbname;Password=mypassxxx;
Default Collection=ASIPTA;Naming=System"/>
ACTUALIZAR
IBM no planea admitir IBM i Access para Windows en sistemas operativos más allá de Windows 8.1. El producto de reemplazo es IBM i Access Client Solutions
Necesita el proveedor de datos AS400 .Net. Consulte aquí: https://www.ibm.com/support/knowledgecenter/en/ssw_i5_54/rzaik/rzaikdotnetprovider.htm
Para ejemplos de cadenas de conexión, consulte aquí: https://www.connectionstrings.com/as-400/
Además, consulte el libro rojo para ejemplos de código y cómo comenzar. http://www.redbooks.ibm.com/redbooks/pdfs/sg246440.pdf
Pregunta extremadamente vieja, pero esto sigue siendo relevante. Necesitaba consultar nuestro AS / 400 usando .NET pero ninguna de las respuestas anteriores funcionó, así que terminé creando mi propio método usando 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; } }
Y lo usarías así:
DataSet results = query_iseries("YOUR DATA SOURCE", "YOUR SQL QUERY", new string[] { "param_one", "param_two" }, new string[] { "param_one_value", "param_two_value"});
Devuelve un DataSet
de los resultados devueltos. Si alguien necesita / quiere un método para insertar / actualizar valores dentro de IBM AS / 400, deje un comentario y lo compartiré ...
Recientemente encontré el controlador ADO.Net disponible en NuGet. Tengo el acceso de cliente de iSeries instalado en mi PC, por lo que no puedo decir si funciona como independiente, pero se conecta. El único problema es que no puedo ver ninguna tabla o procedimiento. Creo que puede haber un esquema o biblioteca o algo a lo que todavía no me he acostumbrado. Publicaré si encuentro la respuesta. Mientras tanto, aún puedo acceder al servidor y escribir la mayor parte de mi código con el adaptador NuGet.
Visite http://asna.com/us/ ya que tienen algunas herramientas de desarrollo que trabajan con SQL y AS400.