如何在使用C#执行之前验证SQL查询

我有一个用户输入他的SQL查询的文本框。 但是,我需要在数据库中执行之前创建一个验证查询的程序。

例如:

假设用户输入

SELECT A1,
       A2,
       A3 
  FROM XYZ

所以现在,在执行查询之前,我需要检查A1A2A3是否存在于表XYZ 。 如果不是,则应该显示用户错误消息。

我无法想办法继续。 那么任何人都可以给出一个关于如何进一步进行的示例代码片段的基本想法?


我怀疑你是否应该这样做:

  • 如果XYZ不是一个表,而是返回光标的视图,物化视图,存储过程(取决于RDBMS)呢?
  • 如果XYZ是一个表格,但用户没有权限( grant )来读取它呢?
  • 如果用户没有A2字段阅读权限,该怎么办?
  • 还有其他应该考虑的情况

  • 查询可以重新编写(例如,通过FGA - 精细颗粒审计的Oracle)
  • XYZ可以是任何东西的同义词,例如dblink到Hadoop上的远程表,而这个Hadoop暂时停止服务
  • 所以我建议在没有任何初步检查的情况下执行查询,但是解析并解释抛出的异常(如果有的话)。


    非常合适的方法是在MS SQL中执行代码并让MS SQL找出错误。

    StringBuilder  query= new StringBuilder();
    
    query.Append("BEGIN n");
    query.Append("BEGIN TRY n");
    query.Append("    -- Table does not exist; object name resolution   n");
    query.Append("    -- error not caught.   n");
    query.Append("    --Append the variable which holds your sql query n");
    query.Append("    --For eg.: SELECT * FROM NonexistentTable;   n");
    query.Append("    END TRY n");
    query.Append("    BEGIN CATCH n");
    query.Append("      SELECT n");
    query.Append("        ERROR_NUMBER() AS ErrorNumber n");
    query.Append("       ,ERROR_MESSAGE() AS ErrorMessage; n");
    query.Append("    END CATCH n");
    query.Append("END");
    

    使用SQLCommand的ExcecuteScalar()来执行查询。

    SQL Server将返回提交查询的确切错误。


    所以现在,在执行查询之前,我需要检查A1,A2和A3是否存在于表XYZ中。

    如果要检查表中是否存在值,则必须在表中查询。 如果不执行查询,则无法找到表中是否存在该值。

    如果您在SQL Server中工作(例如),那么您可以使用IF EXISTS子句

    IF EXISTS(
        SELECT *
        FROM sys.columns 
        WHERE Name = 'A1' AND Name = 'A2' AND Name = 'A3' 
          AND Object_ID = Object_ID(N'XYZ'))
    BEGIN
    
    END
    
    链接地址: http://www.djcxy.com/p/93851.html

    上一篇: How do I validate an SQL query before executing it using C#

    下一篇: How to query max(len) from all columns?