众所周知,我们在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. Python-Django Win7上使用Apache24和mod_wsgi部署Django1.11应用程序

    Win7上使用Apache24和mod_wsgi部署Django1.11应用程序 by:授客 QQ:1033553122 测试环境 win7 64 Django-1.11.4.tar.gz 下载地址: ...

  2. 架构师成长之路-基于android fragment通信的面向对象的万能接口

    前言 开发一个app时,常用Activity和Fragment,由于操作方便Fragment越来越受欢迎,这样就避免不了Activity和Fragment.Fragment和Fragment之间的通信 ...

  3. ORACLE中内部函数SYS_OP_C2C和隐式类型转换

    什么是SYS_OP_C2C呢?官方的介绍如下: SYS_OP_C2C is an internal function which does an implicit conversion of varc ...

  4. scrapy入门:安装scrapy

    1.安装Scrapy pip 安装: pip install scrapy 要求pip至少是18.1版本的,10.x版本会提示更新pip 更新pip命令: python -m pip install ...

  5. Unity的AssetDatabase路径格式

    开发环境 windows 7 Unity 5.3 及更高版本 前言 使用AssetDatabase.Load或AnimatorController.CreateAnimatorControllerAt ...

  6. 安装Jenkins getting started卡住

    前言 jenkins版本:2.32.3 操作系统:windows 卡住信息 如果在安装jenkins时卡在getting startted的界面,如下所示 解决方法 1.打开 运行  输入 servi ...

  7. Linux中keepalived+LVS负载均衡的搭建测试

    1.1 LVS简介       LVS(Linux Virtual Server),也就是Linux虚拟服务器, 是一个自由软件项目.使用LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Lin ...

  8. 4.12Python数据处理篇之Matplotlib系列(十二)---绘图风格的介绍

    目录 目录 前言 (一)不同风格 1.说明: 2.使用: 3.代码使用: (二)例子演示 1.dark_background 2.bmh 3.fivethirtyeight 4.ggplot 5.gr ...

  9. spark SQL读取ORC文件从Driver启动到开始执行Task(或stage)间隔时间太长(计算Partition时间太长)且产出orc单个文件中stripe个数太多问题解决方案

    1.背景: 控制上游文件个数每天7000个,每个文件大小小于256M,50亿条+,orc格式.查看每个文件的stripe个数,500个左右,查询命令:hdfs fsck viewfs://hadoop ...

  10. JSONCkecker(C语言版本)

    /* JSON_checker.h */ typedef struct JSON_checker_struct { int valid; int state; int depth; int top; ...