【发布时间】:2020-04-30 18:40:24
【问题描述】:
我遇到了一个问题,我在一个 SqlCommand 中创建了一个临时表 #muMapping,然后用另一个 SqlCommand 填充它。第二条命令在cmd.ExecutNonQuery() 上抛出异常,消息如下:
Invalid object name '#muMapping'.
Statement(s) could not be prepared.
两个命令使用相同的SqlConnection,我开始并指定要使用的事务,以便SqlCommand 不会隐式开始并提交事务。
代码:
using (var conn = new SqlConnection(connString))
{
await OpenConnection(conn);
var trans = conn.BeginTransaction();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "CREATE TABLE #muMapping ( mu_id INT NOT NULL PRIMARY KEY, facility NVARCHAR(100) NOT NULL, team NVARCHAR(100) NOT NULL );";
cmd.Transaction = trans;
await cmd.ExecuteNonQueryAsync();
}
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "INSERT INTO #muMapping VALUES (@mu, @facility, @team);";
cmd.Parameters.Add("@mu", SqlDbType.Int);
cmd.Parameters.Add("@facility", SqlDbType.NVarChar, 100);
cmd.Parameters.Add("@team", SqlDbType.NVarChar, 100);
cmd.Transaction = trans;
cmd.Prepare();
foreach (var mu in loadData)
{
try
{
cmd.Parameters[0].Value = mu.Mu;
cmd.Parameters[1].Value = mu.Facility;
cmd.Parameters[2].Value = mu.Team;
await cmd.ExecuteNonQueryAsync(); //Error thrown here
}
catch (Exception e)
{
Console.WriteLine(e.Message);
throw e;
}
}
}
//Other statements
}
据我所知,#muMapping 表应该可以从第二个命令中看到。
【问题讨论】:
-
你有一个 cmd.Transaction = trans 和一个 cmd.Transaction = transaction。这是转录错误还是实际上在您的代码中?
-
@antlersoft 这是一个转录错误,现已修复
-
你想做什么?如果您只是尝试批量加载数据,您可以查看 table valued parameters。
标签: c# sql-server