众所周知,我们在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. VRRP技术总结和配置实践

    1.VRRP作为网关可靠性的常用方法,基本思路是,两台路由器组成一个虚拟路由器,通过VRRP协议对内网呈现一个虚拟的网关ip, 以便让局域网内部的终端通过这个虚拟网关对外进行通信. 2.VRRP的最简 ...

  2. JMeter 报告监听器导入.jtl结果文件报错解决方案

    JMeter 报告监听器导入.jtl结果文件报错解决方案   by:授客 QQ:1033553122   1. 问题描述 把jmeter压测时生成的 .jtl结果文件导入监听器报告中,弹出如下错误提示 ...

  3. Node.js学习记录(一)--安装设置篇

    安装Node window window上安装node可选择以下两种方式: 方式一:直接进入官网下载安装 进入node.js官网点击windows,选择.msi后缀的,根据自己的电脑选择对应的64位或 ...

  4. 智能ERP 交接班统计异常的解决方法

    请注意,有交接班统计数据不准确的需开启离线统计即可解决,交接班统计是按照结账时间来进行统计的 1.点击左侧导航栏中‘更多’-进入系统设置 2.进入营业设置后-开启离线统计-点击保存

  5. Elasticsearch深入搜索之结构化搜索及JavaAPI的使用

    一.Es中创建索引 1.创建索引: 在之前的Es插件的安装和使用中说到创建索引自定义分词器和创建type,当时是分开写的,其实创建索引时也可以创建type,并指定分词器. PUT /my_index ...

  6. 修改主机时间对MySQL影响

    背景 在装机实施时,BIOS忘记调整时间,导致服务器时间与CST不符合:待发现问题时,MySQL环境已经在运行,所以只能通过操作系统进行更改:但是更改完成后,MySQL进行重启时发生了问题.以下为问题 ...

  7. SpringCloud之初识Zuul(网关)---动态路由,权限验证

    通过前面的学习,使用Spring Cloud实现微服务的架构基本成型,大致是这样的: 我们使用Spring Cloud Netflix中的Eureka实现了服务注册中心以及服务注册与发现:而服务间通过 ...

  8. 用python设置定时任务

    python中的轻量级定时任务调度库:schedule   提到定时任务调度的时候,相信很多人会想到芹菜celery,要么就写个脚本塞到crontab中.不过,一个小的定时脚本,要用celery的话太 ...

  9. 如何学习Linux性能优化?

    如何学习Linux性能优化? 你是否也曾跟我一样,看了很多书.学了很多 Linux 性能工具,但在面对 Linux 性能问题时,还是束手无策?实际上,性能分析和优化始终是大多数软件工程师的一个痛点.但 ...

  10. flask基础入门

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...