2016-02-28 31 views
0

我是ASP.NET的新手,我需要您的專家幫助來解決此問題。我正在使用ASP.NET MVC 5和SQL Server。我嘗試使用SQL這是我的查詢中插入一些數據數據庫DateTime.Now在SQL中拋出異常,說它不是有效的日期時間值

INSERT INTO tem (Telephone, Status, CreateDate) 
VALUES ('" + telephone + "','"+ status +"','" + DateTime.Now + "'); 

它的正常工作在本地主機,但之後我部署到服務器時,它顯示錯誤信息:

varchar數據的轉換鍵入日期時間數據類型,結果爲 超出範圍值。該語句已終止。

我的DateTime.Now的值與28/02/2016 8:45:45 AM相似。

如果我通過增加2016年2月28日上午08點45分45秒的硬編碼,然後它的工作。

+3

[SQL注入警報(http://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29.aspx) - 您應該**不**連接您的SQL語句 - 使用**參數化查詢**來代替以避免SQL注入 –

+0

欣賞您的評論。它是參數化的,我在測試時改變它。對我的問題有任何建議。 – wajira000

+1

那麼,建議是:**使用參數!**這些不僅會解決您的SQL注入漏洞,正確使用參數也會修復您的「格式化日期爲字符串」問題(因爲您不需要格式化日期作爲一個字符串了 - 你將它作爲**本地** DateTime值傳遞) –

回答

5

您需要使用參數化查詢這既解決您的SQL注入漏洞,並且還避免必須將DateTime轉換爲經常導致問題的字符串。

使用的代碼是這樣的:

// define connection string and **PARAMETRIZED** insert query 
string connectionStirng = "....."; 
string insertQry = "INSERT INTO tem (Telephone, Status, CreateDate) VALUES (@Telephone, @Status, @CreateDate);"; 

// set up connection and command in using blocks 
using (SqlConnection conn = new SqlConnection(connectionString)) 
using (SqlCommand cmd = new SqlCommand(insertQry, conn)) 
{ 
    // define the parameters 
    cmd.Parameters.Add("@Telephone", SqlDbType.VarChar, 50).Value = telephone; 
    cmd.Parameters.Add("@Status", SqlDbType.VarChar, 20).Value = status; 
    cmd.Parameters.Add("@CreateDate", SqlDbType.DateTime).Value = DateTime.Now; 

    // open connection, execute query, close connection 
    conn.Open(); 
    int rowsInserted = cmd.ExecuteNonQuery(); 
    conn.Close(); 
} 
+0

感謝您的支持marc_s。在測試環境中,這段代碼工作正常,但是在我部署它之後,顯示出這個錯誤「對象引用未設置爲對象的實例。」。 SqlConnection對象沒有創建。 – wajira000

+0

@ wajira000:檢查你的配置 - 通常,連接字符串是在配置文件中定義的 - 你有配置文件嗎?連接字符串是否缺失,或命名不同? –

+0

謝謝marc_s。這是問題,現在它工作正常。有沒有任何工具或方法可以用來調試這種情況。我有權訪問服務器。因爲它在生產中很難跟蹤這樣的錯誤。 – wajira000

1

直接獲得基本知識。 DatetimeNow與SQL沒有任何關係。

My DateTime.Now value is like 28/02/2016 8:45:45 AM。

編號您的datetime.Now值實際上是一個雙倍的內部值。 STRING表示形式是由您的UI設置生成的,因爲您沒有定義文化或格式字符串。你應該這樣做,如果你想要一個特定的格式。

如果你的文化和服務器的文化不匹配 - 自然的日期時間將不能正確解析。

這就是爲什麼你應該使用參數(和他們避免SQL注入),而不是使用字符串處理。

+0

謝謝TomTom。正如我所說我是初學者,所以你可以提供任何樣本或任何鏈接來幫助我解決這個問題。 – wajira000

+1

@ wajira000你有marc_s答案中所需的所有樣本。並且自己做一些關於Sql注入和參數化查詢的研究 – Steve

2

如@marc_s中的第一個評論說,你不應該使用的SQL語句,而不是你的代碼,做這樣的事情:

conn2 = new SqlConnection(); 
     conn2.ConnectionString = ConfigurationManager.ConnectionStrings["connSpionshopString"].ConnectionString; 
SqlCommand cmd = new SqlCommand(); 
     cmd.Connection = conn2; 
     cmd.CommandText = "INSERT INTO tem (Telephone, Status, CreateDate) VALUES(@param1,@param2,@param3)"; 

     cmd.Parameters.Add("@param1", "telephone "); 
     cmd.Parameters.Add("@param2", "status "); 
     cmd.Parameters.Add("@param3", DateTime.Now); 

    cmd.ExecuteNonQuery(); 

    conn2.Close(); 
+2

你應該看看[我們可以停止使用AddWithValue()了嗎?](http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can -we-stop-using-addwithvalue-already /)並停止使用'.AddWithValue()' - 它可能會導致意想不到的結果。 –

+0

謝謝vahid kargar現在工作正常。 – wajira000

相關問題