AseBulkCopy.WriteToServer错误:","附近的语法不正确

2020-08-16 21:41发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


是否可以使用AseBulkCopy.WriteToServer填充临时表?

我在测试应用程序中两次调用了以下方法:首先使用非临时表,其次使用临时表。 该代码可以在非临时表上正常运行,但是在尝试填充临时表时出现错误:

','附近的语法不正确。

被提出。

在两种情况下,目标表和源表只有一列,定义为具有相同名称的INT。

我尝试使用DataTable和IDataReader作为数据源,并且都导致出现相同的错误。

我尝试在连接字符串中同时使用" EnableBulkLoad = 1"和" EnableBulkLoad = 2"。

我尝试同时使用原始临时表名称和以" dbo"为前缀的名称。

要加载的数据是单个int值(即1行,1列),尽管如果行较长或多行也将发生。

值得注意的是,我可以将数据插入到临时表中(使用AseCommand.ExecuteNonQuery),并且可以成功地从临时表中执行" SELECT COUNT(1)"(使用AseCommand.ExecuteScalar)。

这是代码:

私有静态无效BulkCopyInsertIntoTable(string tableName)

{

IDataReader dataSource = null;

SqlConnection sourceConnection = null;

MssqlCommand.GetDataReader(SqlServerConnectionString,out sourceConnection,out dataSource);

AseConnection targetConnection =新的AseConnection(SybaseConnectionString);

尝试

{

targetConnection.Open();

AseCommand cmd =新的AseCommand();

AseBulkCopy blk =新的AseBulkCopy(targetConnection);

blk.DestinationTableName = tableName;

//blk.ColumnMappings.Clear();

//blk.ColumnMappings.Add(new AseBulkCopyColumnMapping(0,0));//与数据源没有任何区别,导致数据表引发错误。

Console.WriteLine("将大副本插入表" + tableName +" ..starting:数据源");

//blk.WriteToServer(dataSource);

Console.WriteLine("将大副本插入表" + tableName +" ..starting:datatable");

blk.ColumnMappings.Clear();

DataTable dt = SybaseCommand.GetFakeDataTable(); ;

blk.WriteToServer(dt);

}

捕获(AseException ex)

{

Console.WriteLine(ex.Message);

}

最后

{

targetConnection.Dispose();

Console.WriteLine("将副本插入表" + tableName +" ..ended");

}

}

首先,可以使用WriteToServer填充临时表吗?

假设是这样,我可能做错了什么?

谢谢

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


是否可以使用AseBulkCopy.WriteToServer填充临时表?

我在测试应用程序中两次调用了以下方法:首先使用非临时表,其次使用临时表。 该代码可以在非临时表上正常运行,但是在尝试填充临时表时出现错误:

','附近的语法不正确。

被提出。

在两种情况下,目标表和源表只有一列,定义为具有相同名称的INT。

我尝试使用DataTable和IDataReader作为数据源,并且都导致出现相同的错误。

我尝试在连接字符串中同时使用" EnableBulkLoad = 1"和" EnableBulkLoad = 2"。

我尝试同时使用原始临时表名称和以" dbo"为前缀的名称。

要加载的数据是单个int值(即1行,1列),尽管如果行较长或多行也将发生。

值得注意的是,我可以将数据插入到临时表中(使用AseCommand.ExecuteNonQuery),并且可以成功地从临时表中执行" SELECT COUNT(1)"(使用AseCommand.ExecuteScalar)。

这是代码:

私有静态无效BulkCopyInsertIntoTable(string tableName)

{

IDataReader dataSource = null;

SqlConnection sourceConnection = null;

MssqlCommand.GetDataReader(SqlServerConnectionString,out sourceConnection,out dataSource);

AseConnection targetConnection =新的AseConnection(SybaseConnectionString);

尝试

{

targetConnection.Open();

AseCommand cmd =新的AseCommand();

AseBulkCopy blk =新的AseBulkCopy(targetConnection);

blk.DestinationTableName = tableName;

//blk.ColumnMappings.Clear();

//blk.ColumnMappings.Add(new AseBulkCopyColumnMapping(0,0));//与数据源没有任何区别,导致数据表引发错误。

Console.WriteLine("将大副本插入表" + tableName +" ..starting:数据源");

//blk.WriteToServer(dataSource);

Console.WriteLine("将大副本插入表" + tableName +" ..starting:datatable");

blk.ColumnMappings.Clear();

DataTable dt = SybaseCommand.GetFakeDataTable(); ;

blk.WriteToServer(dt);

}

捕获(AseException ex)

{

Console.WriteLine(ex.Message);

}

最后

{

targetConnection.Dispose();

Console.WriteLine("将副本插入表" + tableName +" ..ended");

}

}

