gpt4 book ai didi

c# - 从 AS400 存储过程返回结果集

转载 作者:行者123 更新时间:2023-11-30 18:38:51 25 4
gpt4 key购买 nike

我正在努力使用 C# 控制台应用程序从 AS400 数据库返回结果集...我可以连接到数据库并且我已经通过 AS400 日志验证了连接但是我似乎遇到了以下错误:

System.InvalidCastException was unhandled Message=The data type returned is currently not supported by the provider. Source=IBM.Data.DB2.iSeries StackTrace: at IBM.Data.DB2.iSeries.iDB2DbTypeUtility.MapSQLTypeToDCPCType(DcSqlTypes sqlType, Int32 colccsid, UInt32 length) at IBM.Data.DB2.iSeries.iDB2Command.setRowOfParameterData(MpDcData[]& dcDataRow) at IBM.Data.DB2.iSeries.iDB2Command.execute() at IBM.Data.DB2.iSeries.iDB2Command.ExecuteNonQuery() at GeacFutureDelivery.Program.Main(String[] args) in C:\Users\harlim\documents\visual studio 2010\Projects\GeacFutureDelivery\GeacFutureDelivery\Program.cs:line 40 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() InnerException:

我的来源是:

var connectionString = "<Connection String>";
int startDate = 1120530;
int endDate = 1120602;

try
{
using (var connection = new iDB2Connection(connectionString))
{
connection.Open();

iDB2Transaction trans = connection.BeginTransaction();

iDB2Command command = connection.CreateCommand();


string query = "DRLOBJ01.GETORDPCD";
command.Transaction = trans;
command.CommandType = CommandType.StoredProcedure;
command.CommandText = query;
command.CommandTimeout = 0;

command.Parameters.Add("DTSTR", iDB2DbType.iDB2Integer).Value = startDate;
command.Parameters.Add("DTEND", iDB2DbType.iDB2Integer).Value = endDate;

command.Prepare();


using (iDB2DataReader reader = command.ExecuteReader())
{
int iCUSO51 = reader.GetOrdinal("CUSO51");
int iORDN51 = reader.GetOrdinal("ORDN51");
int iDTDR51 = reader.GetOrdinal("DTDR51");
int iOPST45 = reader.GetOrdinal("OPST45");

while (reader.Read())
{
if (!string.IsNullOrEmpty(reader.GetString(iCUSO51)))
{
Console.WriteLine((string)reader[iCUSO51]);
Console.WriteLine((string)reader[iORDN51]);
Console.WriteLine((string)reader[iDTDR51]);
Console.WriteLine((string)reader[iOPST45]);
}
}
}
}
}
catch (iDB2CommErrorException ex)
{
Console.WriteLine(ex.Message);
}
}

有什么想法吗?

最佳答案

如果您的值是一个 Byte[],我认为您遇到了 CCSID 65535 的一些问题。如果是这样,这里有一个解决它的代码:-)

 private DataTable parseCCSID65535(DataTable p_dt)
{
DataTable dt = new DataTable();

// Build a new DataTable
for (int i = 0; i < p_dt.Columns.Count; i++)
{
dt.Columns.Add(p_dt.Columns[i].Caption);
}

//loop through the rows
for (int r = 0; r < p_dt.Rows.Count; r++)
{
//create a new row
string[] row = new string[p_dt.Columns.Count];

//loop through all columns
for (int c = 0; c < p_dt.Columns.Count; c++)
{
if (p_dt.Rows[r][c].GetType() == typeof(System.Byte[]))
{
// if this value is CCSID65535, change it ;-)
iDB2CharBitData cbd = new iDB2CharBitData((Byte[])p_dt.Rows[r][c]);
row[c] = cbd.ToString(65535);
}
else
{
// else: go on.
row[c] = p_dt.Rows[r][c].ToString();
}
}
// passing to the new DataTable.
dt.Rows.Add(row);
}
return dt;
}

关于c# - 从 AS400 存储过程返回结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10833825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com