ASP.NET中基于当前日期确定财年:数据插入/更新逻辑异常问题
问题分析与代码修正
你的代码目前存在几个关键问题,导致同一财年仍执行插入而非更新:
核心问题点
- 财年计算不完整:当当前月份小于4时,
NEWYEAR变量未被赋值(默认是0),导致查询条件完全错误,无法正确匹配同一财年的记录。 - 缺失更新逻辑:代码仅处理了无记录时的插入操作,完全没有编写同一财年存在记录时的更新逻辑。
- SQL注入风险:查询语句直接拼接用户输入,不仅存在安全隐患,还可能因输入格式问题导致查询失败。
修正后的完整代码
' 1. 正确计算财年结束年份(4月至次年3月为一个财年,用结束年份作为标识) Dim nowDate As Date = Date.Now Dim fiscalYearEnd As Integer If nowDate.Month >= 4 Then fiscalYearEnd = nowDate.Year + 1 Else fiscalYearEnd = nowDate.Year End If Dim reccount As Integer = 0 ' 2. 使用参数化查询统计同一财年的记录(避免SQL注入,保证查询准确性) Using cmdCount As New SqlCommand("SELECT COUNT(*) FROM ScanningData WHERE ASSET_NUMBER = @AssetNumber AND LOC_DEPT = @DeptCode AND UPDATE_DATE = @FiscalYearEnd", Conn) cmdCount.Parameters.AddWithValue("@AssetNumber", AssetTxt.Text) cmdCount.Parameters.AddWithValue("@DeptCode", DeptCodeTxt.Text) cmdCount.Parameters.AddWithValue("@FiscalYearEnd", fiscalYearEnd) reccount = Convert.ToInt32(cmdCount.ExecuteScalar()) End Using If reccount = 0 Then ' 3. 无记录时执行插入 Dim insertSql As String = "INSERT INTO ScanningData (ASSET_NUMBER,LOC_DEPT,DEPT_DESCRIPTION,MAJOR_CATEGORY,DATE_PLACED_IN_SERVICE,LOC_AREA,TAG_NUMBER,CURRENT_UNITS,DESCRIPTION,MYR_COST_BY_UNIT,COST_BY_UNIT,DEPRN_RESERVE_BY_UNIT,DATE_RETIRED,UPDATE_DATE,UPDATE_BY) VALUES (@ID, @CODE, @DEPT, @CATEGORY, @SERVICEDATE, @AREA, @TAG, @UNIT, @DESCRIPTION, @MYRCOST, @USDCOST, @DEPR, @RETIREDDATE, @UPDATEDATE, @NAME);" Using cmdInsert As New SqlCommand(insertSql, Conn) cmdInsert.Parameters.AddWithValue("@ID", AssetTxt.Text) cmdInsert.Parameters.AddWithValue("@CODE", DeptCodeTxt.Text) cmdInsert.Parameters.AddWithValue("@DEPT", DeptTxt.Text) cmdInsert.Parameters.AddWithValue("@CATEGORY", CategoryTxt.Text) cmdInsert.Parameters.AddWithValue("@SERVICEDATE", ServiceTxt.Text) cmdInsert.Parameters.AddWithValue("@AREA", LocTxt.Text) cmdInsert.Parameters.AddWithValue("@TAG", TagTxt.Text) Dim unit As Decimal = Decimal.Parse(UnitTxt.Text) cmdInsert.Parameters.AddWithValue("@UNIT", unit) cmdInsert.Parameters.AddWithValue("@DESCRIPTION", DescTxt.Text) Dim MYRCost As Decimal = Decimal.Parse(CostMYRTxt.Text) cmdInsert.Parameters.AddWithValue("@MYRCOST", MYRCost) Dim USDCost As Decimal = Decimal.Parse(CostUSDTxt.Text) cmdInsert.Parameters.AddWithValue("@USDCOST", USDCost) Dim Depr As Decimal = Decimal.Parse(DeprTxt.Text) cmdInsert.Parameters.AddWithValue("@DEPR", Depr) cmdInsert.Parameters.AddWithValue("@RETIREDDATE", RetiredDateTxt.Text) cmdInsert.Parameters.AddWithValue("@UPDATEDATE", fiscalYearEnd) ' 存储财年结束年份 cmdInsert.Parameters.AddWithValue("@NAME", UserIDLabel.Text) cmdInsert.ExecuteNonQuery() End Using Else ' 4. 同一财年存在记录时执行更新 Dim updateSql As String = "UPDATE ScanningData SET DEPT_DESCRIPTION = @DEPT, MAJOR_CATEGORY = @CATEGORY, DATE_PLACED_IN_SERVICE = @SERVICEDATE, LOC_AREA = @AREA, TAG_NUMBER = @TAG, CURRENT_UNITS = @UNIT, DESCRIPTION = @DESCRIPTION, MYR_COST_BY_UNIT = @MYRCOST, COST_BY_UNIT = @USDCOST, DEPRN_RESERVE_BY_UNIT = @DEPR, DATE_RETIRED = @RETIREDDATE, UPDATE_BY = @NAME WHERE ASSET_NUMBER = @ID AND LOC_DEPT = @CODE AND UPDATE_DATE = @UPDATEDATE;" Using cmdUpdate As New SqlCommand(updateSql, Conn) cmdUpdate.Parameters.AddWithValue("@ID", AssetTxt.Text) cmdUpdate.Parameters.AddWithValue("@CODE", DeptCodeTxt.Text) cmdUpdate.Parameters.AddWithValue("@DEPT", DeptTxt.Text) cmdUpdate.Parameters.AddWithValue("@CATEGORY", CategoryTxt.Text) cmdUpdate.Parameters.AddWithValue("@SERVICEDATE", ServiceTxt.Text) cmdUpdate.Parameters.AddWithValue("@AREA", LocTxt.Text) cmdUpdate.Parameters.AddWithValue("@TAG", TagTxt.Text) Dim unit As Decimal = Decimal.Parse(UnitTxt.Text) cmdUpdate.Parameters.AddWithValue("@UNIT", unit) cmdUpdate.Parameters.AddWithValue("@DESCRIPTION", DescTxt.Text) Dim MYRCost As Decimal = Decimal.Parse(CostMYRTxt.Text) cmdUpdate.Parameters.AddWithValue("@MYRCOST", MYRCost) Dim USDCost As Decimal = Decimal.Parse(CostUSDTxt.Text) cmdUpdate.Parameters.AddWithValue("@USDCOST", USDCost) Dim Depr As Decimal = Decimal.Parse(DeprTxt.Text) cmdUpdate.Parameters.AddWithValue("@DEPR", Depr) cmdUpdate.Parameters.AddWithValue("@RETIREDDATE", RetiredDateTxt.Text) cmdUpdate.Parameters.AddWithValue("@UPDATEDATE", fiscalYearEnd) cmdUpdate.Parameters.AddWithValue("@NAME", UserIDLabel.Text) cmdUpdate.ExecuteNonQuery() End Using End If
关键修正说明
- 财年计算:补充了月份<4时的财年逻辑,确保任何时间都能得到正确的财年结束年份(比如2025年1月属于2025财年,对应2024年4月-2025年3月)。
- 参数化查询:全程使用参数化语句,彻底消除SQL注入风险,同时避免了字符串拼接导致的格式错误。
- 添加更新逻辑:在
reccount>0时执行UPDATE操作,覆盖同一财年的现有记录。 - 资源管理:使用
Using语句自动管理SqlCommand资源,无需手动调用Dispose或Close,保证资源正确释放。
内容的提问来源于stack exchange,提问作者hasni
相关产品推荐
相关产品推荐

