para example db2connection conexion cli cadena asp.net c#-4.0 odbc db2 ibm-midrange

asp.net - example - C#- Insertar mĂșltiples registros a la vez en AS400



download ibm db2 client (2)

Cuando dice <END-OF-STATEMENT> significa lo que dice, quiere que sea el final de la instrucción ejecutada. No recuerdo si el AS / 400 permite múltiples declaraciones por unidad de ejecución (en absoluto), pero claramente no está funcionando aquí. Y el conductor tampoco está lidiando con eso.

En realidad, tienes un problema más grande y más fundamental; específicamente, está INSERT una fila a la vez (generalmente conocida como fila por agonizar). DB2 permite una lista de filas separadas por comas en una cláusula VALUES (por lo tanto, INSERT INTO <table_name> VALUES(<row_1_columns>), (<row_2_columns>) ): ¿el controlador que está utilizando le permite proporcionar matrices (ya sea de toda la fila, o por columna)? De lo contrario, analice el uso de utilidades de extracción / carga para cosas como esta; puedo garantizarle que esto acelerará el proceso.

Tengo un problema como este:
1. Recupero datos de MySQL usando C # ASP .Net. -- hecho --
2. Todos los datos del n. ° 1 se insertarán en la tabla en AS400. - Recibí un error en este paso -

El mensaje de error dice que ERROR [42000] [IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0104 - Token ; was not valid. Valid tokens: <END-OF-STATEMENT>. ERROR [42000] [IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0104 - Token ; was not valid. Valid tokens: <END-OF-STATEMENT>. . Es cierto que utilicé punto y coma para separar las consultas entre sí, pero no está permitido. Busco en Google pero no puedo encontrar la solución.
Mi pregunta es qué significa <END-OF-STATEMENT> de ese mensaje de error ...?
Aquí está mi código fuente.

private static void doInsertDOCADM(MySqlConnection conn) { // Get Temporary table String query = "SELECT * FROM TB_T_DOC_TEMPORARY_ADM"; DataTable dt = CSTDDBUtil.ExecuteQuery(query); OdbcConnection as400Con = null; as400Con = CSTDDBUtil.GetAS400Connection(); as400Con.Open(); if (dt != null && dt.Rows.Count > 0) { int counter = 1, maxInsertLoop = 50; using (OdbcCommand cmd = new OdbcCommand()) { cmd.Connection = as400Con; foreach (DataRow dr in dt.Rows) { cmd.CommandText += "INSERT INTO DCDLIB.WDFDOCQ VALUES " + "(?,?,?,?);"; cmd.Parameters.Add("1", OdbcType.VarChar).Value = dr["PROD_MONTH"].ToString(); cmd.Parameters.Add("2", OdbcType.VarChar).Value = dr["NEW_MAIN_DEALER_CD"].ToString(); cmd.Parameters.Add("3", OdbcType.VarChar).Value = dr["MODEL_SERIES"].ToString(); cmd.Parameters.Add("4", OdbcType.VarChar).Value = dr["MODEL_CD"].ToString(); if (counter < maxInsertLoop) { counter++; } else { counter = 1; cmd.ExecuteNonQuery(); cmd.CommandText = ""; cmd.Parameters.Clear(); } } if (counter > 1) cmd.ExecuteNonQuery(); } }

Notas: Utilicé esta opción (Recolectar algunas consultas primero y luego ejecutar esas consultas) para mejorar el rendimiento de mi aplicación.


Como señaló Clockwork-Muse, el problema es que solo se puede ejecutar una sola instrucción SQL en un comando. El servidor iSeries no maneja múltiples declaraciones a la vez.

Si su servidor iSeries ejecuta V6R1 o posterior, puede usar inserciones de bloques para insertar varias filas. No estoy seguro de poder hacerlo a través del controlador ODBC, pero como tiene acceso de cliente, debe poder instalar el controlador iSeries ADO.NET. No existen muchas diferencias entre el controlador ADO.NET iSeries y el ODBC, pero con ADO.NET tiene acceso a las funciones específicas de iSeries.

Con el controlador ADO.NET, la inserción múltiple se convierte en una simple cuestión de:

using (iDB2Connection connection = new iDB2Connection(".... connection string ...")) { // Create a new SQL command iDB2Command command = new iDB2Command("INSERT INTO MYLIB.MYTABLE VALUES(@COL_1, @COL_2", connection); // Initialize the parameters collection command.DeriveParameters(); // Insert 10 rows of data at once for (int i = 0; i < 20; i++) { // Here, you set your parameters for a single row command.Parameters["@COL_1"].Value = i; command.Parameters["@COL_2"].Value = i + 1; // AddBatch() tells the command you''re done preparing a row command.AddBatch(); } // The query gets executed command.ExecuteNonQuery(); } }

También hay un código de referencia proporcionado por IBM para hacer insertos de bloques usando VB6 y ODBC, pero no estoy seguro de que pueda ser fácilmente portado a .NET: http://publib.boulder.ibm.com/infocenter/iseries/v5r4 /index.jsp?topic=%2Frzaik%2Frzaikextfetch.htm

Espero que ayude.