none
批量插入 RRS feed

  • 问题

  • OracleDataBase or = new OracleDataBase();
                or.OracleConnectString("bpos", "sa", "sa");
         
                OleDbConnection conn = new OleDbConnection(or.OracleConnectionString);
               
                string Sql = "Select id from Key_DetailScan order by rowid";
                DataSet ds = new DataSet();
                OleDbDataAdapter Adapter = new OleDbDataAdapter(Sql, conn);
                OleDbCommandBuilder cb = new  OleDbCommandBuilder(Adapter);
                OleDbCommand upCmd = new OleDbCommand("update Key_DetailScan  set ID=@id ", conn);

                upCmd.Parameters.Add("@id", OleDbType.Integer, 8, "ID");

                Adapter.UpdateCommand = upCmd;
                Adapter.Fill(ds);
             
                for (int count =0; count <3483 ;)
                    {

                        for (int i = 0; i <200; i++,count++)
                        {
                            ds.Tables[0].Rows[i].BeginEdit();
                            ds.Tables[0].Rows[i][0] = i;
                         
                            ds.Tables[0].Rows[i].EndEdit();
                        }
                        Adapter.Update(ds.Tables[0]);
                    }
                    ds.Tables[0].Clear();
                    ds.Dispose();
                    Adapter.Dispose();
                    conn.Close();
    现在的问题是在执行命令过程中,发生了一个或多个错误。
    ORA-00904: 无效列名,我不知道错哪了,大家给看看,错哪了
    2009年7月31日 14:53

答案

  • 请参考以下内容的解析:
    --

    OleDbCommand Cmmand = new OleDbCommand();
    Cmmand.CommandText = "UPDATE " + TABLENAME + " SET [number]=@number,"
    +"SaleState=@SaleState,"
    +"SaleTime=@SaleTime,"
    +"MachineCode=@MachineCode,"
    +"LicenceCode=@LicenceCode "
    +"WHERE [number]=@number";
    Cmmand.Parameters.Add("@number", OleDbType.VarChar, 20).Value=info.number;
    Cmmand.Parameters.Add("@SaleState", OleDbType.Boolean).Value = info.SaleState;
    Cmmand.Parameters.Add("@MachineCode", OleDbType.BigInt).Value = info.MachineCode;
    Cmmand.Parameters.Add("@SaleTime", OleDbType.VarChar,20).Value = info.SaleTime.ToString();
    Cmmand.Parameters.Add("@LicenceCode", OleDbType.VarChar, 10).Value = info.LicenceCode;
    return this.DbHelper.ExecuteNonQuery(Cmmand);
    请看上面这段代码,上面的参数并不是顺序对应的,看清楚了没,@SaleTime和@MachineCode出现顺序发生了错位,
    结果,以上这段代码放在任何地方都会抛出个OledbException出来.说“数据类型不正确这类的”,因为@SaleTime是datetime类型,@MachineCode是bigint类型,当然会抛出异常啊
    在OleDbCommand 和OdbcCommand中使用参数
    在OleDbCommand或者OdbcCommand中使用参数时,参数添加到Parameters集合中的顺序必须和存储过程中参数定义的顺序匹配。OLE DB和ODBC的.NET Framework数据供应程序将存储过程的参数视为占位符,按照顺序来给参数赋值。另外,返回参数必须是第一个被加入到Parameters集合中的参数。
    OLE DB和ODBC的.NET Framework数据供应程序不提供使用命名参数来向SQL语句或存储过程传递参数。考试.大提示必须使用问号(?)占位符,就像下面一样:
    SELECT * FROM Customers WHERE CustomerID = ?
    因此,向 Parameters 集合添加 Parameter 对象的顺序必须直接对应于该参数的问号占位符的位置。
    导出参数信息
    参数也可以使用 CommandBuilder 类从存储过程导出。SqlCommandBuilder 和 OleDbCommandBuilder 类都提供了静态方法 DeriveParameters,该静态方法将自动使用存储过程中的参数信息填充 Command 对象的 Parameters 集合。请注意,DeriveParameters 将改写 Command 的任何现有参数信息。
    导出参数信息时需要经历一个到数据源的附加行程,以获取参数信息。如果参数信息在设计时是已知的,则可以通过显式设置参数来提高应用程序的性能。
    http://hi.baidu.com/2009ajun
    2009年7月31日 22:13
  • 你好,这个错是指你的SQL有问题,列名与数据库中的列名不对应。另外 UpdateCommand 应该添加 where 条件, Update() 应该放到两个循环结束后
    知识改变命运,奋斗成就人生!
    2009年8月1日 1:41
    版主

全部回复

  • 请参考以下内容的解析:
    --

    OleDbCommand Cmmand = new OleDbCommand();
    Cmmand.CommandText = "UPDATE " + TABLENAME + " SET [number]=@number,"
    +"SaleState=@SaleState,"
    +"SaleTime=@SaleTime,"
    +"MachineCode=@MachineCode,"
    +"LicenceCode=@LicenceCode "
    +"WHERE [number]=@number";
    Cmmand.Parameters.Add("@number", OleDbType.VarChar, 20).Value=info.number;
    Cmmand.Parameters.Add("@SaleState", OleDbType.Boolean).Value = info.SaleState;
    Cmmand.Parameters.Add("@MachineCode", OleDbType.BigInt).Value = info.MachineCode;
    Cmmand.Parameters.Add("@SaleTime", OleDbType.VarChar,20).Value = info.SaleTime.ToString();
    Cmmand.Parameters.Add("@LicenceCode", OleDbType.VarChar, 10).Value = info.LicenceCode;
    return this.DbHelper.ExecuteNonQuery(Cmmand);
    请看上面这段代码,上面的参数并不是顺序对应的,看清楚了没,@SaleTime和@MachineCode出现顺序发生了错位,
    结果,以上这段代码放在任何地方都会抛出个OledbException出来.说“数据类型不正确这类的”,因为@SaleTime是datetime类型,@MachineCode是bigint类型,当然会抛出异常啊
    在OleDbCommand 和OdbcCommand中使用参数
    在OleDbCommand或者OdbcCommand中使用参数时,参数添加到Parameters集合中的顺序必须和存储过程中参数定义的顺序匹配。OLE DB和ODBC的.NET Framework数据供应程序将存储过程的参数视为占位符,按照顺序来给参数赋值。另外,返回参数必须是第一个被加入到Parameters集合中的参数。
    OLE DB和ODBC的.NET Framework数据供应程序不提供使用命名参数来向SQL语句或存储过程传递参数。考试.大提示必须使用问号(?)占位符,就像下面一样:
    SELECT * FROM Customers WHERE CustomerID = ?
    因此,向 Parameters 集合添加 Parameter 对象的顺序必须直接对应于该参数的问号占位符的位置。
    导出参数信息
    参数也可以使用 CommandBuilder 类从存储过程导出。SqlCommandBuilder 和 OleDbCommandBuilder 类都提供了静态方法 DeriveParameters,该静态方法将自动使用存储过程中的参数信息填充 Command 对象的 Parameters 集合。请注意,DeriveParameters 将改写 Command 的任何现有参数信息。
    导出参数信息时需要经历一个到数据源的附加行程,以获取参数信息。如果参数信息在设计时是已知的,则可以通过显式设置参数来提高应用程序的性能。
    http://hi.baidu.com/2009ajun
    2009年7月31日 22:13
  • 你好,这个错是指你的SQL有问题,列名与数据库中的列名不对应。另外 UpdateCommand 应该添加 where 条件, Update() 应该放到两个循环结束后
    知识改变命运,奋斗成就人生!
    2009年8月1日 1:41
    版主