繁体   English   中英

如何在sql server 2008 R2中存储.net的DateTime

[英]How to store DateTime of .net in sql server 2008 R2

我是.net和sql的新手。 我正在尝试将DateTime存储到数据库中,但我在上午11:21:57因为“11'附近的语法不正确”而异常我运行我的代码,所以我得到了错误。 这是我存储到数据库中的代码。 下面的方法将返回一个查询。

    public string InsertADData(string strdateLogin, string strdateLogout, string strName, string strUsername)
    {
        DateTime dateLogin = Convert.ToDateTime(strdateLogin);
        DateTime dateLogout = Convert.ToDateTime(strdateLogout);
        return string.Format(@"INSERT INTO ADTimeData (LoginDate, LogoutDate,name,username) 
                               VALUES ({0},{1},'{2}','{3}')", dateLogin,
                                                            dateLogout,
                                                            strName.Replace("'", "''"),
                                                           strUsername.Replace("'", "''"));
    }

此方法用于将记录插入数据库。 这里CheckDBConnection()将打开sql连接。

       public void InsertRecords(String strQuery)
        {
            CheckDBConnection();
            using (SqlCommand cmd = new SqlCommand())
            {
                cmd.Connection = _con;
                cmd.CommandText = strQuery;
                cmd.CommandType = CommandType.Text;
                cmd.ExecuteNonQuery();
            }
        }

当我调试我写的代码我得到查询,即sqlQuery值像这样

      INSERT INTO ADTimeData (LoginDate, LogoutDate,name,username) 
                              VALUES (1/4/2013 11:21:57 AM,1/4/2013 11:21:57 AM,'raivnder','ravinder.g@gmail.com')

但我得到了例外

cmd.ExecuteNonQuery();

例外情况如下图所示。 在此输入图像描述

请帮我。

简而言之:问题在于您在insert语句中传递的日期时间格式。

它应该通过参数化查询来完成。 类似于以下示例查询的东西:

SqlCommand cmd = new SqlCommand("INSERT INTO <table> (<column>) VALUES (@value)", connection);
cmd.Parameters.AddWithValue("@value", dateTimeVariable);

cmd.ExecuteNonQuery();

通过各种方法 - 使用参数化查询来避免SQL注入攻击(并加快性能!):

public string InsertADData(string strdateLogin, string strdateLogout, string strName, string strUsername)
{
    DateTime dateLogin = Convert.ToDateTime(strdateLogin);
    DateTime dateLogout = Convert.ToDateTime(strdateLogout);

    string query = @"INSERT INTO ADTimeData (LoginDate, LogoutDate,name,username) 
                     VALUES (@LoginDate, @LogoutDate, @name, @username)";

    using (SqlConnection conn = new SqlConnection(.....))
    using (SqlCommand cmd = new SqlCommand(query, conn))
    {
        cmd.Parameters.Add("@LoginDate", SqlDbType.DateTime).Value = dateLogin;           
        cmd.Parameters.Add("@LogoutDate", SqlDbType.DateTime).Value = dateLogout;
        cmd.Parameters.Add("@Name", SqlDbType.VarChar, 50).Value = name;
        cmd.Parameters.Add("@UserName", SqlDbType.VarChar, 50).Value = username;

        conn.Open();
        cmd.ExecuteQuery();
        conn.Close(); 
    }

永远不要将SQL语句与值连接在一起! 这是一个非常糟糕的做法 - 停止这样做。 您应该始终使用参数化查询 - 没有例外

public string InsertADData(string strdateLogin, string strdateLogout, string strName, string strUsername)
{
    DateTime dateLogin = Convert.ToDateTime(strdateLogin);
    DateTime dateLogout = Convert.ToDateTime(strdateLogout);
    return string.Format(@"INSERT INTO ADTimeData (LoginDate, LogoutDate,name,username) 
                           VALUES ('{0}','{1}','{2}','{3}')", dateLogin,
                                                        dateLogout,
                                                        strName.Replace("'", "''"),
                                                       strUsername.Replace("'", "''"));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM