题
数据库服务器从版本12.5X迁移到版本15.03 Sybase.data.Aseclient版本-1.15.50.0
当我通过 .Net 应用程序(使用 AseClient)运行一些存储过程时,出现以下异常
Internal Error :30016 Unknown Dataitem Dataitem Stack Trace - at Sybase.Data.AseClient.AseDataReader.CheckResult(Int32 res) at Sybase.Data.AseClient.AseDataReader.RetrieveNextResult() at Sybase.Data.AseClient.AseDataReader.GetNextResult() at Sybase.Data.AseClient.AseDataReader.NextResult() at Sybase.Data.AseClient.AseDataReader.CloseUrsHandle() at Sybase.Data.AseClient.AseDataReader.Close() at Sybase.Data.AseClient.AseDataReader.Dispose(Boolean disposing) at Sybase.Data.AseClient.AseDataReader.Dispose() at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable) at HSBC.STPMapper.SybaseDAL.Utilities.SybaseHelper.ExecuteDataset(CommandType commandType, String commandText, DataSet dataset, String table, AseParameter[] commandParameters) in C:\Utilities\SybaseHelper.cs:line 119
注意 - 在我们迁移到新服务器之前,应用程序运行良好。
解决方案
我们都遇到这个问题,用下.NET Framework 3.5的运行,并使用一些代码的 Sybase.Data.AseClient.dll (版本1.1.510.0),当我们升级了我们的生产服务器从12.5到15 。一切都在开发和测试环境中运作良好升级后,但在生产中失败了,尽管ASP经典代码和PowerBuilder代码能够调用生产Sybase服务器上(大旧系统)。
如果我试图调用的读强>的 AseDataReader 强>的单个记录方法,一切都很好。但是,如果我们允许读取所有的记录,这将只读22出的67条记录,如果你通过的Sybase SQL Advandage客户端调用存储过程将被检索。我煮下来到一个玩具命令行应用程序来重现问题。下面是错误的详细信息,将出面了的阅读
Type: Sybase.Data.AseClient.AseException
Message: Internal Error: 30016
StackTrace: at Sybase.Data.AseClient.AseDataReader.?(Int32 A_0)
at Sybase.Data.AseClient.AseDataReader.?(Boolean A_0)
at Sybase.Data.AseClient.AseDataReader.?()
at Sybase.Data.AseClient.AseDataReader.Read()
at SybaseError.Program.TestCall(String friendlyName, String connectionString)
in C:\Projects\SybaseUpgradeError\SybaseError\Program.cs:line 42
假设你宣布您的的IDataReader / AseDataReader 在是块,你会真正得到以下错误,当读者出去的范围时,从最初的错误的读强>被抛出:
Type: Sybase.Data.AseClient.AseException
Message: Internal Error: 30016
StackTrace: at Sybase.Data.AseClient.AseDataReader.?(Int32 A_0)
at Sybase.Data.AseClient.AseDataReader.?(Boolean A_0)
at Sybase.Data.AseClient.AseDataReader.?()
at Sybase.Data.AseClient.AseDataReader.?()
at Sybase.Data.AseClient.AseDataReader.?(Boolean A_0)
at Sybase.Data.AseClient.AseDataReader.NextResult()
at Sybase.Data.AseClient.AseDataReader.?()
at Sybase.Data.AseClient.AseDataReader.Close()
at Sybase.Data.AseClient.AseDataReader.?(Boolean A_0)
at Sybase.Data.AseClient.AseDataReader.Dispose()
at SybaseError.Program.TestCall(String friendlyName, String connectionString)
in C:\Projects\SybaseUpgradeError\SybaseError\Program.cs:line 54
您会发现,在的Dispose 的 AseDataReader 抛出一个异常,这是一个很大的方法不行的。更糟的是,如果你捕获该异常为 AseException 并迭代的错误集合属性,读那些会抛出异常。显然,检查的性能的的 AseError 强>对象实际调用一些动态代码在试图从一个活动连接看东西的性质。我没有特别这个版本的的Sybase .NET客户端代码的印象深刻。
在问题归结为一个分组尺寸设置为生产服务器比开发和测试的服务器上的不同。我没有管理权限,但我相信他们被设定的开发和测试服务器,但两者的最小值和最大值设置闵2048和4096最高到4096在生产服务器上。这是基于我的一个电话会议的回忆,所以你的里程可能会有所不同。我只想把它列在这里的情况下,它可以帮助别人之后。我们花了一段时间来追踪问题了。更改最小包大小和重新启动生产数据库服务器并解决问题为我们。
在情况下,它可以帮助,这里有擦洗连接字符串我的测试控制台应用程序。同样,在底部的注释行会,如果没有注释抛出错误。希望这可以帮助你!
using System;
using System.Data;
using Sybase.Data.AseClient;
namespace SybaseError
{
public class Program
{
public static void Main(string[] args)
{
const string DevelopmentConnection = "Data Source='**********';Port='****';UID='**********';PWD='**********';Database='**********';";
const string ReportConnection = "more secret stuff";
const string ProductionConnection = "yet more secret stuff";
TestCall("Development", DevelopmentConnection);
TestCall("Report", ReportConnection);
TestCall("Production", ProductionConnection);
Console.ReadKey();
}
private static void TestCall(string friendlyName, string connectionString)
{
Console.WriteLine("Calling procedure on " + friendlyName + ".");
int recordsRead = 0;
try
{
using (var connection = new AseConnection(connectionString))
{
connection.Open();
using (var command = connection.CreateCommand())
{
ConfigureCommand(command);
using (var reader = command.ExecuteReader(CommandBehavior.CloseConnection))
{
try
{
while (reader.Read())
{
// Would usually read things here...
recordsRead++;
}
}
catch (Exception exRead)
{
Console.WriteLine("Error on read:");
ShowError(exRead);
throw;
}
}
}
}
Console.WriteLine("Success calling procedure on " + friendlyName + ".");
}
catch (Exception ex)
{
Console.WriteLine("Outer error:");
ShowError(ex);
Console.WriteLine("Failure calling procedure on " + friendlyName + ".");
}
Console.WriteLine("Finished calling procedure on " + friendlyName + ". Read " + recordsRead + " records.");
Console.WriteLine(string.Empty);
}
private static void ConfigureCommand(AseCommand command)
{
command.CommandText = "sp_s_educator_route_tests";
command.CommandType = CommandType.StoredProcedure;
var spidParameter = new AseParameter("@spid", AseDbType.Integer);
spidParameter.Value = 1355945;
command.Parameters.Add(spidParameter);
var vendorIdParameter = new AseParameter("@vendor_id", AseDbType.Integer);
vendorIdParameter.Value = 1;
command.Parameters.Add(vendorIdParameter);
}
private static void ShowError(Exception ex)
{
Console.WriteLine("Type: " + ex.GetType());
Console.WriteLine("Message: " + ex.Message);
Console.WriteLine("StackTrace: " + ex.StackTrace);
var exAse = ex as AseException;
if (exAse != null)
{
//foreach (AseError error in exAse.Errors)
//{
// Console.WriteLine("SqlState: " + error.SqlState);
// Console.WriteLine("State: " + error.State);
//}
}
}
}
}
其他提示
看一下 这;看起来您的数据存在问题,Sybase 现在对此更加挑剔。
有几件事情,你可能要检查。首先做一个SMALLDATETIME是NOT NULL的工作,当你得到这个错误。如果是的话,你可以将其更改为可为空,看看是否能解决问题。其次看看的ODBC DSN数据包大小,如果是8192尝试将其设置到4096。
我希望它能帮助。