【问题标题】:FormatException Error String to DateTimeFormatException 错误字符串到 DateTime
【发布时间】:2017-08-01 02:31:44
【问题描述】:

我已经坐在座位上一个多小时了,不知道出了什么问题。有人可以帮忙吗?

错误据说是“将字符串转换为DateTime时,在将每个变量放入DateTime对象之前解析字符串以获取日期。

字段名称“LastLoginTime”是我数据库中的 DATETIME 数据类型。

这些是代码..

protected void Page_Load(object sender, EventArgs e)
{
    AuditNLoggingDAO al = new AuditNLoggingDAO();

    int result = 0;

    int resultLogout = 0;

    DateTime dateTimeOfLatestLogin = DateTime.MinValue;

    //Get IP Address of Client's Machine
    String externalIP = null;
    try
    {
        externalIP = (new WebClient()).DownloadString("http://checkip.dyndns.org/");
        externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")).Matches(externalIP)[0].ToString();
    }
    catch (Exception ex)
    {
        logManager log = new logManager();
        log.addLog("Retrieval of IP Address", "IP Address", ex);
    }

    if (!Page.IsPostBack)
    {
        if (!String.IsNullOrEmpty(Session["LoginUserName"].ToString()))
        {
            String loginUsername = Session["LoginUserName"].ToString();

            //Get latest Login time
            DataSet ds = new DataSet();

            ds = al.getAuditData(Session["LoginUserName"].ToString());

            foreach (DataRow r in ds.Tables[0].Rows)
            {
                dateTimeOfLatestLogin = Convert.ToDateTime(r["LastLoginTime"]);
            }

            result = al.trackLogout(loginUsername, DateTime.Now, externalIP, Convert.ToDouble(latitudeTB.Value), Convert.ToDouble(longitudeTB.Value));
            resultLogout = al.updateLLogoutT(loginUsername, DateTime.Now, externalIP);
        }

        loginDetails.InnerText = "You logged into your account at " + dateTimeOfLatestLogin.ToString("hh:mm:ss tt dd/MM/yyyy") + " SGT.";
        logoutDetails.InnerText = "You logged out from your session at " + (DateTime.Now).ToString("hh:mm:ss tt dd/MM/yyyy") + " SGT.";
    }
}

我似乎无法找到错误.. 我猜这是我的 dateTimedateTimeOfLatestLogin 变量..

al.trackLogout 方法,

//Track Logout Activity
public int trackLogout(String username, DateTime dateTimeActivity, String ipaddress, Double latitude, Double longitude)
{
    int result = 0;

    StringBuilder sqlCmd = new StringBuilder();
    sqlCmd.AppendLine("INSERT INTO AuditActivity (Username, DateTimeActivity, IPAddressActivity, LatitudeActivity, LongitudeActivity, ActivityType) ");
    sqlCmd.AppendLine("VALUES (@addUsername, @addDT, @addIPAddress, @addLat, @addLng, @addActivity)");

    try
    {
        SqlConnection myConn = new SqlConnection(DBConnectionStr);

        myConn.Open();

        SqlCommand cmd = new SqlCommand(sqlCmd.ToString(), myConn);

        cmd.Parameters.AddWithValue("@addUsername", username);
        cmd.Parameters.AddWithValue("@addDT", dateTimeActivity);
        cmd.Parameters.AddWithValue("@addIPAddress", ipaddress);
        cmd.Parameters.AddWithValue("@addLat", latitude);
        cmd.Parameters.AddWithValue("@addLng", longitude);
        cmd.Parameters.AddWithValue("@addActivity", "Logout");

        result = cmd.ExecuteNonQuery();

        myConn.Close();

        return result;
    }
    catch (SqlException ex)
    {
        logManager log = new logManager();
        log.addLog("AuditNLoggingDAO.trackLogout", sqlCmd.ToString(), ex);
        return 0;
    }
}

【问题讨论】:

  • 你试过dateTimeOfLatestLogin = (DateTime)r["LastLoginTime"];
  • 将 LastLoginTime 放入监视窗口时会是什么样子?
  • 如果我对此有所猜测,我认为您可能会遇到由于当前文化值而无法识别日期时间值的字符串格式的问题。我一直做日期时间转换的方式是使用 DateTime.ParseExact()。
  • @domster,LastLoginTime的值是多少?
  • @Mauricio 该值为 {31/07/2017 22:08:12}。

标签: c# sql asp.net string datetime


【解决方案1】:

不是 C#,但没有打开 C# 项目可以写入,所以它在 VB.Net 中;细微的语法调整和更改,但其他方面相同:

