为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【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