C# 如何使用OracleC命令执行不同的多个SQL语句#
我尝试使用OracleCommand执行不同的SQL语句C# 如何使用OracleC命令执行不同的多个SQL语句#,c#,.net,oracle,oracle.manageddataaccess,C#,.net,Oracle,Oracle.manageddataaccess,我尝试使用OracleCommand执行不同的SQL语句 var conn = new OracleConnection("User Id=SYSTEM;Password=mw;Data Source=SampleDataSource"); // Open the connection if (conn.State != ConnectionState.Open) conn.Open(); string sql = @" DROP TABLE CUSTOMERS; C
var conn = new OracleConnection("User Id=SYSTEM;Password=mw;Data Source=SampleDataSource");
// Open the connection
if (conn.State != ConnectionState.Open)
conn.Open();
string sql = @"
DROP TABLE CUSTOMERS;
CREATE TABLE CUSTOMERS (
ID INT NOT NULL PRIMARY KEY,
NAME VARCHAR(12) NOT NULL,
AGE INT,
ADDRESS VARCHAR(12)
);
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS) VALUES (1, 'Mark', 28, 'NY');
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS) VALUES (2, 'John', 39, 'LA');
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS) VALUES (3, 'Andy', 48, 'CA');
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS) VALUES (4, 'Allan', 53, 'LA');
";
var cmd = new OracleCommand(sql, conn);
try
{
cmd.ExecuteNonQuery();
}
catch (OracleException e)
{
error = e.Message;
}
finally
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
我得到以下例外情况
ORA-00933:SQL命令未正确结束
当我在BEGIN,END块中包含多个语句时,我得到了以下异常
ORA-06550:第2行第1列:
PLS-00103:在预期以下情况时遇到符号“下降”:
public static class DbConnectionFactory {
public static IDbConnection Create(string connectionString) {
var connection = new OracleConnection(connectionString);
connection.Open();
return connection;
}
}
const string dropTableCustomers = "DROP TABLE CUSTOMERS";
const string createTableCustomers = @"
CREATE TABLE CUSTOMERS (
ID INT NOT NULL PRIMARY KEY,
NAME VARCHAR(12) NOT NULL,
AGE INT,
ADDRESS VARCHAR(12))";
const string insertCustomerMark = "INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS) VALUES (1, 'Mark', 28, 'NY')";
const string insertCustomerJohn = "INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS) VALUES (2, 'John', 39, 'LA')";
using (var connection = DbConnectionFactory.Create("User Id=SYSTEM;Password=mw;Data Source=SampleDataSource"))
using (var transaction = connection.BeginTransaction()) {
connection.Execute(dropTableCustomers);
connection.Execute(createTableCustomers);
connection.Execute(insertCustomerMark);
connection.Execute(insertCustomerJohn);
transaction.Commit();
}
(begin case declare exit for goto if loop mod null pragma raise return select update with withexecute immediate将使您能够执行多条语句
OracleConnection con = new OracleConnection("User Id=SYSTEM;Password=mw;Data Source=SampleDataSource");
if (con.State != ConnectionState.Open)
con.Open();
OracleCommand cmd = new OracleCommand();
cmd.Connection = con;
cmd.CommandText =
"begin " +
" execute immediate 'DROP TABLE CUSTOMERS';" +
" execute immediate 'CREATE TABLE CUSTOMERS (ID INT NOT NULL PRIMARY KEY,NAME VARCHAR(12) NOT NULL, AGE INT, ADDRESS VARCHAR(12))';" +
" execute immediate 'INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS) VALUES (1, 'Mark', 28, 'NY')';" +
" execute immediate 'INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS) VALUES (2, 'John', 39, 'LA')';" +
" execute immediate 'INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS) VALUES (3, 'Andy', 48, 'CA')';" +
" execute immediate 'INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS) VALUES (4, 'Allan', 53, 'LA')';" +
"end;"
cmd.CommandType = CommandType.Text;
try
{
cmd.ExecuteNonQuery();
}
catch (OracleException e)
{
error = e.Message;
}
finally
{
if (con.State == ConnectionState.Open)
{
con.Close();
}
}
也许对每条语句使用命令会更好。 下面是一个例子 如果您需要交易,可以执行以下操作:
public static class DbConnectionFactory {
public static IDbConnection Create(string connectionString) {
var connection = new OracleConnection(connectionString);
connection.Open();
return connection;
}
}
const string dropTableCustomers = "DROP TABLE CUSTOMERS";
const string createTableCustomers = @"
CREATE TABLE CUSTOMERS (
ID INT NOT NULL PRIMARY KEY,
NAME VARCHAR(12) NOT NULL,
AGE INT,
ADDRESS VARCHAR(12))";
const string insertCustomerMark = "INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS) VALUES (1, 'Mark', 28, 'NY')";
const string insertCustomerJohn = "INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS) VALUES (2, 'John', 39, 'LA')";
using (var connection = DbConnectionFactory.Create("User Id=SYSTEM;Password=mw;Data Source=SampleDataSource"))
using (var transaction = connection.BeginTransaction()) {
connection.Execute(dropTableCustomers);
connection.Execute(createTableCustomers);
connection.Execute(insertCustomerMark);
connection.Execute(insertCustomerJohn);
transaction.Commit();
}
您可以创建一个存储过程并使用execute immediate吗?您必须使用execute immediate删除表。您也可以尝试使用此execute immediate来调用多个语句。这可能与Oracle无关,但在MS SQL Server中,您不能在同一批中执行删除、创建表和查询。如果Oracle有一个类似MSSQL的批处理分隔符
GO
尝试将其放在中间。通常情况下,您不会在运行时删除或创建表。您的目的是什么?插入到…
不需要立即执行
不,它也不能仅使用drop和create语句
strSQL = @"Insert all into NEW1(a,b) VALUES(1,2) "
+ "INTO NEW1(a,b) VALUES(2, 3) "
+ "INTO NEW1(a,b) VALUES(3, 4) "
+ "INTO NEW2(a,b) VALUES(9, 9) "
+ "INTO NEW2(a,b) VALUES(6, 6) "
+ "SELECT * FROM DUAL";