GetDeleteCommand DataAdapter с временной таблицей в Sybase
-
27-10-2019 - |
Вопрос
Портирование приложения 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 вместо *
Используйте имена столбцов.