zoukankan      html  css  js  c++  java
  • ADO.NET 中可以发送包含多个SQL语句的批处理脚本到SQL Server,但是用MySQL的ODBC驱动不行

    众所周知,我们在ADO.NET中可以使用NuGet包System.Data.SqlClient来操作SQL Server,并且ADO.NET是支持向SQL Server发送包含多个SQL语句的批处理脚本的。

    我们新建一个.NET Core控制台项目,然后引入下面两个NuGet包:

    System.Data.SqlClient

    System.Data.Odbc

    然后下面的代码演示了,我们使用NuGet包System.Data.SqlClient向SQL Server发送了一段包含UPDATE和INSERT语句的SQL批处理脚本:

    string connectionString = "Data Source=192.168.1.102;Initial Catalog=TestDB;Integrated Security=True";
    string sql = @"
    UPDATE jobs
    SET JobStatus=999,
    EndTime=GETDATE()
    Where JobStatus<100;
    
    INSERT INTO jobs(JobCode,JobStatus,StartTime)
    VALUES(N'db555cc9-56fe-42f6-8c31-ce99e9b856c4',0,GETDATE());";
    
    using (SqlConnection sqlCon = new SqlConnection(connectionString))
    {
        sqlCon.Open();
    
        var sqlCommand = new SqlCommand(sql, sqlCon);
        sqlCommand.ExecuteNonQuery();
    }

    这种用法在System.Data.SqlClient上很常见,我们可以很方便地将若干个SQL语句写在一个字符串里,然后通过System.Data.SqlClient一次性发送到SQL Server进行处理。

    但是如果现在我们使用NuGet包System.Data.Odbc,往MySQL中也发送一段包含UPDATE和INSERT语句的SQL批处理脚本:

    string connectionString = "Dsn=MySQL_DB";
    string sql = @"
    UPDATE jobs
    SET JobStatus=999,
    EndTime=NOW()
    Where JobStatus<100;
    
    INSERT INTO jobs(JobCode,JobStatus,StartTime)
    VALUES(N'db555cc9-56fe-42f6-8c31-ce99e9b856c4',0,NOW());";
    
    using (OdbcConnection oCon = new OdbcConnection(connectionString))
    {
        oCon.Open();
    
        var oCommand = new OdbcCommand(sql, oCon);
        oCommand.ExecuteNonQuery();
    }

    那么上面的代码会在执行到oCommand.ExecuteNonQuery()时抛出异常:

    ERROR [42000] [MySQL][ODBC 8.0(w) Driver][mysqld-8.0.11]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO jobs(JobCode,JobStatus,StartTime)
                VALUES(N'db555cc9-56f' at line 6

    原因就是因为MySQL的ODBC驱动,不支持将若干个SQL语句写在一个字符串里,然后通过System.Data.Odbc发送到MySQL数据库进行处理。

    如果要使用System.Data.Odbc向MySQL数据库发送多条SQL语句,只能像下面这样一条一条地分多次发送,而不能在一个字符串中一次性发送:

    string connectionString = "Dsn=MySQL_DB";
    
    using (OdbcConnection oCon = new OdbcConnection(connectionString))
    {
        oCon.Open();
    
        string sql = @"
        UPDATE jobs
        SET JobStatus=999,
        EndTime=NOW()
        Where JobStatus<100;";
    
        var oCommand = new OdbcCommand(sql, oCon);
        oCommand.ExecuteNonQuery();//先发送UPDATE语句到MySQL数据库
    
        sql = @"INSERT INTO jobs(JobCode,JobStatus,StartTime)
        VALUES(N'db555cc9-56fe-42f6-8c31-ce99e9b856c4',0,NOW());";
    
        oCommand = new OdbcCommand(sql, oCon);
        oCommand.ExecuteNonQuery();//再发送INSERT语句到MySQL数据库
    }

    可以看到我们只能使用System.Data.Odbc,分两次,先发送UPDATE语句,再发送INSERT语句到MySQL数据库,才不会抛出异常报错。

  • 相关阅读:
    orcle id和执行计划(转)
    mysql 授权
    nginx+php 安装手册
    为 MySQL 增加 HTTP/REST 客户端:MySQL UDF 函数 mysql-udf-http 1.0 发布
    Nginx提示502和504错误的解决方案
    error while loading shared libraries: xxx.so.x"错误的原因和解决办法
    lnmp memcache出问题
    Nginx下实现pathinfo及ThinkPHP的URL Rewrite模式支持
    Nginx代理与负载均衡配置与优化
    curl+ post/get 提交
  • 原文地址:https://www.cnblogs.com/OpenCoder/p/10621320.html
Copyright © 2011-2022 走看看