2

我正在测试一个简单的查询以从 AS400 数据库中获取数据。我不确定我使用 SQL 查询的方式是否正确。

我收到一个错误:“参数不正确。”

Select FIELD1, FIELD2 From Mylibrary.MyTable WHERE FIELD1 = @Field1

当我运行以下查询时,我没有收到错误:

Select FIELD1, FIELD2 From Mylibrary.MyTable WHERE FIELD1 = 'myvalue'

我正在使用 ADODB、VBScript 进行测试。

Set Param1 = cmd.CreateParameter("@Field1", 129, 1, 9, "myvalue")  ' 129 String
cmd.Parameters.Append Param1

我来自 MS Sql 环境,所以为 AS400 写作对我来说是全新的。
谢谢

4

3 回答 3

4

好的,我通过玩耍和尝试不同的事情得到了解决方案。

正如我之前所说,我习惯了 OLEDB 和 ADO.Net,所以我习惯于做以下事情:

Select FIELD1, FIELD2 From Mylibrary.MyTable WHERE FIELD1 = @Field1

它在 Access 和 SQL Server 中工作,但在 AS/400 中不工作。

我得到了以下工作:

Select FIELD1, FIELD2 From Mylibrary.MyTable WHERE FIELD1 = ?

cmd.ActiveConnection = connstr
cmd.CommandType = 1'4   'Stored Procedures '1 Text
cmd.CommandText = sql
Set Param1 = cmd.CreateParameter("@Field1", 129, 1, 9, "myvalue")  ' 129 String
cmd.Parameters.Append Param1
Set rs = cmd.Execute()

这都是 VbScript。诀窍是在 sql 语句中添加问号(?)。

于 2009-01-29T22:12:00.393 回答
2

如果您打算使用 .NET 连接到 AS400,首先您应该使用IBM的IBM.Data.DB2.iSeries .NET 提供程序。根据 IBM 的文档,这是调用 sql 的首选方法:

iDB2Connection conn = new IDB2Connnection(connectionstring);
iDB2Command cmd = null;

try
{
  conn.Open();
  string sql = "select * from somelibrary.sometable where a = @A and b = @B";
  cmd = conn.CreateCommand();
  cmd.CommandText = sql;
  cmd.DeriveParameters(); //this will talk to the AS400 to determine the param types
  cmd.Parameters["@A"].Value = Avalue;
  cmd.Parameters["@B"].Value = Bvalue;

  //execute the query
  cmd.ExecuteScalar(); //doesn't have to be Scalar but you get the idea
}
catch (Exception ex)
{
   //handle your exceptions
}
finally
{
  cmd.Dispose();
  conn.Close();
}
于 2009-02-04T22:18:21.283 回答
1

飞翔,

您可能使用系统命名约定而不是 SQL 命名约定进行连接。将 Mylibrary.Mytable(SQL 周期限定符)更改为 Mylibrary/Mytable(系统斜杠限定符)。

于 2009-01-29T20:17:14.133 回答