1

我是 .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();

异常如下图所示。 在此处输入图像描述

请帮我。

4

3 回答 3

2

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

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

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

cmd.ExecuteNonQuery();
于 2013-01-04T06:21:38.687 回答
2

无论如何 -使用参数化查询来避免 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 语句与值连接在一起!这是一个非常非常糟糕的做法 - 停止这样做。您应该始终使用参数化查询 - 也不例外

于 2013-01-04T06:26:08.797 回答
-1
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("'", "''"));
}
于 2013-01-04T06:56:00.380 回答