小编War*_*enT的帖子

从Sql Server 2008 R2连接到IBM i服务器

我有一个大问题:我必须连接(我只想读取数据,而不是写入)到我的客户的IBM AS/400(也就是iSeries,现在是IBM i)服务器......

我想我需要所有参数(由AS/400程序员给我),但我无法弄清楚我必须使用哪个驱动程序,以及我是否需要所有软件!

我已经安装了IBM AS/400 ClientAccess 5.8驱动程序(带有最新操作系统的补丁),现在我正在尝试Linked Server在我的Sql Server 2008 R2(x64)服务器中配置一个新的.

第一个问题:我应该使用哪个驱动程序?

我有很多选择(但也许这些都没有!):

IBM DB2 UDB for iSeries IBMDASQL OLE DB Provider
IBM DB2 UDB for iSeries IBMDA400 OLE DB Provider
IBM DB2 UDB for iSeries IBMDARLA OLE DB Provider
Run Code Online (Sandbox Code Playgroud)

......或者其他通用OLEDB/ODBC驱动程序?!

第二个问题:我应该在哪里放置参数(我的意思是哪个字段!)

无论如何,在我为我选择一个提供者时Linked Server,显然我必须设置我的参数......但我只有这个:

  • ADMIN用户的用户名
  • ADMIN用户的密码
  • AS/400服务器IP地址
  • 存储我的数据的"主"存档的名称(类似ACG_DATV2)

第三个问题:我该如何撰写查询?如何引用AS/400"存档"和表?

我不知道如何构建我的阅读查询:表和视图(?!)存储在哪里以及如何引用它们?

先感谢您!

sql-server oledb database-connection linked-server ibm-midrange

11
推荐指数
1
解决办法
2万
查看次数

C#ADO.NET IBM DB2命名参数具有相同的名称throws没有足够的参数指定Exception

我有一个相当不可知的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)

c# ado.net db2-400 ibm-midrange

10
推荐指数
1
解决办法
1376
查看次数

如何在as400上以编程方式运行复杂查询?

我是as400的新手,我有一个查询连接4个表.查询本身很好,它在STRSQL中运行并显示结果.

我正在努力解决的问题是让查询能够以编程方式运行(最终将从计划的CL脚本运行).

我尝试创建一个物理文件,其中包含使用RUNQRY运行它的查询,但它只显示查询本身,而不是实际结果集.

有谁知道我做错了什么?


UPDATE

感谢大家的方向和资源,我们能够实现我的目标.如果它可以帮助任何人,这就是我最终做的事情(所有这些都是在它自己的库中完成的,ALLOCATE):

  1. 创建了一个源物理文件(使用CRTSRCPF):QSQLSRC,并创建了一个名为SQLLEAGSEA的成员,其类型为TXT,其中包含SQL语句.

  2. 创建了另一个源物理文件:QCLSRC,并创建了一个名为POPLEAGSEA的成员,其类型为CLP,将当前库更改为ALLOCATE,然后使用RUNSQLSTM运行查询(下面有更多详细信息).这是实际的命令:

    RUNSQLSTM SRCFILE(QSQLSRC)SRCMBR(SQLLEAGSEA)COMMIT(*NONE)命名(*SYS)

  3. 将CLP添加到计划作业(使用ADDJOBSCDE),运行以下命令:

CALL PGM(ALLOCATE/POPLEAGSEA)

关于RUNSQLSTM,我的研究表明我不能使用这个函数,因为它不支持SELECT语句.我没有在我的问题中指出的是我需要对结果做什么 - 我将把结果数据插入到另一个表中(如果我这样做了,我确信帮助可能已经解决了很多问题)更快).如此有效,我不会做一个SELECT,我的最终结果实际上是一个INSERT.所以我的SQL语句(在SQLLEAGSEA中)以:

插入ALLOCATE/LEAGSEAS

选择...... BLAH BLAH BLAH ......

