c# - 检索满足选定条件的数据的最佳实践

标签 c# .net sql datatable

我有一个名为 call 的数据库表,其中包含 call_time、location、emergency_type 列,紧急情况分为三种类型:护理人员、警察和消防员。在 Windows 窗体中,我创建了复选框“护理人员”、“警察”、“消防员”,我想检索所有符合用户选择的表格列。

我创建了一个函数:

public static DataTable GetHistory(DateTime from, DateTime to, bool paramedics, bool police, bool firefighters)
    {
        string select =
            "SELECT call_time, location, emergency_type where call_time between @from AND @to AND";
        if(paramedics)
        {
            select += " emergency_type = 'paramedics' ";
        }
        if(paramedics && police)
        {
           select +=" emergency_type = 'paramedics' OR emergency_type = 'police';
        }
        ...

    }

然而,这段代码看起来很脏,因为如果有 30 种紧急情况,那么就有 30 种!组合,我会在写所有 if 语句之前变老。

如果您可以分享您检索满足所选搜索条件的数据的实践,如果您可以选择很多选项,我将不胜感激。

谢谢!

最佳答案

好吧,如果您必须将 emergency_type 用作字符串,那么您可以发送一个包含紧急类型文本表示的列表,而不是传递 bool 值。例如,要调整上面的代码,您可以将方法签名更改为

public static DataTable GetHistory(DateTime from, DateTime to, List<string> types)
{
 ..
}

然后传入一个看起来像这样的列表(例如)

List<string> types = 
  new List<string> { "paramedics" };

or 

List<string> types = 
  new List<string> { "paramedics", "police" };

然后您可以调整您的查询以在您的 where 子句中使用 SQL IN 语句。接下来将字符串列表转换为逗号分隔的字符串,如

string values = "'paramedics', 'police'"

创建值变量的一种简单方法是使用

string values = string.Empty;
            types.ForEach(s =>
            {
               if (!string.IsNullOrEmpty(values))
                   values += ",";
               values += string.Format("'{0}'", s);

            });

顺便说一句,您可以使用参数化命令来避免 SQL 注入(inject)。一旦你有了字符串,你就可以简单地做

string select =
 "SELECT call_time, location, emergency_type where call_time between @from AND @to AND emergency_type IN " + values

关于c# - 检索满足选定条件的数据的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/255642/

相关文章:

c# - 使用 CDO 通过代理发送电子邮件

c# - 如何从 ViewStart 中访问(自定义)Web 助手?

c# - 为什么我可以从线程中的表单访问控件而不会出现跨线程异常?

c# - T-SQL Fastforward 游标与 foreach

.net - 在 Azure 媒体服务上发布视频

.net - 自定义控件(groupbox、picturebox、label)——鼠标进入,内部消失

c# - 检查 AD 帐户是否在 Active Directory 中具有 "Logon on as a service"权限

sql - 为什么我不能在 informix 子查询中使用 first

sql - 在 SQL Server 中将一个表连接到两个一对多关系表

sql - 按降序对列表进行排序的时间复杂度。