1. 程式人生 > >ADO.NET 中SQL Server可以插入含多個SQL語句的批處理腳本,但是用MySQL的ODBC驅動不行

ADO.NET 中SQL Server可以插入含多個SQL語句的批處理腳本,但是用MySQL的ODBC驅動不行

.org 方便 8.0 star man date mys 進行 ror

眾所周知,我們在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 Server可以插入含多個SQL語句的批處理腳本,但是用MySQL的ODBC驅動不行