根据我的研究,我认为RUNSQLSTM不支持SELECT,因为它没有机制对结果做任何事情.一旦我停止采取婴儿步骤并意识到我需要在同一语句中选择和插入,它解决了我的主要问题.

再次感谢大家!

sql db2-400 ibm-midrange

9
推荐指数
1
解决办法
2万
查看次数

在SQL-Server中更新自动化

我正在做一个名为"考勤管理系统"的项目

该公司拥有自己的生物识别手指扫描仪,可检查员工的出勤情况并存储在数据库表中.

该表由4个字段组成 (ID autonumber, EmployeeNo, CheckTime and CheckType)

计时系统存储所有员工的日志和出勤,但不指定检查类型是"I"还是"O".正如您可以看到下面的图像,每次员工登录时,系统会自动将其存储到数据库,但存储为"I",当同一员工再次登录时,它将再次存储为"I".

在此输入图像描述

我的客户希望它尽可能自动化.一旦员工再次登录,他希望将checktype更改为"O".

例如:

我是一名员工.我今天早上8点登录,然后将存储到数据库中

今天早上8点用checktype"我"..因为我不知道我已经登录了,所以我在上午8:04第二次再次进入..系统再次将它存储为"I",就好像我一样我要在下午5点退出,系统也将其记录为"我"..

我希望这能自动更新数据库.没有用户提供的任何参数.我希望它在存储过程中自动化该过程.

它应该限制在同一个员工中:示例:

Employee1今天上午8点登录..(checktype"I")员工1今天上午11点再次登录...(检查类型"O")employee1再次登录于今天中午12点..(检查类型"我")employee1再次登录今天下午4点(checktype "O")

标准应限制在employeeseno,checktime only ..并且还希望根据给定的数据更新checktype.

旧系统无法将登录的ins存储为"O",它纯粹是"我".

这该怎么做?我需要你的投入和帮助!请?

我创建了一个存储过程,但不知道我可以在哪里启动它,我不知道完成该过程并使其工作..

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE AUTOMATIC_OVERRIDE
    @ID INT,
    @EMPLOYEENO NVARCHAR(20),
    @CHECKTIME DATETIME,
    @CHECKTYPE NVARCHAR(1)

AS
    SET NOCOUNT ON;
    WHILE @ID = (SELECT ID FROM CHECKTIME)

        SELECT ID,EMPLOYEENO,CHECKTIME,CHECKTYPE
          FROM CHECKTIME
         GROUP BY ID,EMPLOYEENO,CHECKTIME,CHECKTYPE
         ORDER BY CHECKTIME
GO
Run Code Online (Sandbox Code Playgroud)

请帮我解决这个问题.谢谢.

sql sql-server stored-procedures insert time-and-attendance

6
推荐指数
2
解决办法
1527
查看次数

从另一个表插入db2查询

我有一个表产品(id_product,name);

我有另一个:productHistory(id_H,id_product,name);

我想创建一个查询(db2)来插入productHistory中的所有产品行;

我有一个序列product_history_seq

我想做那样的事情:

