【问题标题】:C#: SqlCommand is SQL query or stored procedure name?C#:SqlCommand 是 SQL 查询还是存储过程名称?
【发布时间】:2022-12-31 20:30:07
【问题描述】:

我正在寻找验证查询文本的最佳解决方案。我需要知道cmdText 是否有效?这是 func 必须为这些值返回 true:

"Proc1", "[Proc1]", dbo.Proc1, [dbo].Proc1, [Proc 1]

SQL 查询为 false:

"SELECT 1 /* more text more text */".

请以最好的方式重新编码 IsName func ...

void CreateCommand(string? cmdText)
{
    Microsoft.Data.SqlClient.SqlCommand command = new();
    command.CommandText = cmdText;

    if (IsName(cmdText)) 
        command.CommandType = CommandType.StoredProcedure;
}

bool IsName(string? cmdText) => (cmdText?.Length > 50) ? false : true;

【问题讨论】:

  • 为什么需要一个函数来确定它?通常,您(或任何使用您的代码的人)应该知道自己是否要调用存储过程,或者是否有临时 SQL 查询
  • 这完全基于长度字符串似乎是一个非常糟糕的主意......但这里真的没有“银弹” - 无论你做什么 - 你最终可能会猜错。为什么要猜测?为什么编码器不能使用 SqlCommand他在做什么 - 调用存储过程,或执行临时 SQL 查询?
  • 我试图摆脱额外的参数。命令类型github.com/UkrGuru/SqlJson/blob/main/src/Crud/ApiDbService.cs
  • 这与试图摆脱另一个额外参数 CommandText 没什么不同。
  • 但是,answering the X part,您最好的猜测可能是将您的cmdText传递给parsename,如果返回结果,请查看sys.objects中是否存在具有这些名称和架构的记录以及type ='P'

标签: c# sql-server sqlcommand


【解决方案1】:

使用正则表达式的解决方案:

Regex.IsMatch(cmd, @"^(w+|[.+?])(.(w+|[.+?]))?$")

解释:

  • (w+|[.+?]) 匹配“单词”字符序列(您可以根据需要将 w 替换为 [A-Za-z0-9_] 或类似字符),或者匹配方括号中的任何字符序列。
  • (.(w+|[.+?]))? 匹配一个点后跟与上面相同的点,或者什么都不匹配
  • ^$锚点分别匹配字符串的开始和结束

【讨论】:

    【解决方案2】:
        public Boolean IsName(string _query)
        {
            return _query.Contains("Proc1") || _query.Contains("Proc 1");
        }
    

    【讨论】:

    • 所以"select 'Proc1'"会返回true。而 "exec proc1" 将返回 false
    • 还应检查查询是否以 exec 开头。但是问题中没有提到
    • 馊主意 。我们可以使用任何存储过程名称
    猜你喜欢
    • 2015-08-07
    • 1970-01-01
    • 2016-10-18
    • 2020-02-11
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多