1

Informix データベースへのクエリを含む .aspx ページがあります。このクエリは、odbc 接続を介して実行され、データテーブルに入れられます。次に、このデータテーブルがラジオ ボタン グループのデータソースとして使用されます。

私の問題は、何らかの理由で時間がラジオボタンに「12:00:00 AM」として追加されていることです。これは奇妙です。なぜなら、informix フィールドは時刻を含まない日付フィールドだからです。Web ページの外でクエリを実行すると、時間なしで返されます... "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) ...

サーバーは、その値を 1899 年 12 月 31 日 (つまり、1900 年 1 月 1 日が 1 日目) からの日数を表す 4 バイト整数として返します。これは、Informix の DATE の内部表現です。

上位層の何かがそれを「日付 + 時間」の値として扱い、日付に時間要素がないため午前 0 時が時間であると想定し、午前/午後表記で書式設定して傷に塩を塗っています。

これには、何が起こっているかのクライアント側のトレースが含まれます。私の疑い (ODBC ドライバーに関する限られた知識以外には根拠がありません) は、ODBC ドライバーではなく .NET レイヤーで問題が発生しているということです。ただし、ODBC 層の上にいると、私の専門分野から外れてしまいます (ODBC の専門知識が高いとは言えません)。

環境で使用することにより、問題をクライアント コードに切り分けることができる場合がSQLIDEBUG=2:xyzあります (Windows の場合は SETNET32 で設定する必要がある場合があります)。xyz_Windows でまったく動作する場合 (Unix では動作する)、数字と文字のさまざまなグループが後に続く名前のファイルになります。そのファイルは で分析できsqliprint、Informix データ サーバーに送信され、クライアントに返された内容が表示されます。SQL がサーバーへの途中でハッキングされていないと仮定すると、日付が単純な日付として返され、問題は明らかにクライアント側にあることがわかります。SQL が途中でハッキングされた場合、それもクライアント側の問題です。

少なくともデバッグの開始点を提供します。

コードが使用している型のデータ型を注意深く調べてください。特に、一部の DBMS には時刻情報を含む DATE 型があり、その解釈を避ける必要がある場合があります。SQL 標準には、DATE (時刻なし)、TIME (日付なし)、および TIMESTAMP (日付と時刻) 型があります。

于 2012-04-25T14:41:16.203 に答える