积极答复者
批量插入

问题
-
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: 无效列名,我不知道错哪了,大家给看看,错哪了- 已移动 Sheng Jiang 蒋晟Moderator 2009年8月1日 3:17 System.Data类库使用问题 (发件人:Visual C#)
答案
-
请参考以下内容的解析:
--
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- 已编辑 Junxiang 2009年7月31日 22:14
- 已标记为答案 Allen Chen - MSFTModerator 2009年8月7日 7:25
-
你好,这个错是指你的SQL有问题,列名与数据库中的列名不对应。另外 UpdateCommand 应该添加 where 条件, Update() 应该放到两个循环结束后
知识改变命运,奋斗成就人生!- 已标记为答案 Allen Chen - MSFTModerator 2009年8月7日 7:25
全部回复
-
请参考以下内容的解析:
--
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- 已编辑 Junxiang 2009年7月31日 22:14
- 已标记为答案 Allen Chen - MSFTModerator 2009年8月7日 7:25
-
你好,这个错是指你的SQL有问题,列名与数据库中的列名不对应。另外 UpdateCommand 应该添加 where 条件, Update() 应该放到两个循环结束后
知识改变命运,奋斗成就人生!- 已标记为答案 Allen Chen - MSFTModerator 2009年8月7日 7:25