我正在使用AS400,我被要求从绿屏调用Web服务.
这怎么可能实现呢?
任何样本COBOL或CL代码都非常有用.
我已经尝试了一段时间来获得GETDATE()DB2 for i中的类似方法.到目前为止,我发现了以下内容:
current date
current timestamp
current time
Run Code Online (Sandbox Code Playgroud)
我有可能:
select specific, columns
from table
where datefield = current date - 1 day
Run Code Online (Sandbox Code Playgroud)
这是最有效的方式还是有一些方法我可能还没有找到?
编辑:
我目前有这个:
WHERE datefield = - days(date('2013-10-28'))
Run Code Online (Sandbox Code Playgroud)
虽然这没有用,因为我需要每天编辑它以运行查询.
现在来到这个:
WHERE datefield = VARCHAR_FORMAT(CURRENT TIMESTAMP, 'YYYYMMDD') - 1
Run Code Online (Sandbox Code Playgroud)
除非这个在一月的第一天不起作用,因为1 - 1 = 0并且一个月内没有第0天......
我有一个相当不可知的ADO.NET应用程序,它连接到许多数据库,并能够提取运行所需的信息.我遇到了DB2以及它如何处理命名参数,特别是当我在同一个查询中重用一个命名参数时.我知道有几种方法可以通过简单地添加更多参数来解决这个问题,但理论上它应该像我连接到的其他数据库一样工作,因为参数名称是相同的.
我正在做的事情有点复杂,涉及子查询等,但为了演示,请采取以下查询:
从test.table中选择值,其中cola = @ key1和colb = @ key1;
命名参数@ key1使用两次.
我的代码如下:
try
{
DbProviderFactory dbfFactory = DbProviderFactories.GetFactory("IBM.Data.DB2.iSeries");
using (DbConnection dbConnection = dbfFactory.CreateConnection())
{
dbConnection.ConnectionString = "DataSource=xxx.xxx.xxx.xxx;UserID=xxxxxxxx;password=xxxxxxxxx";
using (DbCommand dbCommand = dbConnection.CreateCommand())
{
IDbDataParameter iddpParameter1 = dbCommand.CreateParameter();
iddpParameter1.ParameterName = "@key1";
iddpParameter1.DbType = DbType.String;
iddpParameter1.Value = "1";
dbCommand.Parameters.Add(iddpParameter1);
dbCommand.CommandType = CommandType.Text;
dbCommand.CommandText = "select value from test.table where cola=@key1 and colb=@key1";
dbConnection.Open();
using (IDataReader idrReader = dbCommand.ExecuteReader())
{
while (idrReader.Read())
{
...
}
}
}
} // end dbConnection …Run Code Online (Sandbox Code Playgroud) 我正在尝试用Python中的AS400交谈.目标是使用SQLAlchemy,但是当我无法使用它时,我只使用ibm_db而不是ibm_db_sa来回到更基本的脚本.
import ibm_db
dbConnection = ibm_db.pconnect("DATABASE=myLibrary;HOSTNAME=1.2.3.4;PORT=8471;PROTOCOL=TCPIP;UID=username;PWD=password", "", "") #this line is where it hangs
print ibm_db.conn_errormsg()
Run Code Online (Sandbox Code Playgroud)
问题似乎是端口.如果我使用我在所有示例中看到的50000,我会收到错误.如果我使用446,我会收到错误.令人困惑的部分是:如果我使用8471,IBM说要做,我没有错误,没有超时,没有任何响应.我让脚本运行了二十多分钟,它只是坐在那里,什么都不做.它是活跃的,因为我根本不能使用命令提示符,但它从来没有给我任何反馈.
我每天工作的公司使用同样的400,用于日志记录,电子邮件和(大量)数据库使用,所以我知道它有效.我们使用的软件,在幕后与数据库通信,在我的机器上运行得很好.这告诉我我的驱动程序是好的,网络设置是正确的,等等.我甚至可以从这里远程登陆400.
我在SQLAlchemy和ibm_db电子邮件列表上,并且已经与他们沟通了好几天关于这个问题.我也搜索了这么多,我开始在搜索结果中用完未访问过的链接.似乎没有人无限期地悬挂连接的问题.如果有什么我可以在Python中尝试,我会尝试.我没有直接处理400,但我可以问那些检查/配置我需要的人.正如我所说的,几个工作站可以毫无问题地与400的数据库通信,并且如果从400本身运行,则针对我想要访问的库运行的查询工作正常.如果有人有任何建议,我将非常感谢听到他们.谢谢!
是否可以使用SQL生成iSeries源文件中所有源成员的列表?
可能类似于从SYSTABLES和SYSCOLUMNS获取表定义,但到目前为止我找不到任何东西.
我找到了http://www.iseriespython.com/,它是iSeries的Python版本,显然包括一些特定于系统的数据访问类.我很想尝试这一点,但必须得到批准才能这样做.我的问题是:
端口是否运行良好,或者与标准Python实现相比,解释器可以处理的是什么?
iSeries数据库访问层是否运行良好,从表定义创建可用对象?
我是as400的新手,我有一个查询连接4个表.查询本身很好,它在STRSQL中运行并显示结果.
我正在努力解决的问题是让查询能够以编程方式运行(最终将从计划的CL脚本运行).
我尝试创建一个物理文件,其中包含使用RUNQRY运行它的查询,但它只显示查询本身,而不是实际结果集.
有谁知道我做错了什么?
感谢大家的方向和资源,我们能够实现我的目标.如果它可以帮助任何人,这就是我最终做的事情(所有这些都是在它自己的库中完成的,ALLOCATE):
创建了一个源物理文件(使用CRTSRCPF):QSQLSRC,并创建了一个名为SQLLEAGSEA的成员,其类型为TXT,其中包含SQL语句.
创建了另一个源物理文件:QCLSRC,并创建了一个名为POPLEAGSEA的成员,其类型为CLP,将当前库更改为ALLOCATE,然后使用RUNSQLSTM运行查询(下面有更多详细信息).这是实际的命令:
RUNSQLSTM SRCFILE(QSQLSRC)SRCMBR(SQLLEAGSEA)COMMIT(*NONE)命名(*SYS)
将CLP添加到计划作业(使用ADDJOBSCDE),运行以下命令:
CALL PGM(ALLOCATE/POPLEAGSEA)
关于RUNSQLSTM,我的研究表明我不能使用这个函数,因为它不支持SELECT语句.我没有在我的问题中指出的是我需要对结果做什么 - 我将把结果数据插入到另一个表中(如果我这样做了,我确信帮助可能已经解决了很多问题)更快).如此有效,我不会做一个SELECT,我的最终结果实际上是一个INSERT.所以我的SQL语句(在SQLLEAGSEA中)以:
插入ALLOCATE/LEAGSEAS
选择...... BLAH BLAH BLAH ......
根据我的研究,我认为RUNSQLSTM不支持SELECT,因为它没有机制对结果做任何事情.一旦我停止采取婴儿步骤并意识到我需要在同一语句中选择和插入,它解决了我的主要问题.
再次感谢大家!
我的SQL Server 2005计算机上有2个预定作业,计划每天早上(凌晨2点左右)运行.这些工作一直很好(大多数情况下)多年,虽然我有一些打嗝,但我必须解决这个问题,这完全是让我感到困惑.
两个早上,我的一个软件包开始报告以下错误:
Executed as user: [Service Acount]. ...n 9.00.4035.00 for 32-bit
Copyright (C) Microsoft Corp 1984-2005. All rights reserved.
Started: 1:15:01 AM Error: 2012-10-17 01:15:03.98
Code: 0xC0016016
Source:
Description: Failed to decrypt protected XML node "DTS:Password"
with error 0x8009000B "Key not valid for use in specified state.".
You may not be authorized to access this information. This error
occurs when there is a cryptographic error. Verify that the
correct key is available. End Error Error: 2012-10-17 01:15:03.99
Code: …Run Code Online (Sandbox Code Playgroud) 我正在转换旧的仅使用tcp的服务器以使用SSL(通过IBM的GSkit),其中一个问题是将SSL句柄转换为生成的程序.原始代码将原始套接字传递给via givedescriptor(),然后用于takedescriptor()获取然后使用传入的套接字.
是否有GSKit/SSL等同于给/取说明方法?
givedescriptor() API文档
更新:
问题是socket和SSLHandle是在一个进程中创建的,它初始化了SSL环境,然后需要完全传递给另一个进程 - 因此需要提供/获取描述符,因为socket/SSLHandle需要'给予新流程(它实际上是一个提交并独立于原始程序运行的RPG程序).
更新2:
从另一篇文章(没有基于代码的答案,但书面解决方案)
"看起来会话句柄只是堆中某些存储的指针.由于单级存储的设计,你可以通过共享内存(memmap,shmget/shmat,...)复制它们.你只需要确保打开GSK环境的过程不会消失,或者激活组将被清除,并且这些指针将变为无效.如果你有多个,你也可能需要在它们周围加一个互斥锁或其他一些锁定原语.访问共享数据结构的线程."
更新3:
这是我用来在进程之间共享内存的示例 - 示例:使用信号量集和共享内存函数,但仍未完全解决问题.
更新4:
我想我会添加更多细节,说明为什么我需要提出这个问题.我正在更改一个非阻塞TCP服务器,该服务器用作IBM i的连接点.它具有处理连接的"标准"机制,创建线程并协商这些线程中的连接.然后线程创建独立的进程(via sbmjob).在vanilla TCP版本中,我们可以通过give/takedescriptor函数为正在运行的作业提供套接字的句柄,并将快速写入套接字和从套接字写入.
所以我需要一种等效的方法来让独立运行的程序能够写入SSL.
也许这对当前机制来说是不可能的.
我试图从iSeries(AS/400)上的DB2中的查询结果创建一个分隔字符串.我在T-SQL中完成了这个,但是在这里找不到办法.
这是我在T-SQL中的代码.我正在寻找DB2中的equivelant.
DECLARE @a VARCHAR(1000)
SELECT @a = COALESCE(@a + ', ' + [Description], [Description])
FROM AP.Checkbooks
SELECT @a
Run Code Online (Sandbox Code Playgroud)
如果我表中的描述如下所示:
说明1
说明2
说明3
然后它会返回:
描述1,描述2,描述3