[英]C# Generate Query to Compare DateTime with SQL Nvarchar date Column
我試圖根據用戶檢查的兩個日期來獲取結果。 我有兩個datetimepicker控件。 我希望用戶選擇“開始”日期和“結束”日期,然后查詢獲得特定結果。
leaves_time列的類型為nvarchar
這是我的查詢:
SELECT name, mil_no, rotba, arrival_time, leaving_time, day, year
FROM dbo.Hodor_data
WHERE leaving_time BETWEEN '"+dateTimePicker1.Checked.ToString()+ "' AND '" + dateTimePicker2.Checked.ToString() + '"
錯誤在哪里?
您應該編寫參數化查詢,而不要使用字符串連接來傳遞參數,以便創建sql命令。 使用字符串連接使您的代碼容易受到sql注入的攻擊。
var cmdText = @"SELECT ...
FROM dbo.Hodor_data
WHERE leaving_time BETWEEN @StartDate AND @EndDate";
var sqlCommand = new SqlCommand(cmdText, connection);
sqlCommand.Parameters.AddWithValue("@StartDate", dateTimePicker1.Value);
sqlCommand.Parameters.AddWithValue("@EndDate", dateTimePicker2.Value);
其中connection
是您的sql連接對象。
嘗試在使用dateTimePicker1.Text
的dateTimePicker1_ValueChanged
事件中使用dateTimePicker2.Checked
已檢查返回true
或false
而不是date的值
Checked是一個布爾型屬性,它不是日期。 您需要使用值屬性。 最好添加參數並顯式指定類型,以便解決日期格式沖突。
編輯:如果SQL Server中的列類型為NVARCHAR
且格式為MM/dd/yyyy
,則需要使用ONVERT(DATETIME, leaving_time, 101)
:
conn.Open();
SqlDataAdapter dataAdapter =
new SqlDataAdapter("SELECT name, mil_no, rotba, arrival_time, leaving_time, day, year "
+ "FROM dbo.Hodor_data where CONVERT(DATETIME, leaving_time, 101) "
+ "BETWEEN @p1 AND @p2", conn);
SqlParameter fromDate = new SqlParameter("@p1", SqlDbType.DateTime2);
fromDate.Value = dateTimePicker1.Value;
SqlParameter toDate = new SqlParameter("@p2", SqlDbType.DateTime2);
toDate.Value = dateTimePicker2.Value;
dataAdapter.SelectCommand.Parameters.Add(fromDate);
dataAdapter.SelectCommand.Parameters.Add(toDate);
DataTable dt = new DataTable();
dataAdapter.Fill(dt);
dataGridView1.DataSource = dt;
conn.Close()
您應該真正考慮將leaving_time
列的類型更改為DateTime列。 這將使您的查詢生活更加輕松。 我真的看不到將這些值存儲為文本的任何優勢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.