Pregunta

Portación de la aplicación MSSQL a SYBASE (ASE 15.0), y experimentar un problema cuando llamo GetDeleteCommand. El error informado es:

La generación Dynamic SQL para DeleteCommand no es compatible con un SelectCommand que no devuelve ninguna información de columna clave.

El problema solo ocurre para la tabla temporal, la tabla no temporal idéntica funciona bien. La tabla contiene una clave primaria.

Reproducido utilizando el programa de prueba a continuación.



    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data.OleDb;
    using System.Data;

    namespace DataAdapterTempTable
    {
        class Program
        {
            static void Main(string[] args)
            {
                String ConnectionString = "Provider=ASEOLEDB;Data Source=devsun3:5003;Initial Catalog=ctc;User ID=aigtac12;Password=aigtac12;"; // sybase connection string
                //String ConnectionString = "Provider=SQLOLEDB;Data Source=fiji;Persist Security Info=False;Initial Catalog=nxgn0811;Integrated Security=SSPI"; // mssql connection string

                String TableName = "#alex_temporary_table_test"; // does not work for sybase
                //String TableName = "alex_real_table_test"; // works for sybase + mssql

                String CreateStatement = "create table " + TableName + " (currency_id varchar(4) primary key, rate  decimal(25,6), format   char(1))";

                String SelectStatement = "select * from " + TableName;

                try
                {
                    OleDbConnection con = null;
                    con = new OleDbConnection(ConnectionString);
                    con.Open();

                    OleDbCommand cmd = con.CreateCommand();
                    cmd.CommandType = CommandType.Text;
                    cmd.CommandText = CreateStatement;
                    int count = cmd.ExecuteNonQuery();

                    OleDbCommand cm1 = con.CreateCommand();
                    cm1.CommandType = CommandType.Text;
                    cm1.CommandText = SelectStatement;
                    OleDbDataAdapter DA2 = new OleDbDataAdapter(cm1);
                    DataTable DT2 = new DataTable();
                    DA2.FillSchema(DT2, SchemaType.Mapped);
                    OleDbCommandBuilder cmdbldr = new OleDbCommandBuilder(DA2);
                    DA2.InsertCommand = cmdbldr.GetInsertCommand();

                    DA2.DeleteCommand = cmdbldr.GetDeleteCommand(); // this line fails in sybase for temporary table

                    DA2.UpdateCommand = cmdbldr.GetUpdateCommand();
                    DA2.Fill(DT2);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            }
        }
    }


¿Fue útil?

Solución 2

Contactó el soporte de Sybase, resulta que tuve que actualizar algunos procedimientos almacenados del sistema. Hay una carpeta que termina con "OLEDB SP", y tuve que ejecutar un archivo .bat desde la carpeta. Obtuve el último EBF y ejecuté el archivo por lotes install_oledb_sprocs.bat, el problema desapareció. Vale la pena mencionar que Sybase 15.5 no tenía el problema sin parchear.

PD: Gracias a 'AF' por su tiempo investigando el problema.

Otros consejos

En la instrucción seleccionar, en lugar de * Use los nombres de la columna.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top