GetDelettelCommand DataAdapter mit einer temporären Tabelle in Sybase
-
27-10-2019 - |
Frage
Portierung der MSSQL -Anwendung auf Sybase (ASE 15.0) und bei mir aufrufe ein Problem GetDeleteCommand
. Der gemeldete Fehler lautet:
Die dynamische SQL -Generation für den DeleteCommand wird nicht gegen einen Select -Command unterstützt, der keine wichtigen Spalteninformationen zurückgibt.
Das Problem tritt nur für eine temporäre Tabelle auf, identische nicht-zeitgenössische Tabelle funktioniert einwandfrei. Die Tabelle enthält einen Primärschlüssel.
Reproduziert unter Verwendung des Testprogramms unten.
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);
}
}
}
}
Lösung 2
Kontaktierte Sybase Support und stellte sich heraus, dass ich einige system gespeicherte Verfahren aktualisieren musste. Es gibt einen Ordner, der mit "OLEDB SP" endet, und ich musste eine .bat -Datei aus dem Ordner ausführen. Ich habe das neueste EBF und leitete die Batch -Datei install_oledb_procs.bat, das Problem verschwand. Erwähnenswert, dass Sybase 15.5 das Problem nicht ohne Patching hatte.
PS Vielen Dank an "AF" für Ihre Zeit, um das Problem zu untersuchen.
Andere Tipps
In der Auswahlanweisung anstelle von *
Verwenden Sie die Spaltennamen.