zoukankan      html  css  js  c++  java
  • 检查SQL语句是否合法

    昨天又有一个新的需求:验证文本框输入的SQL语法是否正确。

    于是就开始百度,其实也挺简单的。

    首先需要知道“SET PARSEONLY { ON | OFF }”。

     

        当 SET PARSEONLY 为 ON 时,SQL Server 只分析语句。

        当 SET PARSEONLY 为 OFF 时,SQL Server 编译并执行语句。

     

    和 SET PARSEONLY 相关的还有SET NOEXEC ON,

     

        当 SET NOEXEC 为 ON 时,SQL Server 将编译每一条Tran-SQL语句但并不执行它们。

        当 SET NOEXEC 为 OFF 时,SQL Server 编译并执行语句。

     

        现在我们就可以完成SQL语法检测的功能了。 

        下面是具体的代码, 可以将其中的 ParseOnly  调整为 NoExec 

    public static bool ValidateSQL(string sql)  
    {  
        var connStr = "server=localhost;database=jhly;user id=sa;password=1";  
        bool bResult;  
        using (SqlConnection conn = new SqlConnection(connStr))  
        {  
            using (SqlCommand cmd = new SqlCommand())  
            {  
                if (conn.State != ConnectionState.Open)  
                    conn.Open();  
                cmd.Connection = conn;  
                cmd.CommandText = "SET PARSEONLY ON";  
                  
                try  
                {  
                    string strParams = "@starttime";  
                    cmd.CommandText = sql;  
                    cmd.Parameters.AddWithValue(strParams, "2010-01-01");  
                    cmd.ExecuteNonQuery();  
                    bResult = true;  
                }  
                catch (Exception ex)  
                {  
                    bResult = false;  
                    LogHelper.Error("SQL语法错误" + ex);  
                }  
                finally  
                {  
                    cmd.CommandText = "SET PARSEONLY OFF";  
                    cmd.ExecuteNonQuery();  
                }  
            }  
        }  
        return bResult;  
    }  

    他们之间的一些区别:

    1.SET PARASEONLY 检查每个Tran-SQL 的语法并返回错误消息,不编译和执行语句。

      SET NOEXEC 编译每个查询但不执行查询。

    2.SET PARASEONLY 的设置是在分析时设置,不是在执行或运行时设置。

      SET NOEXEC 的设置在执行或运行时设置,不是在分析时设置。

    本文转自: https://blog.csdn.net/andrewniu/article/details/80166090

  • 相关阅读:
    主键、外键和索引的区别
    设置session超时的三种方式
    redis常用操作
    timestamp 转 date 处理后再转timestamp
    fragment在水平/垂直时的应用
    Activity堆栈管理
    ORMLite的使用
    onItemLongClick事件的监听
    Bundle的使用
    有关implicit Intent的使用
  • 原文地址:https://www.cnblogs.com/iiwen/p/9642097.html
Copyright © 2011-2022 走看看