2011-07-26 138 views
1

我意識到這個問題之前已經問過,但在經歷了以前回答的問題之後,我仍然無法弄清楚這段代碼有什麼問題。錯誤:從字符串轉換日期時間時轉換失敗.NET SQL Server

僅供參考我是在英國。

public static void GetDataForCSEP(string viewName, string schemaName, 
              string dateFieldName, DateTime startDate, DateTime endDate) 
     { 

      string dateFormat = "yyyy/MM/dd HH:mm:ss"; 


      //Connect to SQl Server 

      string commandText = "SELECT * FROM " + schemaName + "." + viewName + " WHERE @dateFieldName BETWEEN @startDate AND @endDate"; 


      using (SqlCommand sqlCmd = new SqlCommand(commandText,sql_Conn)) 
      { 
       sqlCmd.CommandType = CommandType.Text; 

       sqlCmd.Parameters.Add("@dateFieldName",SqlDbType.NVarChar, 30).Value = dateFieldName; 
       sqlCmd.Parameters.Add("@startDate", SqlDbType.DateTime).Value = DateTime.Parse(startDate.ToString(dateFormat)); 
       sqlCmd.Parameters.Add("@endDate", SqlDbType.DateTime).Value = DateTime.Parse(startDate.ToString(dateFormat)); 



       sql_Conn.Open(); 
       sqlCmd.ExecuteNonQuery(); 


      } 
} 
+1

爲什麼你在做'DateTime.Parse(startDate.ToString(dateFormat))''''startDate'已經是DateTime值。爲什麼將其轉換爲字符串只是爲了將其轉換回來? –

+0

因爲我是垃圾程序員:) – MrBliz

回答

2

上的錯誤是無法通過列名作爲參數

"SELECT * FROM " + schemaName + "." + viewName + " 
WHERE @dateFieldName BETWEEN @startDate AND @endDate"; 

這應該是

"SELECT * FROM " + schemaName + "." + viewName + " 
WHERE " + dateFieldName + " BETWEEN @startDate AND @endDate"; 

爲了避免SQL注入攻擊的攻擊利用Sp_executeSQL執行這種類型的查詢,因爲這是動態sql查詢。

+0

謝謝,這個竅門 – MrBliz

+0

同意,因爲結構化代碼將嘗試檢查靜態字符串'@ dateFieldName'是否在兩個日期之間。爲此,SQL引擎正在嘗試將「@ dateFieldName」的文本值轉換爲日期,並失敗。 – MatBailie

1

這將取決於你的SQL Server的區域設置,但也許

string dateFormat = "dd-MMM-yyyy HH:mm:ss"; 

會爲你工作?

+0

謝謝,我如何找出那些設置?它的登錄具體是不是? – MrBliz

+0

是和否 - 會有默認值,但您也可以在用戶連接等期間修改它們。我會檢查聯機叢書,因爲我對DBA方面並不熟悉! – Widor

相關問題