2013-01-04 70 views
1

我是.net和sql的新手。我試圖將DateTime存儲到數據庫中,但我在11:21:57上午接收到「11'附近語法錯誤」的異常。我運行我的代碼,因此我在時間上出錯。這是我的代碼,用於存儲到數據庫中。 下面的方法將返回一個查詢。如何在sql server 2008 R2中存儲.net的DateTime

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','[email protected]') 

但我在

cmd.ExecuteNonQuery(); 

變得異常的異常顯示的代碼下面的圖像。 enter image description here

請幫助我。

+1

就個人而言,我不會刻意想着正確的語法,但只要使用['SqlParameter's](http://msdn.microsoft.com/en- us/library/system.data.sqlclient.sqlparameter.aspx)。 –

回答

2

簡而言之:問題在於你在插入語句中傳遞的日期時間格式。

它應該通過參數化查詢完成。東西similare下面的示例查詢:

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

cmd.ExecuteNonQuery(); 
+1

是的,我正在修改我的答案。 –

+0

好的,謝謝!我讚賞這一點。 –

+0

@marc_s,你已經寫了sql命令語句,因此我不會在這裏重新發明同一個輪子:) –

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語句與值!這是一個非常糟糕的做法 - 停止這樣做。你應該總是使用參數化查詢 - 也不例外

+0

感謝您的回覆@marc_s。我嘗試了你的代碼,但我得到一個異常,因爲「不允許將數據類型varchar隱式轉換爲varbinary。使用CONVERT函數來運行此查詢。」 –

+0

@RavinderGangadher:是你varbinary類型的列之一? –

-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("'", "''")); 
} 
相關問題