当前位置:  开发笔记 > 编程语言 > 正文

将DbDataAdapter.Update()与ODP.NET一起使用时遇到“ ORA-01745:无效的主机/绑定变量名称”

如何解决《将DbDataAdapter.Update()与ODP.NET一起使用时遇到“ORA-01745:无效的主机/绑定变量名称”》经验,为你挑选了1个好方法。

我在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仅包含一行时它才会失败,在其他情况下,它会按预期工作。有人对此有想法吗?



1> Troopers..:

您不能使用关键字作为参数名称。不要使用组和数字作为参数名称

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有