GetDeleteCommand DataAdapter在Sybase中有一个临时表

时间:2011-12-01 19:10:38

标签: sybase-ase dataadapter temporary

将MSSQL应用程序移植到Sybase(ASE 15.0),并在调用GetDeleteCommand时遇到问题。 报告的错误是:

  

不支持DeleteCommand的动态SQL生成   一个不返回任何键列信息的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 个答案:

答案 0 :(得分:1)

在select语句中,而不是*使用列名。

答案 1 :(得分:1)

联系Sybase支持,结果我不得不更新一些系统存储过程。有一个以“oledb \ sp”结尾的文件夹,我必须从该文件夹运行.bat文件。我得到了最新的ebf并运行了批处理文件install_oledb_sprocs.bat,问题就消失了。值得一提的是,没有补丁,sybase 15.5没有问题。

P.S。感谢你在'aF'中研究这个问题。