【问题标题】:The conversion of a nvarchar data type to a datetime data type resulted in an out-of-range value in C#将 nvarchar 数据类型转换为 datetime 数据类型导致 C# 中的值超出范围
【发布时间】:2014-04-19 17:11:46
【问题描述】:

我尝试将登录记录保存到 SQL Server。

但我得到一个错误:

将 nvarchar 数据类型转换为 datetime 数据类型导致值超出范围。

Login.aspx 运行时的cmd.ExecuteNonQuery(); 代码行上。

这些代码有什么问题?

我的桌子Login

[Id] [int] IDENTITY(1,1) NOT NULL,
[Url] [nvarchar](150) NOT NULL,
[Time] [datetime] NOT NULL,
[Count] [int] NOT NULL,
[PcName] [nvarchar](50) NOT NULL,
[Browser] [nvarchar](50) NOT NULL,
[IpAddress] [nvarchar](50) NOT NULL  

C#代码:

    SqlConnection conn= "...";

    protected void Page_Load(object sender, EventArgs e) 
    {
        Logins();
    }

    public void Logins()
    {
        if (!Page.IsPostBack)
        {
            Application["hit"] = Convert.ToInt32(Application["hit"].ToString());
        }

        string strHostName = Dns.GetHostName();
        IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);

        string url = HttpContext.Current.Request.Url.AbsoluteUri;

        string page = System.IO.Path.GetFileName(url);
        string browser = Request.Browser.Browser;
        string pcname = Convert.ToString(ipEntry.HostName);

        String IP = "";
        WebRequest request = WebRequest.Create("http://checkip.dyndns.org/");

        using (WebResponse response = request.GetResponse())
        using (StreamReader stream = new StreamReader(response.GetResponseStream()))
        {
            IP = stream.ReadToEnd();
        }

        int first = IP.IndexOf("Address: ") + 9;
        int last = IP.LastIndexOf("</body>");

        IP = IP.Substring(first, last - first);

        string sql = "INSERT INTO Login(Url, Time, Count, Browser, PcName, IpAddress) values (@Url, @Time, @Count, @Browser, @PcName, @IpAddress)";

        conn.Open();
        SqlCommand cmd = new SqlCommand(sql, conn);

        cmd.Parameters.AddWithValue("Time", DateTime.Now.ToString());
        cmd.Parameters.AddWithValue("Url", page.Trim());
        cmd.Parameters.AddWithValue("Count", Convert.ToInt32(Application["hit"].ToString()));
        cmd.Parameters.AddWithValue("Browser", browser.Trim());
        cmd.Parameters.AddWithValue("PcName", pcname.Trim());
        cmd.Parameters.AddWithValue("IpAddress", IP.Trim());

        cmd.ExecuteNonQuery();
    } 

【问题讨论】:

  • 先检查日期。如果日期不正确,例如 2 月 30 日,您将收到该错误。

标签: c# asp.net sql datetime


【解决方案1】:

我认为你应该改变这一行:

cmd.Parameters.AddWithValue("Time", DateTime.Now.ToString());

到这里:

cmd.Parameters.AddWithValue("@Time", DateTime.Now);

【讨论】:

  • 已解决。我将 DateTime.Now.ToString 更改为 DateTime.Now。谢谢
  • 没问题。如果它解决了您的问题,请记住接受答案
【解决方案2】:

问题1:您正在将字符串发送到日期时间参数Time

解决方案1:您需要将DateTime.Now而不是DateTime.Now.ToString()传递给Time参数

问题 2:您在 AddWithValue() 函数中的参数前面缺少 @ 符号。

解决方案2:您需要在AddWithValue()函数的参数前添加@符号。

试试这个:

cmd.Parameters.AddWithValue("@Time", DateTime.Now);
cmd.Parameters.AddWithValue("@Url", page.Trim());
cmd.Parameters.AddWithValue("@Count",
      Convert.ToInt32(Application["hit"].ToString()));
cmd.Parameters.AddWithValue("@Browser", browser.Trim());
cmd.Parameters.AddWithValue("@PcName", pcname.Trim());
cmd.Parameters.AddWithValue("@IpAddress", IP.Trim());

【讨论】:

  • 已解决。我将 DateTime.Now.ToString 更改为 DateTime.Now。谢谢
猜你喜欢
  • 2016-10-22
  • 2017-03-31
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 2019-12-23
相关资源
最近更新 更多