2015-12-30 176 views
3

使用DbDataAdapter.Update()時,我曾在Oracle 11g中定義的聲明如下表:遇到「ORA-01745:無效的主機/綁定變量名」與ODP.NET

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")) 

,我使用下面的代碼片段與內容更新表中數據表:

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保留字有關。從link開始,「名稱」,「組」和「號碼」被標記爲保留字。我可以更改我的表列名稱以使代碼正常工作。

但最奇怪的是,代碼並不總是失敗,它只在dataTable僅包含一行時失敗,在其他情況下,它按預期工作。任何人都有這個想法?

回答

4

您不能使用關鍵字作爲參數名稱。 請勿使用組和編號作爲參數名稱