【问题标题】:How do I call an Informix Stored Procedure from .Net如何从 .Net 调用 Informix 存储过程
【发布时间】:2013-11-08 19:23:18
【问题描述】:

我一直在绞尽脑汁,似乎找不到这个问题的答案。我对 Informix 知之甚少。 我需要调用一个名为 getagentstateintervaldata 的 Informix 过程

过程的参数和类型是:

    p_eStartDate, DATETIME
    p_startTime, DATETIME
    p_endTime, DATETIME
    p_rgSelected, SMALLINT
    p_skillSelected, SMALLINT
    p_tmSelected, SMALLINT

我正在使用 IBM Informix ODBC 驱动程序版本 3.70 Visual Studio 2010、VB.Net、.Net Framework 3.5

这是我用来触发该过程的代码。

首先是我用来确保我可以连接到数据库并获取数据的测试代码。 这段代码工作正常,我得到了 dtData 数据表中返回的数据。

    Dim dtData As Data.DataTable = New Data.DataTable
    Dim xQuery As String = ""

    xQuery = "Select *, (t2.EventDateTime + INTERVAL(-6) HOUR TO HOUR) as NewDatTime "
    xQuery += "From Resource as t1 "
    xQuery += "INNER JOIN AgentStateDetail AS t2 ON t2.agentID = t1.resourceID and t1.dateInactive is null  "
    xQuery += "Where t1.ResourceLoginId LIKE '51cserv%' "
    xQuery += "Order By t2.EventDateTime;"

    Dim conn As OdbcConnection = New Odbc.OdbcConnection(sysODBCConnStr)
    conn.ConnectionTimeout = 0

    Dim objCmd As New Odbc.OdbcDataAdapter(xQuery, conn)

    conn.Open()
    'Fill the dataset
    objCmd.Fill(dtData)

    'Close connection
    If conn.State = Data.ConnectionState.Open Then conn.Close()
    conn.Dispose()

现在是触发 Informix 过程的代码。 这是不断给我错误的那个。我没有任何方法可以像 MS SQL 的管理工作室那样连接到 Informix 数据库。

    Dim dtData As Data.DataTable = New Data.DataTable
    Dim xQuery As String = ""

    xQuery = "execute procedure getagentstateintervaldata (date('11-01-13'),to_date('12:01:00.00', '%H:%M'),to_date('11:59:59.00', '%H:%M'),1,1,1)"

    Dim conn As OdbcConnection = New Odbc.OdbcConnection(sysODBCConnStr)
    conn.ConnectionTimeout = 0

    Dim objCmd As New Odbc.OdbcDataAdapter(xQuery, conn)

    conn.Open()
    'Fill the dataset
    objCmd.Fill(dtData)

    'Close connection
    If conn.State = Data.ConnectionState.Open Then conn.Close()
    conn.Dispose()

我得到的错误是:

错误 [22008] [Informix][Informix ODBC 驱动程序][Informix] 日期时间或间隔值中的字段不正确或在日期时间字段上指定了非法操作。

编辑 - 在这里要清楚一点,我的问题出在 Informix 过程调用中。我不理解正在返回的错误,并且我发现 IBM Informix 论坛的帮助很少。

感谢大家能给我的任何帮助。

【问题讨论】:

  • 不熟悉informix。但听起来您的日期时间有问题,如果您使用相同的日期编写选择以检查转换是否正确发生怎么办?这会让您知道您的输入是否正常或存储过程调用中有问题?
  • 谢谢AJP,我该怎么做?
  • 只是有用的信息,而不是答案。使用 Informix 日期时间数据类型时,您必须告知范围,例如 datetime year to seconddatetime hour to fraction,其中选项/限制是年、月、日、小时、分钟、秒、分数...引号)到日期时间字段,您必须编写具有相同限制/范围的文字
  • 现在我的想法是……你的to_date('12:01:00.00', '%H:%M') 格式错误,应该是to_date('12:01', '%H:%M')to_date('12:01:00.00', '%H:%M:%S.%F')

标签: sql vb.net visual-studio-2010 stored-procedures informix


【解决方案1】:

您的问题与 .NET 无关,而与您的 SQL 有关。基本上你在做的是:

执行过程 getagentstateintervaldata (date('11-01-13'),to_date('12:01:00.00', '%H:%M'),to_date('11:59:59.00', '%H :%M'),1,1,1)

我在这段代码中发现了两个问题:

1- 如果您在 to_date() 的第一个参数中指定小时、分钟、秒和分数,那么您必须在第二个参数中使用它们 (%H:%M%S%F)。根据您的引擎版本,“。”在 %S 和 %F 之间。

2- 您正在从 11-01-13 创建一个 date()。这可能不明确,具体取决于您的环境设置(DBDATE 环境变量)。更好的方法是使用 MDY()

希望这会有所帮助。问候

【讨论】:

  • 谢谢费尔南多,我知道问题在于执行过程的 SQL 调用,我需要的是对 Informix 的过程调用的帮助。我尝试了您对to_date('12:01:00.00', '%H:%M:%S.%F') 的建议并得到了这个错误:ERROR [HY000] [Informix][Informix ODBC Driver][Informix]Missing decimal point in datetime or interval fraction.
猜你喜欢
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多