注册

DmProvider1.1.0.16649 DmCommand执行失败后无法再重复利用

拳枪临 2023/10/12 581 0

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM8
【操作系统】:WIN10
【CPU】:X64
【问题描述】*:

建表语句:

CREATE TABLE "SYSDBA"."TST_TBA666" ( "COL_STR80" VARCHAR(80), "COL_INT32" INT, "ID" VARCHAR(32) NOT NULL, CONSTRAINT "PK_TST_TBA666" NOT CLUSTER PRIMARY KEY("ID")) ;

测试段代码:

static void TestCommandReused(string connStr) { using (var conn = new DmConnection(connStr)) { conn.Open(); { var cmd = conn.CreateCommand(); cmd.Parameters.Clear(); cmd.CommandText = "truncate table TST_TBA666"; cmd.ExecuteNonQuery(); try { //这里执行多次只是为了模拟主键约束导致命令执行失败 for (int i = 0; i < 2; i++) { cmd.Parameters.Clear(); cmd.Parameters.Add(new DmParameter(":ID", "666")); cmd.Parameters.Add(new DmParameter(":COL_STR80", "666")); cmd.Parameters.Add(new DmParameter(":COL_INT32", 666)); cmd.CommandText = "INSERT INTO TST_TBA666(ID,COL_STR80,COL_INT32)values(:ID,:COL_STR80,:COL_INT32)"; var cnt = cmd.ExecuteNonQuery(); Assert.AreEqual(1, cnt); } } catch { //失败后如果重新创建命令是没问题的 //cmd = conn.CreateCommand(); } //这里测试继续使用执行失败的命令: cmd.Parameters.Clear(); cmd.Parameters.Add(new DmParameter(":val", 123)); cmd.CommandText = "UPDATE TST_TBA666 SET COL_INT32 = COL_INT32 + :val WHERE COL_STR80='666'"; //以下语句报异常:System.ArgumentException : Parameter 'ID' not found in the collection. // var cnt1 = cmd.ExecuteNonQuery(); Assert.AreEqual(1, cnt1); } }

单元测试结果:

消息:  System.ArgumentException : Parameter 'ID' not found in the collection. 堆栈跟踪:  DmParameterCollection.do_GetParameter(String parameterName) DmCommand.BindParameters(Int32& rowCount, DmDataReader rd, CommandBehavior behavior) DmCommand.do_ExecuteNonQuery() DmCommand.ExecuteNonQuery() DmProviderTests.TestCommandReused(String connStr) 行 69 DmProviderTests.TestBUG2023101200044() 行 12
回答 0
暂无回答
扫一扫
联系客服