使用C#,如何向Oracle数据库表添加触发器和索引?
如何在C#中为Oracle表创建触发器?我正在使用的Oracle版本是11g。我可以用C#运行Oracle命令来创建表。但是我无法创建触发器和添加索引,因为它们需要分号,当我在C#中运行oracle命令时,命令字符串中带有分号,我会得到一个错误 在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
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测试此功能。谢谢!我明天回来工作时将尝试此功能!这太棒了,希望能解决我的问题!先生,您太棒了。