insert into productHistory 
        (id_h ,  , id_product , name) 
  values ( product_history_seq.nextval,..
Run Code Online (Sandbox Code Playgroud)

要么,

select (id_product , name) from product
Run Code Online (Sandbox Code Playgroud)

什么是正确的查询?

db2

6
推荐指数
1
解决办法
4万
查看次数

AS400.validateSignon()不会将失败的登录尝试重置为0

当我使用com.ibm.as400.access.AS400.validateSignon()来验证用户的凭据并且他们通过验证并且已成功连接时,它不会将"失败的登录尝试"重置为0.

输入错误密码时,"登录尝试失败"字段会递增; 成功签署"失败的登录尝试"仍然保持有无效的登录.奇怪的是,"之前的登录"会使用正确的日期和时间进行更新.

这是as400上的DSPUSRPRF转储:

User profile . . . . . . . . . . . . . . . : BOB
Previous sign-on . . . . . . . . . . . . . : 12/12/05 21:34:08
Password verifications not valid . . . . . : 4
Status . . . . . . . . . . . . . . . . . . : *ENABLED
Run Code Online (Sandbox Code Playgroud)

我唯一能够通过使用工具箱禁用和重新启用用户来重置"失败登录尝试".这不是一个可行的解决方案,因为它会更新用户配置文件的更改日期和时间.

这种行为与处理我们的绿屏telnet会话的方式相矛盾,当用户登录as400时,"失败的登录尝试"被归零.

感谢任何建议和/或决议.

jt400 ibm-midrange

5
推荐指数
1
解决办法
1507
查看次数

如何在 DB2 IBM iseries 中编辑视图而不是删除然后重新创建它?

如何通过 System i Navigator 更改或编辑 DB2 中的视图?我不知道怎么做,因为它会删除建立在它上面的其他视图。

db2 ibm-midrange

4
推荐指数
1
解决办法
5321
查看次数

如何使用互斥参数创建AS/400命令?

我需要创建一个AS/400命令.根据要求,它有两个参数,比如A和B,它们不能同时填充.当按下F4提示时,两者都会显示,但一次只能填充一个.如果两者都填满,则会显示一条错误消息,指出此消息无效.有人能告诉我如何创建这样的命令吗?我需要在CMD源中指定什么来实现它?

command ibm-midrange

4
推荐指数
1
解决办法
2243
查看次数

db2中的'DECFLOAT'错误

查找错误-DB2数据库错误:错误[22018] [IBM] [DB2 / AIX64] SQL0420N在函数“ DECFLOAT”的字符串参数中找到无效字符。

查询----

SELECT 
   MSISDN,
   CONTRNO,
   TRANSDATE,
   TARIFF_GROUP,
   ACT_DURATION,
   BILLTEXT,
   GROSS_AMOUNT,
   CASE
       WHEN TARIFF_GROUP IN('PAG2')
       THEN DECIMAL((DECIMAL(ACT_DURATION,10,4)/10),20,4)*0.01
       ELSE 'CHECK'
   END RA_RATE
FROM HISTCALLS
WHERE call_type IN (50,
                    54)
  AND TRANSDATE = CURRENT date - 1 DAY
Run Code Online (Sandbox Code Playgroud)

db2 toad-scripting

4
推荐指数
1
解决办法
2万
查看次数

在DB2 for i上,搜索列,以列表形式返回表名

我仍然有点像菜鸟,所以请原谅这个问题是否有点明显.我确实在寻找答案,但要么无法理解我找到的答案如何应用,要么根本找不到答案.

我在DB2 for i服务器上有一个庞大的数据库,我通过SQLExplorer(基于Squirrel SQL)使用SQL访问它.这些表格记录很差,第一项业务就是弄清楚如何找到自己的方式.

我想写一个简单的查询来执行此操作:

1)允许我搜索整个数据库,查找包含名为"备注"(包含字段描述)的列的表.

2)然后我想让它在该列中搜索关键字.

3)我希望有一个表中返回,其中包括名称包含关键字(只是名称的表,我可以看一下表按字母顺序后,看看里面,如果我需要.)

我需要这个搜索超级轻量级​​,我希望我描述的概念能实现这一目标.任何占用大量资源的东西都可能会激怒服务器的系统管理员.

只是为了表明我已经尝试过(而且我是一个完整的菜鸟),这就是我迄今为止所拥有的.

SELECT *
FROM <dbname>
WHERE Remarks LIKE '<keyword>'
Run Code Online (Sandbox Code Playgroud)

随意嘲笑,我告诉你我是个白痴:-).

有帮助吗?或许至少可以推动正确的方向?

PS - 我似乎无法在SQLExplorer中找到搜索功能,如果有人知道我是否可以使用简单的搜索或过滤器来实现同样的目标......这将是很棒的.

sql db2 squirrel-sql ibm-midrange

3
推荐指数
1
解决办法
1万
查看次数