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);
                }
            }
        }
    }


War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top