【发布时间】:2018-07-29 22:17:42
【问题描述】:
我有一个存储过程如下:
@AgencyID VARCHAR(50),
@TNID INT = NULL,
@ProviderName VARCHAR(100) = NULL,
@County VARCHAR(50) = NULL,
@Region VARCHAR(50) = NULL
SELECT *
FROM CustomerInfo
WHERE AgencyID = @AgencyID
AND (TNID LIKE '%' + ISNULL(CAST(@TNID AS VARCHAR(50)), '') + '%')
AND (ProviderName LIKE '%' + ISNULL(@ProviderName, '') + '%')
AND (County LIKE '%' + ISNULL(@County, '') + '%')
AND (Region LIKE '%' + ISNULL(@Region, '') + '%')
我面临的问题是,每当整数 TNID 值为空时,即使某些参数具有值,我的查询也不会返回任何内容。尽管我有 ISNULL 函数,但它不接受 null 值来返回准确的数据。
如果我使用直接的 C# 代码,它可以完美运行,但我想在我的存储过程中使用相同的场景来防止将来的 SQL 注入
string query = "SELECT * FROM CustomerInfo WHERE AgencyID = '" + agency.Text + "' AND TNID LIKE '%" + tnid.Text + "%' AND ProviderName LIKE '%" + prvName.Text + "%' AND County LIKE '%" + countyList.Text + "%' AND Region LIKE '%" + region.Text + "%'";
【问题讨论】:
-
铸造然后检查 ISNULL 或 ISNULL 然后铸造?
-
我先检查是否 ISNULL,然后将其转换为 varchar,以防万一它为 null ('')
-
如果你想避免 C# 上的 sql 注入,只需使用查询参数。
-
ISNULL(CAST(@TNID AS VARCHAR(50)), '') 是第一次转换,然后如果我没记错就做 isnull
-
ISNULL(CAST(@TNID AS VARCHAR(50)), '') 是转换然后检查(抱歉),但我仍然面临同样的问题
标签: c# asp.net sql-server tsql