1

我有一个 .aspx 页面,其中包含对 informix 数据库的查询。此查询通过 odbc 连接完成并放入数据表中。然后将此数据表用作单选按钮组的数据源。

我的问题是,无论出于何种原因,时间都作为“12:00:00 AM”附加到单选按钮上。这很奇怪,因为informix 字段是不包括时间的日期字段。如果我要在网页之外运行查询,它会在没有时间的情况下返回它......“2012-06-15”

所以总而言之......我得到的是:“6/15/2012 12:00:00 AM”而我想要的是“06/15/2012”

查询如下:

"select DATE(attend_date) as attend_date from soar_major_table where major =? and active<>'N'"

创建数据表的代码:

string connString;
            connString = ConfigurationManager.ConnectionStrings [ "ERP" ].ConnectionString;


            OdbcConnection conn = new OdbcConnection ( );
            conn.ConnectionString = connString;


           string sql = "select DATE(attend_date) as attend_date from soar_major_table where major =? and active<>'N' ";

OdbcCommand command = new OdbcCommand ( );
            command.CommandText = sql;
            command.Parameters.Add ( new OdbcParameter ( "major", major ) );
            command.Connection = conn;

            DataTable dt = new DataTable ( );


            OdbcDataAdapter dataAdapter = new OdbcDataAdapter ( );


            dataAdapter.SelectCommand = command;


            try
            {

                conn.Open ( );


                dataAdapter.Fill ( dt );
            }
            finally
            {
                if ( conn != null && conn.State == ConnectionState.Open )
                {

                    command.Dispose ( );
                    dataAdapter.Dispose ( );
                    conn.Close ( );
                }
            }

            return dt;

最后是广播 btn 组的人口:

if ( dt.Rows.Count > 0 )
                {
                    rdoDate.DataSource = dt;

                    rdoDate.DataTextField = "attend_date";
                    rdoDate.DataValueField = "attend_date";
                    rdoDate.DataBind ( );

                }
4

1 回答 1

1

我相信问题出在 Informix 数据服务器的上游。

当你执行:

SELECT DATE(attend_date) ...

服务器将返回该值作为 4 字节整数,表示自 1899-12-31 以来的天数(因此 1900-01-01 是第 1 天),这是 Informix 中 DATE 的内部表示。

较高层中的某些东西将其视为“日期+时间”值,并假设午夜是时间,因为日期中没有时间分量,然后通过将其格式化为 am/pm 符号来在伤口上撒盐。

这将涉及对正在发生的事情进行客户端跟踪。我的怀疑(除了对 ODBC 驱动程序的有限了解之外没有任何依据)是问题发生在 .NET 层而不是 ODBC 驱动程序中。但是,一旦您在 ODBC 层之上,您就超出了我的专业领域(而且我并不声称在 ODBC 方面具有出色的专业知识)。

您可以通过SQLIDEBUG=2:xyz在环境中使用将问题隔离到客户端代码(您可能需要使用 SETNET32 for Windows 进行设置)。如果它在 Windows 上完全有效(它在 Unix 上有效),那么您最终会得到一个文件,其名称开头xyz_后跟各种数字和字母组。该文件可以被分析,sqliprint并将向您显示发送到 Informix 数据服务器并返回给您的客户端的内容。假设 SQL 在到达服务器的途中没有被黑客入侵,那么您会看到返回的日期是一个简单的日期,而问题肯定是客户端的。如果 SQL 在途中被黑客入侵,那么这也是客户端问题。

它至少为调试提供了一个起点。

非常仔细地查看您的代码使用的类型的数据类型。特别是,某些 DBMS 具有包含时间信息的 DATE 类型,您可能需要避免这种解释。SQL 标准有 DATE(无时间)、TIME(无日期)和 TIMESTAMP(日期和时间)类型。

于 2012-04-25T14:41:16.203 回答