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

您的代码中存在几种反模式。让我们一一来看看。

  • 不必要的字符串转换

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

    您不应该调用.ToString()来自数据库的每一个值。这会立即丢弃任何可能存在的类型信息,并迫使您不必要地走上字符串格式化和解析的道路。相反,您应该转换为返回的实际数据类型:

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

    这同样适用于所有其他列。转换为(string),(int)或任何实际数据类型。

  • 使用数据表

    DataTable data = gm.dataTable(sqlAry);
    

    当您使用该类时,您正在将查询中的所有DataTable记录加载到内存中。如果您有一个大型数据集,这可能会很慢并且会消耗大量内存。相反,您应该考虑使用一次只处理一行数据的 a 。DataReader

    我有点困惑,为什么你开始使用多行,因为看起来你只是在文本框中使用结果的最后一行。如果您的查询返回了多个记录,则第 1 行到第 n-1 行的数据将被丢弃。

  • 多次调用系统时钟

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

    每次调用DateTime.Now时,都是从系统时钟中检索时间的新调用。通过在同一过程中多次调用它,如果您的代码碰巧在一天的边界上运行并且时间恰到好处,则您可能会遇到无效数据。此外,这是不必要的。只需调用一次并将结果放入局部变量中:

    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 和一般的网络上有大量关于此的信息,所以我不会在这里进一步讨论。

于 2013-10-29T16:59:50.777 回答
0

Matt Johnson,** this fixed my problem and also i have followed your other tips, which are really very appreciated. Thanks a lot.

I just change this :

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

And then used:

this.dob.Text = dateBirth.Year+"-"+dateBirth.Month+"-"+dateBirth.Day;
于 2013-10-29T18:07:15.953 回答
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 回答
0

改变:

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

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