有一个控制台应用程序,我有一个sql select语句和一些内部连接。我希望此语句的每个结果都能更新这些表中的某一列与使用C#的新值。如何遍历SQL select语句结果并更新特定表
这里我已经尝试过:
using System;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;
namespace MyProgram
{
class Program
{
private static SqlConnection _connection;
private static SqlTransaction _transaction;
static void Main(string[] args)
{
using (var connection = new SqlConnection())
{
try
{
connection.ConnectionString = ConfigurationManager.ConnectionStrings["myConfig"].ConnectionString;
connection.Open();
_connection = connection;
using (var command = connection.CreateCommand())
{
command.CommandText =
"My Select sql stament with inner joins";
using (var reader = command.ExecuteReader())
{
var indexOfColumn3 = reader.GetOrdinal("IDExtObject");
while (reader.Read())
{
_transaction = _connection.BeginTransaction("UpdateTransaction");
command.Transaction = _transaction;
var extId = reader.GetValue(indexOfColumn3).ToString();
string finalId = "Something new...";
try
{
UpdateIdSqlTransaction(extId, finalId);
_transaction.Commit();
}
catch (Exception)
{
_transaction.Rollback();
}
}
}
}
}
catch (Exception)
{
if (_transaction != null)
_transaction.Rollback();
}
finally
{
if (connection.State == ConnectionState.Open)
{
connection.Close();
}
}
}
Console.ReadLine();
}
private static void UpdateIdSqlTransaction(string objectId, string newId)
{
using (_connection)
{
SqlCommand command = _connection.CreateCommand();
command.Connection = _connection;
var commandText = "The update SQL statement...";
command.CommandText = commandText;
command.Parameters.AddWithValue("@ID", objectId);
command.Parameters.AddWithValue("@newId", newId);
command.ExecuteNonQuery();
}
}
}
}
的问题是,我得到这个异常:
{“新的事物是不允许的,因为有在运行的其他线程会议。“}
什么问题,我该如何实现这一目标?
你可以把这个“command.Transaction = _transaction;” ExecuteReader语句之前? – FakeisMe
为什么你需要在这里进行交易?如果您的更新语句是单个语句,则它失败或通过。您期望处理多少条记录?您可以读取所有的ID然后运行更新循环。你能计算出服务器上的新值吗?在这种情况下,您可以将更新作为单个语句运行。 –
Look @SergeyL我想启动进程,如果有任何记录失败,我希望整个事务回滚。 –