在c#中运行oracle脚本

时间:2015-11-27 17:01:30

标签: c# oracle oracle11g

我有一个脚本,其中包含一些用于创建表的SQL代码。这个脚本包含这样的内容:

CREATE TABLE Customer
(
    CustomerID integer PRIMARY KEY,
    FirstName varchar(32) NOT NULL,
    LastName varchar(32) NOT NULL,
    Street varchar(32),
    Phone varchar(32)
)

CREATE TABLE Supplier   
(
    SupplierID varchar(8) PRIMARY KEY,
    Name varchar(32) NOT NULL,
    Street varchar(32),
    Phone varchar(32)  
)

我使用此代码运行此脚本:

try
{
    var content = File.ReadAllText("c:\\users\\vahid\\desktop\\DBAssignment5\\A3\\SchemaSetUp.sql");
    using (var command = new OracleCommand(content) { Connection = conn })
    {
        command.ExecuteNonQuery();
    }
}

catch (Exception ex)
{
    Console.WriteLine("Something's wrong\n");
    Console.WriteLine(ex.ToString());
}

当脚本包含只创建一个表的代码时,它运行良好,但是当我添加代码来创建多个表时,我遇到了这个异常:

enter image description here

有人可以告诉我出了什么问题,我该怎么做才能解决这个问题?

谢谢

1 个答案:

答案 0 :(得分:1)

如果脚本只包含CREATE TABLE,CREATE VIEW或GRANT命令,则可以使用CREATE SCHEMA命令:

CREATE SCHEMA AUTHORIZATION husqvik
    CREATE TABLE Customer
    (
        CustomerID integer PRIMARY KEY,
        FirstName varchar(32) NOT NULL,
        LastName varchar(32) NOT NULL,
        Street varchar(32),
        Phone varchar(32)
    )

    CREATE TABLE Supplier   
    (
        SupplierID varchar(8) PRIMARY KEY,
        Name varchar(32) NOT NULL,
        Street varchar(32),
        Phone varchar(32)  
    );

这是单原子SQL命令的好处是所有表/视图/授权都是创建的或没有。有趣的是,SQL * Plus无法识别此语句并仅执行第二个CREATE TABLE命令。

否则,您需要将脚本拆分为多个命令或作为匿名块执行:

BEGIN
    EXECUTE IMMEDIATE
        'CREATE TABLE Customer
        (
            CustomerID integer PRIMARY KEY,
            FirstName varchar(32) NOT NULL,
            LastName varchar(32) NOT NULL,
            Street varchar(32),
            Phone varchar(32)
        )';

    EXECUTE IMMEDIATE
        'CREATE TABLE Supplier   
        (       SupplierID varchar(8) PRIMARY KEY,
            Name varchar(32) NOT NULL,
            Street varchar(32),
            Phone varchar(32)  
        )';
END;