为什么在DbDataAdapter.Update调用时我使用ODP.NETOracleDataAdapter而不是System.Data.OracleClient的适配器得到OracleTruncateException?我做了以下操作:protectedintCreateComponent(DbConnectioncnctn,stringtableName){intnewId;DbCommandselectCmd=_provFactory.CreateCommand();selectCmd.Connection=cnctn;selectCmd.CommandText=string.Format("SELECT*FROM{0}WHEREID=(SELECTMAX(ID)FROM{0})",tableName);DbDataAdapterdataAdapter=_provFactory.CreateDataAdapter();dataAdapter.SelectCommand=selectCmd;...//使用数据适配器的构建器创建插入/更新/删除命令...dataAdapter.Fill(_dataSet,tableName);newId=Convert.ToInt32(_dataSet.Tables[tableName].Rows[0]["id"])+1000000;DataRownewRow=_dataSet.Tables[表名].NewRow();newRow.ItemArray=_dataSet.Tables[表名].Rows[0].ItemArray;newRow["ID"]=新ID;_dataSet.Tables[tableName].Rows.Add(newRow);这适用于OleDb和System.Data.OracleClient但是,使用Oracle.DataAccess.Client的提供程序,我得到:Oracle.DataAccess.Types.OracleTruncateException(16550)文本截断结果来自:在System.Data.Common.DbDataAdapterSystem.Data.Common.DbDataAdapter中的.UpdatedRowStatusErrorsSystem.Data.Common.DbDataAdapter中的UpdatedRowStatusOracle.DataAccess.Client.OracleDataAdapter中的更新.Update我得到的表是大表,其他包含61个字段。所有字段的类型限制为:VARCHAR2(不同长度)VARCHAR2(不同长度)NOTNULLFLOAT(126)NOTNULLNUMBERNOTNULLDATE编辑以防止评论过多:-我无法更改数据类型或数据库中的任何内容.-在DataRow中,这些FLOAT(126)列的数据类型为System.Decimal(就像使用其他提供程序时一样)-不像我之前所说:ID不是主键。这是唯一的指标。表没有主键(由Oracle定义)我不得不承认我认为唯一索引就是主键,这对于熟悉Oracle的人来说可能听起来很荒谬。无论如何,我只插入1行。我还没有尝试手动编译插入命令,我会做一点。命令生成器应处理没有PK的表(http://msdn.microsoft.com/en-us/library/tf579hcz.aspx:“SelectCommand还必须至少返回一个主键或唯一列。”)-这也适用到ODP.NET/Oracle.DataAccess.Client如果:或app.config:任何想法是什么原因以及我将如何使其适用于所有3个提供商?谢谢并致以最诚挚的问候-Marty首先,我认为您应该将此作为错误报告给Oracle。即使表格很小,也可能会出现错误。与索引和主键无关,即使表没有索引也会报错。如果我将ID的值设置为0,插入将正常工作。我设法创建了一个解决方法,虽然它不是一个好方法,但它可能就足够了。解决方法是使用ODP.Net的本机Oracle客户端类,因此您必须检查您的应用程序是否针对ODP或任何其他配置,并相应地选择您的代码。您的任数的“仅ODP”版本可能如下所示:protectedvoidCreateComponentODPOnly(Oracle.DataAccess.Client.OracleConnectioncntn,stringtableName){intnewId;System.Data.DataSet_dataSet=newDataSet();Oracle.DataAccess.Client.OracleCommandselectCmd=newOracle.DataAccess.Client.OracleCommand();selectCmd.Connection=cntn;selectCmd.CommandText=string.Format("SELECT*FROM{0}WHEREID=(SELECTMAX(ID)FROM{0})",tableName);Oracle.DataAccess.Client.OracleDataAdapter数据适配器=newOracle.DataAccess.Client.OracleDataAdapter();Oracle.DataAccess.Client.OracleCommandBuildercmdBuilder=newOracle.DataAccess.Client.OracleCommandBuilder();dataAdapter.SelectCommand=selectCmd;cmdBuilder.DataAdapter=数据适配器;dataAdapter.Fill(_dataSet,tableName);newId=Convert.ToInt32(_dataSet.Tables[tableName].Rows[0]["id"])+1000000;DataRownewRow=_dataSet.Tables[tableName].NewRow();newRow.ItemArray=_dataSet.Tables[表名].Rows[0].ItemArray;新行["ID"]=(十进制)newId;_dataSet.Tables[tableName].Rows.Add(newRow);dataAdapter.InsertCommand=cmdBuilder.GetInsertCommand();dataAdapter.Update(_dataSet.Tables[tableName]);}填写表单后,您是否尝试过添加PK?以上是C#学习教程:DbDataAdapter.Update调用时,为什么我使用ODP.NETOracleDataAdapter获取OracleTruncateException,而不是使用System.Data.OracleClient的Adapter?如果分享的内容对你有用,需要了解更多C#学习教程,希望你多多关注——_dataSet.Tables[tableName].PrimaryKey=(newList(){_dataSet.Tables[0].列["ID"]}).ToArray();本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处:
