prasannakumarmp Ответов: 2

Executescalar требует, чтобы команда имела транзакцию


в настоящее время я использую asp.net с SQL Server 2014
while executing the below coding

string query = "INSERT INTO [Classes] ([Class],[NoOfSections],[DateCreated]," +
                "[LastModified]) output inserted.Id  VALUES ('" + classname + "' ,'" + noOfSections + "',getdate(),getdate())";
            SqlConnection con = CreateConnection();
            con.Open();
            SqlCommand cmd = new SqlCommand();
            cmd.CommandText = query;
            cmd.Connection = con;
            SqlTransaction trans ;
            using (trans= con.BeginTransaction())
            {
                long classId = Convert.ToInt64(cmd.ExecuteScalar());
                //int? classId = (oclass as int);
                AddNewSections(classId, noOfSections);
                trans.Commit();
            }
            con.Close();

i m getting the below error

ExecuteScalar requires the command to have a transaction when the connection assigned to the command is in a pending local transaction. The Transaction property of the command has not been initialized.


Что я уже пробовал:

помогите мне плз.. я пытаюсь извлечь вставленные записи автоида с помощью транзакций. как я могу этого достичь?

2 Ответов

Рейтинг:
5

OriginalGriff

Во-первых, не делай этого так. Никогда не объединяйте строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.
Во-вторых, вам нужно передать транзакцию команде:

string sql = "INSERT INTO MyTable (uName)  OUTPUT inserted.id VALUES ('abcd')";
using (SqlConnection con = new SqlConnection(strConnect))
    {
    con.Open();
    using (SqlTransaction trans = con.BeginTransaction())
        {
        using (SqlCommand cmd = new SqlCommand(sql, con, trans))
            {
            int x = (int)cmd.ExecuteScalar();
            Console.WriteLine(x);
            trans.Commit();
            }
        }
    }


prasannakumarmp

Спасибо за ваш ответ. Это сработало идеально.

Рейтинг:
20

pparya27

сделайте объект SqlCommand таким, как этот, после инициализации объекта транзакции -

trans= con.BeginTransaction();
cmd = new SqlCommand(query, con, tran);
long classid= Convert.toInt64(cmd.ExecuteNonQuery());
trans.Commit();



ExecuteScalar () используется для запроса ("select"), который возвращает только одно поле.
для вставки/обновления используется ExecuteNonQuery ().


prasannakumarmp

Спасибо за ваш ответ.