簡體   English   中英

C#生成查詢以將DateTime與SQL Nvarchar date列進行比較

[英]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.TextdateTimePicker1_ValueChanged事件中使用dateTimePicker2.Checked已檢查返回truefalse而不是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM