c# - 根据字符串值搜索 int 列

标签 c# sql sql-server tsql sql-server-2014

我在 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>

最佳答案

一些建议

您提供的查询需要优化:

  1. 首先,使用CAST(bkID AS NVARCHAR(MAX))会影响查询的性能,因为它不会使用任何索引,也强制转换为NVARCHAR(MAX ) 会降低性能。

  2. bkStatus 是一个数字列,因此您必须使用 = 运算符并与数值进行比较 (0 or 1 or ...),而且所提供的文本值是在 asp 标记中定义的,而不是在数据库中定义的,因此它们在应用程序级别而不是数据级别使用。

  3. 如果您使用 CAST(bkID AS NVARCHAR(MAX)) 搜索包含特定数字的 bkid(例如:搜索 1 -> 结果 1,10,11,...),然后尝试转换为特定大小(例如:CAST(bkID as NVARCHAR(10))

  4. 建议使用参数化查询以获得更好的性能并防止Sql 注入(inject) 攻击。 看看@un-lucky 的回答

  5. 您可以使用字典对象来存储与关键字相关的 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/

相关文章:

Javascript Ajax 前端调用 asp.net C# 后端

c# - 在服务器上保存生成的 pdf

c# - VB.NET 到 C# 的转换——非 EventHandler 事件的接口(interface)事件声明

c# - 64 位内存不足异常

sql-server - SQL Server 2005+ 中的正则表达式

sql-server - sql server 排序规则是否意味着列名必须大小写正确?以及如何处理这个问题

php - 将 Unix 时间戳转换为 MySQL DATETIME

sql - 将带有 `T` 的字符串解析为时间戳 PostgreSQL

python - Pyspark:如何从时间戳中提取小时

sql-server - 将 varchar 值 'N' 转换为数据类型 int 时转换失败