使用C#,如何向Oracle数据库表添加触发器和索引?

使用C#,如何向Oracle数据库表添加触发器和索引?,c#,database,oracle,indexing,triggers,C#,Database,Oracle,Indexing,Triggers,如何在C#中为Oracle表创建触发器?我正在使用的Oracle版本是11g。我可以用C#运行Oracle命令来创建表。但是我无法创建触发器和添加索引,因为它们需要分号,当我在C#中运行oracle命令时,命令字符串中带有分号,我会得到一个错误 在C#中运行Oracle命令字符串,添加触发器和索引 var createCommand = "CREATE TABLE TESTTABLE (TESTSTRING VARCHAR(20))"; var alterTable = "ALTER TABL

如何在C#中为Oracle表创建触发器?我正在使用的Oracle版本是11g。我可以用C#运行Oracle命令来创建表。但是我无法创建触发器和添加索引,因为它们需要分号,当我在C#中运行oracle命令时,命令字符串中带有分号,我会得到一个错误

在C#中运行Oracle命令字符串,添加触发器和索引

var createCommand = "CREATE TABLE TESTTABLE (TESTSTRING VARCHAR(20))";

var alterTable = "ALTER TABLE TESTTABLE  ADD( CONSTRAINT TESTID PRIMARY KEY(id) );";

var combined = createCommand + alterTable;

    using (var connection = Database.GetConnection())
    {
        using (var command = Database.GetCommand(combined , connection, CommandType.Text))
        {
            try
            {
                command.ExecuteNonQuery();
            }
            catch(Exception ex)
            {

            }
        }
    }
}

数据库中应该会显示一个名为TESTTABLE的表。

我自己到办公室后,决定测试Oracle(我知道)至少可用于SQL Server。不幸的是,ODP.Net实现不允许这样做。因此,您有两种可能性:要么将语句包装在标有
BEGIN
END;
的批中,单个命令前面加上
EXECUTE IMMEDIATE'..your command here..;
,要么重新使用该命令并且,通过更改
命令文本
并重新执行

顺便说一句,您的SQL还有另一个问题;您试图在create表中未包含的列上创建主键

我在下面展示了一个使用这两种技术的示例。请注意,我必须为我的表使用特定的模式(因此额外的“feosi”)。还要注意,在另一个示例中,没有分号:包含分号会导致无效字符异常

var createCommand = "execute immediate 'CREATE TABLE FEOSI.TESTTABLE (ID int, TESTSTRING VARCHAR(20))';";

var alterTable = "execute immediate 'ALTER TABLE FEOSI.TESTTABLE  ADD( CONSTRAINT TESTID PRIMARY KEY(ID) )';";

var combined = "BEGIN " + createCommand + alterTable + "END;";

var altCreateCommand = "CREATE TABLE FEOSI.TESTTABLE2 (ID int, TESTSTRING VARCHAR(20))";
var altAlterTable = "ALTER TABLE FEOSI.TESTTABLE2  ADD( CONSTRAINT TESTID2 PRIMARY KEY(ID) )";

using (OracleConnection oracleConn = new OracleConnection(myOracleConnStr))
{
    oracleConn.Open();
    using (OracleCommand oracleCmd = new OracleCommand(combined, oracleConn))
    {
        //Do everything in one batch
        oracleCmd.CommandType = CommandType.Text;
        oracleCmd.ExecuteNonQuery();

        //alternative re-use Command
        oracleCmd.CommandText = altCreateCommand;
        oracleCmd.ExecuteNonQuery();

        oracleCmd.CommandText = altAlterTable;
        oracleCmd.ExecuteNonQuery();
    }
}

很抱歉,代码中有括号,但我的帖子中没有括号。此外,不幸的是,如果我在createCommand中添加一个;,它将不起作用,并会给我一个错误,即存在无效字符。我认为您的问题是,默认情况下,您使用的是标准
DbConnection
DbCommand
。所有这些都不允许使用“;”多个命令的分隔符,您需要包含一个事务。“;”是特定于数据库的,因此您应该能够通过指定连接和命令类型来解决这个问题(例如将“var connection”替换为“
OracleConnection
connection”)。您需要参考Nuget提供的Oracle.ManagedDataAccess。请注意,我还没有为Oracle测试此功能。谢谢!我明天回来工作时将尝试此功能!这太棒了,希望能解决我的问题!先生,您太棒了。