GetDeletEltecommand DataAdapter con una tabla temporal en Sybase
-
27-10-2019 - |
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);
}
}
}
}
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.