2011-05-23 78 views
2

下面是代碼:如何插入AC#日期時間VAR到SQL Server

string ConnectionString= @"Data Source=localhost\SQLEXPRESS; 
Initial Catalog=notepad; Integrated Security=SSPI "; 
SqlConnection con = new SqlConnection(ConnectionString); 
con.Open(); 
string strEvent = TextBoxEvent.Text; 
string strDate = Calendar1.TodaysDate.ToShortDateString(); 
string strInsert = "insert into notepad (time, event) values (strDate, strEvent)"; 
SqlCommand cmd=new SqlCommand(strInsert, con); 
cmd.ExecuteNonQuery(); 

的時間是在SQL Server 2005

smalldatetime當我運行這個程序,類似這樣的錯誤occurrs:

在此上下文中,不允許使用名稱「strDate」 。有效表達式是 常量,常量表達式和 (在某些上下文中)變量。 列不允許使用名稱。

,但如果我2010/05/22更換strDate這樣的:

string strInsert = "insert into notepad (time, event) values ("2010/05/22", strEvent)"; 

程序將正常運行。

我對這個問題感到困惑,並向你求助。

回答

1

下面的這條語句是錯誤的,因爲您實際上包含strDate而不是替換它的值。

string strInsert = "insert into notepad (time, event) values (strDate, strEvent)"; 

你需要做的就是寫如下內容:

string strInsert = "insert into notepad (time, event) values ("+strDate+"," +strEvent+)"; 

這將取代strDate和strEvent在運行時的實際值。

* 然而,這種方法不建議,因爲很容易出現SQL注入攻擊*

+2

警告數據層:這將打開大門,SQL注入ATT acks !!你應該**從來沒有**只是連接在一起你的SQL語句 - 使用**參數化查詢**而不是 - **始終!** – 2011-05-23 04:56:08

2

所有這裏所說的方法是不錯,但我更喜歡下面的一個,因爲它具有比其他的邊緣

DataAccess DAB = new DataAccess(); 
ArrayList arrList = new ArrayList(); 
string SQL = " insert into notepad (time, event) values (?,?) "; 
arrList.Add(new DataAccessBlock.DataAccess.Parameter("@time", DbType.DateTime, 30, ParameterDirection.Input, "", strDate));  
arrList.Add(new DataAccessBlock.DataAccess.Parameter("@event", DbType.String, 50, ParameterDirection.Input, "", strEvent)); 

DAB.ExecuteScalar(SQL, CommandType.Text, arrList); 
+0

是的。避免首先將日期時間值轉換爲字符串,並避免各種問題。 (還有,是的,使用參數。不幸的是,我只能+1) – 2011-05-23 04:31:24

+0

'?'參數佔位符不能用於標準的ADO。.NET數據庫提供者 - 您需要使用命名參數,比如'@ Date'和'@ Event'。 – 2011-05-23 05:00:37

+0

@Marc_s感謝您的信息。 – Maxymus 2011-05-23 05:20:39

5

您應該使用參數化查詢,將數據插入到SQL Server,你應該把你的SqlConnectionSqlCommand到使用塊 - 嘗試是這樣的:

string ConnectionString= @"Data Source=localhost\SQLEXPRESS; 
Initial Catalog=notepad; Integrated Security=SSPI "; 

string sqlStatement = "INSERT INTO dbo.Notepad(time, event) VALUES (@Date, @Event)"; 

using(SqlConnection con = new SqlConnection(ConnectionString)) 
using(SqlCommand cmd = new SqlCommand(sqlStatement, con)) 
{ 
    cmd.Parameters.Add("@Date", SqlDbType.DateTime).Value = Calendar1.TodaysDate; 
    cmd.Parameters.Add("@Event", SqlDbType.VarChar, 100).Value = TextBoxEvent.Text.Trim(); 

    con.Open(); 
    cmd.ExecuteNonQuery(); 
    con.Close(); 
} 

而且,這與您的UI代碼(檢索從文本框和日曆控件數據)將您的數據庫訪問代碼 - 這是一種不好的做法 - 你應該分開這兩個步驟:

  1. 搶在你的代碼隱藏文件
  2. 從UI的當前值它們傳遞到其處理數據訪問而沒有直接接觸任何UI控件
+0

你打敗了我! +1 – 2011-05-23 05:01:55

相關問題