簡體   English   中英

使用 C# DateTime 變量選擇 SQL DateTime

[英]Selecting SQL DateTime with C# DateTime variable

我正在嘗試運行一個查詢,該查詢從包含 DateTime 的表中選擇所有內容。 在 DateTime,它使用 DateTime 變量(通過參數傳遞的參數),但是它給了我這個例外:

FormatException 未處理mscorlib.dll 中發生類型為“System.FormatException”的未處理異常附加信息:該字符串未被識別為有效的日期時間”

我嘗試過的解決方案,但沒有奏效:

  • 將日期時間轉換為字符串
  • 將 DateTime 轉換為具有正確格式的字符串,然后再次返回 DateTime
  • 使用 DateTime.Parse 方法
  • 使用具有正確格式的 DateTime.ParseExact 方法並同時使用 "CultureInfo.InvariantCulture" 和 "CreateSpecificCulture("en-GB")
  • 將格式更改為在數據庫中運行查詢時顯示的完全相同

如上所述,以上都沒有奏效..

  • 我嘗試使用的格式:“MM/dd/yyyy 00:00:00”
  • 在數據庫中運行查詢時顯示的格式:“MM/dd/yyyy hh:mm:ss:fff”(時間需要設置為00:00:00)

這是排除連接內容的代碼:

cmd = new SqlCommand("SELECT * FROM Arithmetics "
                    + "INNER JOIN ArithmeticsAndTypeIDs "
                    + "ON Arithmetics.ArithmeticID = ArithmeticsAndTypeIDs.ArithmeticsID "
                    + "INNER JOIN ArithmeticTypes "
                    + "ON ArithmeticsAndTypeIDs.TypeID = ArithmeticTypes.TypeID "
                    + "WHERE UserID = @value1 "
                    + "AND TimeStamp >= '@value2' "
                    + "AND TimeStamp <= '@value3'", con);
                cmd.Parameters.AddWithValue("@value1", GetUserID(userLoggedIn));
                cmd.Parameters.AddWithValue("@value2", DateTime.ParseExact(time.ToString(), formatString, CultureInfo.CreateSpecificCulture("en-GB").DateTimeFormat));
                time = time.AddDays(1);
                cmd.Parameters.AddWithValue("@value3", DateTime.ParseExact(time.ToString(), formatString, CultureInfo.CreateSpecificCulture("en-GB").DateTimeFormat));

問題首先出現在這一行: "+ "AND TimeStamp >= '@value2' ""

* 以防萬一,這是我在數據庫中使用的引述,obv。 工作(用占位符值替換變量)

    SELECT * FROM Arithmetics
    INNER JOIN ArithmeticsAndTypeIDs 
    ON Arithmetics.ArithmeticID = ArithmeticsAndTypeIDs.ArithmeticsID
    INNER JOIN ArithmeticTypes 
    ON ArithmeticsAndTypeIDs.TypeID = ArithmeticTypes.TypeID
    WHERE UserID = 0
    AND
    ArithmeticTypes.TypeID = 2
    AND TimeStamp >= '09-21-2016 00:00:00'
    AND TimeStamp <= '09-22-2016 00:00:00'

應該注意的是,"@value2" 包含值 ("09-21-2016 00:00:00")(假設這是作為參數傳遞的日期),所以我知道格式是正確的。

任何解決此問題的幫助將不勝感激:)

您不需要將參數轉換為字符串。 這是使用它們而不是字符串連接的主要原因之一。 只要TimeStamp是與日期相關的類型,您的查詢就應該是:

WHERE UserID = @value1 AND TimeStamp BETWEEN @value2 and @value3

參數值應該在沒有任何轉換為​​字符串的情況下傳遞:

cmd.Parameters.AddWithValue("@value1", GetUserID(userLoggedIn));
cmd.Parameters.AddWithValue("@value2", time);
cmd.Parameters.AddWithValue("@value3", time.AddDays(1));

驅動程序本身以二進制形式傳遞參數,因此不必將它們轉換為文本。 這樣您就可以繞過任何格式或本地化問題。

您還可以避免 SQL 注入問題,因為參數值永遠不會成為查詢的一部分。 甚至字符串變量也被視為只是文本,它們永遠不會成為查詢的一部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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