众所周知,我们在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数据库,才不会抛出异常报错。

ADO.NET 中可以发送包含多个SQL语句的批处理脚本到SQL Server,但是用MySQL的ODBC驱动不行的更多相关文章

  1. 同一SQL语句在PLSQL Developer与SQL * PLUS工具中执行结果不一致

    背景 今天遇到如下问题,同一sql语句在PLSQL Developer与SQL*PLUS工具中执行结果不一致, sql语句如下 SELECT 'GROUPHEALTH_SEND_EMAIL' as i ...

  2. 第三周博客之二---Oracle中的sql语句

    一.用户及权限(DBA有最高系统权限) 1.数据库的安全性:系统的安全性.数据的安全性 2.权限分类: 2.1系统权限:获得后可访问数据库 常用的有create table,create user,c ...

  3. 在django中,执行原始sql语句

    extra()方法 结果集修改器,一种提供额外查询参数的机制 使用extra: 1:Book.objects.filter(publisher__name='广东人员出版社').extra(where ...

  4. SQL Server中一些有用的日期sql语句

    SQL Server中一些有用的日期sql语句 1.一个月第一天的 SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) 2.本周的星期一 SELECT DA ...

  5. C# ADO.NET (sql语句连接方式)(查询)

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  6. C# ADO.NET (sql语句连接方式)(增,删,改)

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  7. 解析sql语句中left_join、inner_join中的on与where的区别

    以下是对在sql语句中left_join.inner_join中的on与where的区别进行了详细的分析介绍,需要的朋友可以参考下 table a(id, type):id     type ---- ...

  8. sql语句中left join、inner join中的on与where的区别

    table a(id, type): id     type ---------------------------------- 1      1 2      1 3      2 table b ...

  9. SQL*PLUS中批量执行SQL语句

    SQL*PLUS中批量执行SQL语句 今天由于工作的需要,要在CMD中批量执行大量的SQL语句,对于Oracle学习还处在入门阶段的我,只能硬着头皮到处去寻找资料(主要是网络资料,也包括自己的电子书) ...

随机推荐

  1. iOS ----------字符串处理

    //一.NSString/*----------------创建字符串的方法----------------*/ //1.创建常量字符串.NSString *astring = @"This ...

  2. Nginx 安装与部署配置以及Nginx和uWSGI开机自启

    下载 官方网站:https://nginx.org/en/download.html Windows下安装 安装 下载后解压(切记不能含有中文路径!!),文件结构如图(我解压的路径就有中文,记得拷贝放 ...

  3. Scala并发编程【快速入门】

    1.简介 Scala的actor提供了一种基于事件的轻量级线程.只要使用scala.actors.Actor伴生对象的actor()方法,就可以创建一个actor.它接受一个函数值/闭包做参数,一创建 ...

  4. Spark数据倾斜及解决方案

    一.场景 1.绝大多数task执行得都非常快,但个别task执行极慢.比如,总共有100个task,97个task都在1s之内执行完了,但是剩余的task却要一两分钟.这种情况很常见. 2.原本能够正 ...

  5. Java代码优化总结(持续更新)

    1.对equals不熟 例子 if(user.get("s").equals("ss")){ //一堆代码 } 注:一旦前端页面传null值过来,就错了,nul ...

  6. [翻译]LVM中逻辑卷的最大大小限制

    前言: 本文是对这篇博客Maximum Size Of A Logical Volume In LVM的翻译,敬请尊重原创和翻译劳动成果,那些随意转载的大爷们,好歹也自觉注明出处.谢谢! 英文原文地址 ...

  7. CSS杂谈(2)

    opacity 属性设置元素的不透明级别.   语法 opacity: value|inherit; 值 描述   value 规定不透明度.从 0.0 (完全透明)到 1.0(完全不透明).   i ...

  8. [20190305]删除审计登录信息不适合使用logrotate.txt

    [20190305]删除审计登录信息不适合使用logrotate.txt --//生产系统数据库sys用户登录会在/u01/app/oracle/admin/${ORACLE_SID}/adump/目 ...

  9. eclipse maven web

    在eclipse中用maven创建web项目. 环境配置 C:\Users\xxx>java -versionjava version "1.8.0_121"Java(TM) ...

  10. Greenplum源码安装(CentOS 7)

      最近在看GP,在安装集群的时候遇到了很多问题,在此记录下来. 目录 1 安装环境及软件版本 2 安装准备工作 2.1 修改hosts(所有机器) 2.2 修改系统内核配置(所有机器) 2.3 关闭 ...