Public Function trackLogout(username As String, dateTimeActivity As DateTime, ipaddress As String, latitude As Double, longitude As Double) As Integer
    Dim result As Integer = 0

    Try
        Using conn As New SqlConnection(DBConnectionStr)
            Dim sb As New StringBuilder
            sb.AppendLine("INSERT INTO AuditActivity (Username, DateTimeActivity, IPAddressActivity, LatitudeActivity, LongitudeActivity, ActivityType) ")
            sb.AppendLine("VALUES (@addUsername, @addDT, @addIPAddress, @addLat, @addLng, @addActivity)")

            Using cmd As New SqlCommand() With {.CommandText = sb.ToString(), .Connection = conn, .CommandType = CommandType.Text}
                cmd.Parameters.AddWithValue("@addUsername", username)
                cmd.Parameters.AddWithValue("@addDT", dateTimeActivity)
                cmd.Parameters.AddWithValue("@addIPAddress", ipaddress)
                cmd.Parameters.AddWithValue("@addLat", latitude)
                cmd.Parameters.AddWithValue("@addLng", longitude)
                cmd.Parameters.AddWithValue("@addActivity", "Logout")

                result = cmd.ExecuteNonQuery
            End Using
        End Using
    Catch ex As Exception
        result = -1
        ' Whatever your current implementation is.
    End Try

    Return result
End Function

不幸的是,内联 sql 执行需要 StringBuilder。你是对的。我使用存储过程来执行结构化的 SQL 语句,因此我不必在应用程序中管理 SQL。

【讨论】:

  • @domster 这是一种更易读的方法....您的错误介于 Application DateTime 值和 SQL 预期的 DateTime 格式之间
  • 您是否尝试过执行 SQL 语句时出现错误的值?
  • @domster ok....所以 .Net 更宽容,会尝试所有模式;而 SQl 的宽容度较低,需要特定的日期时间模式。 SQL 将始终接受 UTC 模式,但以其他方式使用本文作为参考 docs.microsoft.com/en-us/sql/t-sql/data-types/…
  • @domster .Net 使用本地化来表示日期时间值;默认情况下,SQL 不使用本地化。如果您希望它与您的 TimeZone 的标准日期时间格式相协调,您将需要对其进行设置。您可能会认为 SQL 会提取本地化格式,但由于 SQL Server 可能位于英国,应用程序位于巴基斯坦,因此默认情况下它们使用通用日期时间格式。因此,ISO-8601 是默认模式
  • @domster 欢迎来到系统设计和开发...阅读 DateTime 格式和期望;)
【解决方案2】:

我现在正在使用的修改后的代码..

protected void Page_Load(object sender, EventArgs e)
{
    AuditNLoggingDAO al = new AuditNLoggingDAO();

    int result = 0;

    int resultLogout = 0;

    //Get IP Address of Client's Machine
    String externalIP = null;
    try
    {
        externalIP = (new WebClient()).DownloadString("http://checkip.dyndns.org/");
        externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")).Matches(externalIP)[0].ToString();
    }
    catch (Exception ex)
    {
        logManager log = new logManager();
        log.addLog("Retrieval of IP Address", "IP Address", ex);
    }

    CultureInfo provider = CultureInfo.InvariantCulture;

    if (!String.IsNullOrEmpty(Session["LoginUserName"].ToString()))
    {
        String loginUsername = Session["LoginUserName"].ToString();

        //Get latest Login time
        DataSet ds = new DataSet();

        ds = al.getAuditData(Session["LoginUserName"].ToString());

        DateTime dateTimeOfLatestLogin = DateTime.MinValue;

        /*foreach (DataRow r in ds.Tables[0].Rows)
        {
            //dateTimeOfLatestLogin = DateTime.ParseExact(r["LastLoginTime"].ToString(), "dd-MM-yyyy hh:mm:ss", CultureInfo.InvariantCulture);
            String dtDBString = r["LastLoginTime"].ToString();
            dateTimeOfLatestLogin = Convert.ToDateTime(dtDBString);

            //Debug.WriteLine(dateTimeOfLatestLogin);
            //"MM-dd-yyyy HH:mm:ss tt"
        }*/

        String DBConnectionStr = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString;

        SqlConnection connection = new SqlConnection(DBConnectionStr);
        string sql = "select LastLoginTime FROM AuditTrails WHERE Username=@USERID";
        SqlCommand command = new SqlCommand(sql, connection);
        command.Parameters.AddWithValue("@USERID", loginUsername);
        try
        {
            connection.Open();
            using (SqlDataReader reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    string timeTaken = reader["LastLoginTime"].ToString();
                    dateTimeOfLatestLogin = Convert.ToDateTime(timeTaken);
                }
            }
            connection.Close();
        }
        catch (SqlException ex)
        {
            logManager log = new logManager();
            log.addLog("LogoutWithDesc.aspx.cs", "PageLoad", ex);
        }

        resultLogout = al.updateLLogoutT(loginUsername, DateTime.Now, externalIP);
        result = al.trackLogout(loginUsername, externalIP, Convert.ToDouble(latitudeTB.Value), Convert.ToDouble(longitudeTB.Value));

        loginDetails.InnerText = "You logged into your account at " + dateTimeOfLatestLogin.ToString("hh:mm:ss tt dd/MM/yyyy") + " SGT.";
        logoutDetails.InnerText = "You logged out from your session at " + (DateTime.Now).ToString("hh:mm:ss tt dd/MM/yyyy") + " SGT.";
    }     
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    相关资源
    最近更新 更多