Вопрос

Портирование приложения 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

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

PS Спасибо «AF» за то, что вы рассмотрели проблему.

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top