2022年11月23日 星期三

[研究][ASP.NET] 用匯入 Excel (.xlsx) 中可不填寫「日期」欄位的處理

[研究][ASP.NET] 用匯入 Excel (.xlsx) 中可不填寫「日期」欄位的處理

2022-11-23

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C#

野人獻曝,僅供參考。

********************************************************************************

MyImport.aspx.cs 中 

...(略)

// ClosedXML 0.96
completeDateTime = table.Cell(i, 8).Value.ToString();

...(略)
//publicUpdateDateTime = table.Cell(i, 1).Value.ToString();

if (completeDateTime != "")
{
    bool convert = DateTime.TryParse(completeDateTime, out DateTime completeDateTime_DateTime);
    string completeDateTime_Convert = completeDateTime_DateTime.ToString("yyyy-MM-dd HH:mm:ss");
    completeDateTime = completeDateTime_Convert;
}
else
{
    completeDateTime = null;
}

errMsg = MyCommon.CheckMyTableRecord(
    ...(略)
    completeDateTime,
	...(略)
);
if (errMsg != "")
{
    //Fortify SCA : Critical : Cross-Site Scripting: Reflected
    errMsg = "#2匯入.xlsx共" + rowCount + "橫列" + columnCount + "行 (含標題列,若看不到,可能填寫了不可見字元),第" + (i - 1) + "筆 (Excel 第" + i.ToString() + "橫列)匯入失敗。\\n" + errMsg;
    errMsg = Common.MyAntiXssFilter(errMsg);
    Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('" + errMsg + "');</script>");
    Label_MSG1.Text = Common.MyAntiXssFilter(errMsg);
    Label_MSG1.ForeColor = System.Drawing.Color.Red;
    return;
}

queryString = @"
INSERT INTO [dbo].[MyTable]
           (
			...(略)
           ,[CompleteDateTime]
			...(略)
		   )
     VALUES
           (
			...(略)
           ,@completeDateTime
			...(略)
		   );
";

using (SqlConnection connection = new SqlConnection(WebConfigurationManager.ConnectionStrings["連線字串"].ConnectionString))
{
    SqlCommand command = new SqlCommand(queryString, connection);
    command.Parameters.Clear();
	...(略)
	// 參數化查詢 必須有參數 '@completeDateTime',但未提供。
    //command.Parameters.AddWithValue("@completeDateTime", completeDateTime);
    command.Parameters.AddWithValue("@completeDateTime", ((object)completeDateTime ?? DBNull.Value));
	...(略)
}	

MyCommon.cs 中

public static string CheckPublic111Record(...略)
{
	...(略)
	errMsg += CheckField(false, 255, "完成日期時間", completeDateTimeObject, "date", out completeDateTime);
	...(略)	
}

public static string CheckField(bool isRequired, int maxlen, string fieldChineseName, object fieldObject, string fieldType, out string fieldValue)
{
    string errMsg = "";
    fieldValue = "";
    if (fieldObject != null)
        fieldValue = fieldObject.ToString().Trim();
    if ((isRequired == true) && (fieldValue == ""))
    {
        errMsg = "「" + fieldChineseName + "」必填。";
        return errMsg;
    }
    if (fieldValue.Length >= maxlen)
    {
        errMsg = "「" + fieldChineseName + "」內容太長,限" + maxlen.ToString() + "字元。";
        return errMsg;
    }
    switch (fieldType)
    {
        case "string":
            //
            break;
        case "YesNo":
            if (!((fieldValue == "是") || (fieldValue == "否")))
            {
                errMsg = "「" + fieldChineseName + "」只能輸入「是」或「否」,但您填寫「" + fieldValue + "」。";
                return errMsg;
            }
            break;
        case "int":
            Int32.TryParse(fieldValue, out int fieldValue_Int);
            if (fieldValue != fieldValue_Int.ToString())
            {
                errMsg = "「" + fieldChineseName + "」必須輸入整數,但您填寫「" + fieldValue + "」。";
                return errMsg;
            }
            break;
        case "date":
            /*
                日期和時間 (Transact-SQL)
                https://msdn.microsoft.com/zh-tw/library/ms187819(v=sql.90).aspx
                datetime日期範圍:1753 年 1 月 1 日到 9999 年 12 月 31 日
                smalldatetime日期範圍:1900 年 1 月 1 日到 2079 年 6 月 6 日
                
                datetime2 (Transact-SQL)
                https://msdn.microsoft.com/zh-tw/library/bb677335(v=sql.120).aspx
                日期範圍:0001-01-01 到 9999-12-31,西元 1 年 1 月 1 日到西元 9999 年 12 月 31 日
             */
            bool parse = DateTime.TryParse(fieldValue, out DateTime fieldValue_DateTime);
            if (parse)
            {
                fieldValue = fieldValue_DateTime.ToString("yyyy/MM/dd");
            }
            else
            {
                if (isRequired == true)
                {
                    // 必填,一定要符合 datetime
                    errMsg = "「" + fieldChineseName + "」輸入資料無法轉換成日期格式,您填寫「" + fieldValue + "」。";
                    return errMsg;
                }
                else
                {
                    // 非必填,可以 null
                    fieldValue = null;
                }
            }
            break;
    }
    return errMsg;
}
#endregion 欄位檢查


(完)


相關

[研究][ASP.NET][WebForm] 日期 正規表示式驗證 RegularExpressionValidator

http://shaurong.blogspot.com/2020/03/aspnetwebform-regularexpressionvalidator.html

[研究] [C#] [ASP.NET] 除去日期格式中的 "上午"、"下午"

http://shaurong.blogspot.com/2017/01/c-aspnet.html

沒有留言:

張貼留言