我在oracle 11g中定义了一个带有以下语句的表:
CREATE TABLE "TESTUSER"."TestTableOracleWriter" ("name" VARCHAR2(100 BYTE), "group" VARCHAR2(100 BYTE), "number" NUMBER(*,0), "creation" DATE, "sliceidentifier" RAW(100), CONSTRAINT "TESTTABLEORACLEWRITER_PK" PRIMARY KEY ("name"))
我正在使用以下代码片段使用dataTable中的内容更新表:
private void BatchInsert(DbConnection connection, DbTransaction transaction, DataTable dataTable, string tableName) { DbDataAdapter adapter = ProviderFactories.GetFactory("Oracle.DataAccess.Client").CreateDataAdapter(); DbCommand insertCommand = connection.CreateCommand(); DbParameter parameter1 = insertCommand.CreateParameter(); parameter.DbType = DbType.String; parameter.ParameterName = "@name"; parameter.SourceColumn = "name"; insertCommand.Parameters.Add(parameter); DbParameter parameter2 = insertCommand.CreateParameter(); parameter2.DbType = DbType.String; parameter2.ParameterName = "@group"; parameter2.SourceColumn = "group"; insertCommand.Parameters.Add(parameter2); DbParameter parameter3 = insertCommand.CreateParameter(); parameter3.DbType = DbType.Int32; parameter3.ParameterName = "@number"; parameter3.SourceColumn = "number"; insertCommand.Parameters.Add(parameter3); DbParameter parameter4 = insertCommand.CreateParameter(); parameter4.DbType = DbType.DateTime; parameter4.ParameterName = "@creation"; parameter4.SourceColumn = "creation"; insertCommand.Parameters.Add(parameter4); insertCommand.CommandType = CommandType.Text; insertCommand.CommandText = "INSERT INTO \"TestTableOracleWriter\" (\"name\", \"group\", \"number\", \"creation\") VALUES (:name, :group, :number, :creation)"; insertCommand.Transaction = transaction; insertCommand.UpdatedRowSource = UpdateRowSource.None; adapter.InsertCommand = insertCommand; adapter.UpdateBatchSize = 0; adapter.Update(dataTable); }
但是有时代码会失败,并显示“ ORA-01745:无效的主机/绑定变量名 ”,我在互联网上进行搜索,发现一些资料说它与oracle保留字有关。在链接中,“名称”,“组”和“号码”被标记为保留字。我可以更改表列名称以使代码正常工作。
但是最奇怪的是,代码不会一直失败,只有在dataTable仅包含一行时它才会失败,在其他情况下,它会按预期工作。有人对此有想法吗?
您不能使用关键字作为参数名称。不要使用组和数字作为参数名称