首先,可以使用WriteToServer填充临时表吗?

假设是这样,我可能做错了什么?

谢谢

付费偷看设置
发送
8条回答
callcenter油条
1楼-- · 2020-08-16 22:16

嗨,

这听起来像是一个已知的ASE CR,它处理动态语句和临时表。

SAP CR815056。其描述为:

" A 208错误,"#未找到。 指定owner.objectname或使用sp_help来检查对象是否存在(sp_help可能会产生大量输出)。",可能会在重新编译创建临时表的准备好的语句批处理时报告。"。

感谢,
Dawn K。

打一壶酱油
2楼-- · 2020-08-16 22:16

我仅使用单个tempdb,它是默认的tempdb。


select tempdb_id()给您什么?



结果:2



shere_lin
3楼-- · 2020-08-16 22:17

当我换行时

blk.DestinationTableName = tableName;

blk.DestinationTableName =" XXXX";

我遇到同样的错误,因此在使用WriteToServer时是否有关于临时表命名的规则? tableName的值是我在直接INSERT和SELECT COUNT(1)查询中使用的值,因此我希望它是正确的,并且正如我所说,我已经在有&没有所有者的情况下尝试过。

Alawn_Xu
4楼-- · 2020-08-16 22:31

我认为我无法从那里下载任何内容

实际上,我得到了显示该错误消息的屏幕闪烁0.1秒:

我是小鹏鹏啊
5楼-- · 2020-08-16 22:19

嗨,

我正在尝试执行此线程的原始海报所执行的相同操作。

-打开数据库连接(打开会话)

-使用 ado.net 方法" ExecuteNonQuery"创建一个临时表

-使用" AseBulkCopy.WriteToServer"方法填充临时表。

-对临时表进行一些处理

-关闭数据库连接(关闭会话,删除临时数据库)

我正在运行的ASE数据库版本(在docker容器中运行)

Adaptive Server Enterprise/16.0 SP02 PL02/EBF 25320 SMP/P/x86_64/Enterprise Lin
ux/ase160sp02plx/2492/64-bit/FBO/Sat Nov 21 04:05:39 2015

我正在使用的 ADO.NET SDK的版本:SDK 16.0 SP03 PL04

这是有问题的代码的片段:

 string bulkConstring ="数据源=本地主机;端口= 5000;数据库= testdb; Uid = sa; Pwd = myPassword; EnableBulkLoad = 2";
             使用(var connection = new AseConnection(bulkConstring))
             {
                 connection.Open();
                 使用(var command = connection.CreateCommand())
                 使用(var aseBulkCopy = new AseBulkCopy(connection))
                 {
                     command.CommandText ="创建表#accounts(AccountId二进制(16),AccountTotalValue money,AccountOwner nvarchar(1000),OwnerAddress nvarchar(1000))";
                     command.ExecuteNonQuery();
                    
                     aseBulkCopy.DestinationTableName = $"#accounts";
                     aseBulkCopy.BulkCopyTimeout = 1200;

                    //列映射,哪些DataTable列映射到哪些SQL表列
                     aseBulkCopy.ColumnMappings.Add(new AseBulkCopyColumnMapping(0,0));
                     aseBulkCopy.ColumnMappings.Add(new AseBulkCopyColumnMapping(1,1));
                     aseBulkCopy.ColumnMappings.Add(new AseBulkCopyColumnMapping(2,2));
                     aseBulkCopy.ColumnMappings.Add(new AseBulkCopyColumnMapping(3,3));

                     aseBulkCopy.WriteToServer(myDataTable);//此处发生崩溃
                 }
             }
 

这是上面的代码生成的异常:

Sybase.Data.AseClient.AseException:','附近的语法不正确。

如果我将表名从" #accounts"更改为" accounts",则此代码有效。

我尝试按照此线程的建议更改DestinationTableName并收到以下错误

aseBulkCopy.DestinationTableName =" tempdb.dbo。#accounts";

生成以下异常:

找不到

tempdb.dbo。#accounts00000510021882346。 指定owner.objectname或使用sp_help检查对象是否存在(sp_help可能会产生大量输出)。

我确实意识到这是一个非常古老的线程。但是请告知我我还能尝试什么。

Violet凡
6楼-- · 2020-08-16 22:13

" 开发人员的试用和下载"不包含您提到的版本。

我正在尝试在家中学习和研究SDK,但没有任何SAP许可证。

有没有办法获得SP03 PL08 SDK? 我看到它存在于版本页面,但我似乎在任何地方都找不到它的下载链接。

谢谢

一周热门 更多>