[英]Returning ResultSet from AS400 Stored Procedure
我正在努力使用C#控制台應用程序從AS400數據庫返回結果集...我可以連接到數據庫,我已經通過AS400日志驗證了連接但是我似乎遇到了以下錯誤:
System.InvalidCastException未處理Message =提供程序當前不支持返回的數據類型。 Source = IBM.Data.DB2.iSeries StackTrace:位於IBM.Data.DB2.iSeries.iDB2Command.setRowOfParameterData(MpDcData []&的IBM.Data.DB2.iSeries.iDB2DbTypeUtility.MapSQLTypeToDCPCType(DcSqlTypes sqlType,Int32 colccsid,UInt32長度) dcDataRow)位於IBM.Data.DB2.iSeries.iDB2Command.execute()位於C:\\ Users \\ harlim \\中GeacFutureDelivery.Program.Main(String [] args)的IBM.Data.DB2.iSeries.iDB2Command.ExecuteNonQuery() documents \\ visual studio 2010 \\ Projects \\ GeacFutureDelivery \\ GeacFutureDelivery \\ Program.cs:System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly,String [] args)第40行,位於System.AppDomain.ExecuteAssembly(String assemblyFile,Evidence assemblySecurity,String [] args )System.Threading上System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回調,對象狀態,布爾ignoreSyncCtx)的System.Threading.ThreadHelper.ThreadStart_Context(對象狀態)中的Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() .ExecutionContext.Run(Executi System.Threading.ThreadHelper.ThreadStart()上的onContext executionContext,ContextCallback回調,對象狀態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 [],我認為您在使用CCSID65535時遇到了一些問題。
如果是這樣,這里有一個解決它的代碼:-)
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.