我在 sql server 2014 中有一个 View View_Booking
:
bkID bkSlot bkStatus
---- ------ --------
2 Lunch 1
4 Lunch 1
6 Dinner 0
7 Lunch 1
虽然在 c# 中,我使用了 gridview 并将 bkStatus
转换为如下字符串:
<asp:Label ID="lblStatus" Text='<%# (Eval("bkStatus")+"" == "1") ? "Booked" : "Pending" %>'
... ></asp:Label>
bkID bkSlot bkStatus
---- ------ --------
2 Lunch Booked
4 Lunch Booked
6 Dinner Pending
7 Lunch Booked
现在我正在使用此查询搜索 View :
SELECT * FROM View_Booking
WHERE CAST(bkID AS NVARCHAR(MAX)) LIKE '%" + keyword + "%'
OR bkSlot LIKE '%"+keyword+"%'
OR bkStatus LIKE << ? >>
但不知道如何搜索 bkStatus
,它在 c# 中作为 string 传递,而在 sql 中是 int? p>
最佳答案
一些建议
您提供的查询需要优化:
首先,使用
CAST(bkID AS NVARCHAR(MAX))
会影响查询的性能,因为它不会使用任何索引,也强制转换为NVARCHAR(MAX )
会降低性能。bkStatus
是一个数字列,因此您必须使用=
运算符并与数值进行比较(0 or 1 or ...)
,而且所提供的文本值是在asp
标记中定义的,而不是在数据库中定义的,因此它们在应用程序级别而不是数据级别使用。如果您使用
CAST(bkID AS NVARCHAR(MAX))
搜索包含特定数字的bkid
列(例如:搜索1
-> 结果1
,10
,11
,...),然后尝试转换为特定大小(例如:CAST(bkID as NVARCHAR(10)
)建议使用参数化查询以获得更好的性能并防止Sql 注入(inject) 攻击。 看看@un-lucky 的回答
您可以使用字典对象来存储与关键字相关的 ID 值
例子
注意:CAST 和 Like 的使用不会使用任何索引,这个例子是根据你的要求(我尝试结合我提供的建议和其他人的建议)
var dicStatus = new Dictionary<int, string> {
{ 0, "Pending" },
{ 1, "Booked" },
{ 2, "Cancelled" }
// ...
};
string querySql = " SELECT * FROM View_Booking" +
" WHERE CAST(bkID AS NVARCHAR(10)) LIKE @bkID" +
" OR bkSlot LIKE @bkSlot" +
" OR bkStatus = @status";
using (SqlConnection dbConn = new SqlConnection(connectionString))
{
dbConn.Open();
using (SqlCommand sqlCommand = new SqlCommand(querySql, dbConn))
{
sqlCommand.Parameters.Add("@bkID", SqlDbType.VarChar).value ="%" + keyword + "%";
sqlCommand.Parameters.Add("@bkSlot", SqlDbType.VarChar).value ="%" + keyword + "%";
sqlCommand.Parameters.Add("@status", SqlDbType.Int).value = dicStatus.FirstOrDefault(x => x.Value == keyword).Key;
sqlCommand.ExecuteNonQuery();
}
}
此外,如果 BkID 是整数列,则最好使用
sqlCommand.Parameters.Add("@bkID", SqlDbType.Int).value = (Int)keyword ;
引用和有用的链接
关于c# - 根据字符串值搜索 int 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48013284/