GetDeleteCommand DataAdapter с временной таблицей в Sybase - PullRequest
1 голос
/ 01 декабря 2011

Портирование приложения MSSQL на Sybase (ASE 15.0) и возникновение проблемы при вызове GetDeleteCommand.Сообщается об ошибке:

Динамическая генерация SQL для DeleteCommand не поддерживается для SelectCommand, которая не возвращает никакой ключевой информации столбца.

Проблема возникает только для временныхстол, идентичный невременный стол отлично работает.Таблица содержит первичный ключ.

Воспроизводится с использованием программы тестирования ниже.



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


Ответы [ 2 ]

1 голос
/ 05 декабря 2011

Связь с Sybase, оказывается, мне пришлось обновить некоторые системные хранимые процедуры. Есть папка, которая заканчивается на «oledb \ sp», и мне пришлось запустить файл .bat из папки. Я получил последнюю версию ebf и запустил командный файл install_oledb_sprocs.bat, проблема исчезла. Стоит отметить, что у sybase 15.5 не было проблемы без исправлений.

P.S. Спасибо «aF» за то, что уделили время на изучение вопроса.

1 голос
/ 02 декабря 2011

В операторе выбора вместо * используйте имена столбцов.

...