0

asp.net c# での日付変換に問題があります。GeneralMethods クラスに次のメソッドがあります

public DateTime mySqlDateFormate(string dateString, string format="g")
{
    dateString = isOk(dateString) ? dateString : DateTime.Now.Year + "-" + DateTime.Now.Month + "-" + DateTime.Now.Day;
    CultureInfo provider = CultureInfo.InvariantCulture;
    // Parse date-only value with invariant culture.
    try
    {
        result = DateTime.ParseExact(dateString, format, provider);
        //Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
    }
    catch (Exception exc)
    {
        catchError(exc);
    }
    return result;
}

次のように、ページからこのメソッドにパラメーターを送信しています。

protected void Page_Load(object sender, EventArgs e)
{
    if(gm.isOk((string)Session["userid"])){
        var sqlAry = "SELECT sno,std_name,gender,nic,father_name,father_nic,guardian_name,guardian_nic,dob,domicile,addres,reg_date,last_institute FROM std_basic_info WHERE sno = " + (string)Session["std_sno"];
        DataTable data = gm.dataTable(sqlAry);
        foreach (DataRow row in data.Rows)
        {
            snoTbl = row["sno"].ToString();
            std_nameTbl = row["std_name"].ToString();
            genderTbl = row["gender"].ToString();
            nicTbl = row["nic"].ToString();
            father_nameTbl = row["father_name"].ToString();
            father_nicTbl = row["father_nic"].ToString();
            guardian_nameTbl = row["guardian_name"].ToString();
            guardian_nicTbl = row["guardian_nic"].ToString();
            dobTbl = row["dob"].ToString();
            domicileTbl = row["domicile"].ToString();
            addresTbl = row["addres"].ToString();
            reg_dateTbl = row["reg_date"].ToString();
            institutionLstAttendedTbl = row["last_institute"].ToString();
        }
            this.std_sno.Value = snoTbl;
            this.stdName.Text = std_nameTbl;
            if (genderTbl.Equals("1")) { this.sex.SelectedIndex = 0; } else { this.sex.SelectedIndex = 1; }
            this.stdNic.Text = nicTbl;
            this.fatherName.Text = father_nameTbl;
            this.fatherNic.Text = father_nicTbl;
            this.guardianName.Text = guardian_nameTbl;
            this.guardianNic.Text = guardian_nicTbl;
            this.dob.Text =  gm.mySqlDateFormate(dobTbl,"d").ToString();
            this.domicile.Text = domicileTbl;
            this.institutionLstAttended.Text = institutionLstAttendedTbl;
            this.address.Text = addresTbl;
        }
}

mySql テーブルの dob 列の値は次のとおりです。

1978-04-23

すべてうまくいきますが、テーブルから値をフェッチすると、次のように表示されます。

1/1/0001 12:00:00 AM

テキストフィールドに元の値が表示されませんか?

誰かこれで私を助けてください...

ありがとう

4

5 に答える 5

2

コードにはいくつかのアンチパターンが存在します。それらを1つずつ見てみましょう。

  • 不要な文字列変換

    dobTbl = row["dob"].ToString();
    

    .ToString()データベースから取得するすべての値を呼び出す必要はありません。これにより、存在する可能性のある型情報がすぐに破棄され、不必要に文字列の書式設定と解析の道をたどらざるを得なくなります。代わりに、返される実際のデータ型にキャストする必要があります。

    dobTbl = (DateTime) row["dob"];
    

    同じことが他のすべての列にも当てはまります。(string)(int)、または実際のデータ型が何であれキャストします。

  • DataTable の使用

    DataTable data = gm.dataTable(sqlAry);
    

    DataTableクラスを使用すると、すべてのレコードがクエリからメモリに読み込まれます。大規模なデータセットがある場合、処理が遅くなり、大量のメモリが消費されます。DataReader代わりに、一度に 1 行ずつデータを処理するを使用することを検討する必要があります。

    テキストボックスで結果の最後の行を使用しているように見えるため、最初に複数の行で作業している理由は少し混乱しています。クエリによって複数のレコードが返される場合、行 1 ~ n-1 のデータは破棄されます。

  • システム クロックへの複数の呼び出し

    DateTime.Now.Year + "-" + DateTime.Now.Month + "-" + DateTime.Now.Day
    

    を呼び出すたびDateTime.Nowに、システム クロックから時刻を取得するための新しい呼び出しが行われます。コードがたまたま 1 日の境界を超えて実行され、タイミングがちょうどよい場合、同じ手順で複数回呼び出すと、無効なデータが発生するリスクがあります。その上、それは不要です。一度呼び出して、結果をローカル変数に入れるだけです。

    DateTime now = DateTime.Now;
    

    その後、now必要な場所で使用できます。

  • パーツから DateTime を構成する

    現在の日付を文字列として取得する場合は、部分から組み立てないでください。使用するだけです:

    DateTime.Today.ToString("yyyy-MM-dd");
    
  • フレームワークに反対する

    関数全体mySqlDateFormateを に置き換えることができDateTime.TryParseExact、より信頼性が高くなります。

  • SQL の文字列連結

    ... " WHERE sno = " + (string)Session["std_sno"];
    

    これにより、コードが SQL インジェクション攻撃に対して脆弱になり、SQL クエリ エンジンがクエリの実行プランを適切にキャッシュできなくなります。代わりにパラメータ化されたクエリを使用する必要があります。これについては、StackOverflowや Web 全般に大量の情報があるため、ここではこれ以上説明しません。

于 2013-10-29T16:59:50.777 に答える
0

マット・ジョンソン、** これで私の問題は解決されました。また、あなたの他のヒントにも従いました。本当に感謝しています。どうもありがとう。

これを変更するだけです:

dateBirth = (DateTime)row["dob"];

そして、使用:

this.dob.Text = dateBirth.Year+"-"+dateBirth.Month+"-"+dateBirth.Day;
于 2013-10-29T18:07:15.953 に答える
0

変化する:

gm.mySqlDateFormate(dobTbl,"d").ToString();

gm.mySqlDateFormate(dobTbl,"yyyy-MM-dd").ToString();
于 2013-10-29T16:42:34.497 に答える
0

DateTimeこの部分がテキストボックスへの割り当てを担当していると思いgm.mySqlDateFormate(dobTbl,"d").ToString();ますが、修正は非常に簡単です。

  this.dob.Text =  gm.mySqlDateFormate(dobTbl,"d").ToString("yyyy-MM-dd");

おそらく、そのフォーマット指定子は"d"inを置き換えることができmySqlDateFormateます。そのメソッドが何のためにあるのか、私にはよくわかりません。フォーマット指定子を受け入れて十分なToStringオーバーロードがあります。DateTimeそれがカスタムメソッドである場合は、使用を中止するか、単純に実装してくださいreturn input.ToString("yyyy-MM-dd");

于 2013-10-29T16:42:15.303 に答える
0

mySqlDateFormateメソッドに渡す形式がわかりません

result = DateTime.ParseExact(dateString, format, provider);

形式が「YYYY-MM-dd」であることを確認してください

mmではなく大文字のMMを使用していることに注意してください

于 2013-10-29T16:42:22.373 に答える