Невозможно вставить запись с помощью ExecuteScalar или ExecuteNon-Query

У меня есть база данных с ролью sa.

Когда я выполняю хранимую процедуру, которая вставляет запись в таблицу. Однако, когда я запускаю ту же хранимую процедуру через код ADO.NET, запись не вставляется успешно. Однако я вижу, что хранимая процедура была вызвана и успешно работает до ExecuteQuery.

Пробовал добавить транзакцию и зафиксировать, и все равно не повезло.

using (SqlConnection conn = new SqlConnection(ConnectionString))
{
    conn.Open();

    using (SqlCommand command = conn.CreateCommand())
    {
        command.CommandText = "InsertData";
        command.CommandType = CommandType.StoredProcedure;
        command.Parameters.AddWithValue("@Id", Id);
        command.Parameters.AddWithValue("@name", Name);                       

        command.ExecuteNonQuery();              
    }   
}

Хранимая процедура:

CREATE PROCEDURE [dbo].[InsertData]
    @Id INT,
    @name VARCHAR(50)
AS
    SET NOCOUNT ON;

    INSERT INTO Employee (Id, Name) 
    VALUES (@Id, @name)
GO

var ConnectionString = "Data Source=xxxx;Initial Catalog=xxxx;Persist Security Info=True;User Id=xxxx;Password=xxxxx;MultipleActiveResultSets=True";

person Dev    schedule 25.10.2017    source источник
comment
Покажите нам код. Как процедура сохранения, так и ExecuteQuery()   -  person Juan Carlos Oropeza    schedule 25.10.2017
comment
Вы получаете исключение? Если так, то, что это?   -  person Zohar Peled    schedule 25.10.2017
comment
Психические способности предполагают, что вы находитесь внутри транзакции, которой вы не поделились с нами, и вам нужно зафиксировать эту транзакцию.   -  person Chris Nielsen    schedule 25.10.2017
comment
Никаких исключений.. работает успешно, но записи не вставляются.. :(   -  person Dev    schedule 25.10.2017
comment
@ChrisNielsen никаких транзакций .. Я пытался добавить транзакцию и зафиксировать ее .. Все равно не повезло   -  person Dev    schedule 25.10.2017
comment
Проверьте, а затем еще раз проверьте строку подключения. Почти в каждом подобном вопросе, который я видел, выяснялось, что код работал нормально, просто не вставлялся в базу данных/сервер, который проверялся на наличие записи.   -  person GarethD    schedule 25.10.2017
comment
Код @JuanCarlosOropeza и sproc доступны   -  person Dev    schedule 25.10.2017
comment
Строка подключения @GarethD мне кажется нормальной... проверено несколько раз...   -  person Dev    schedule 25.10.2017
comment
примечание: Можем ли мы прекратить использовать AddWithValue()?   -  person Zohar Peled    schedule 25.10.2017
comment
Когда вы говорите Я вижу, что sproc был вызван — как вы это проверяете? Если вы еще этого не сделали, вы можете запустить трассировку с помощью SQL Server Profiler, чтобы увидеть, какие команды выполняются в базе данных.   -  person GarethD    schedule 25.10.2017
comment
@GarethD Я вижу, что sproc был вызван = с использованием трассировки sql   -  person Dev    schedule 25.10.2017
comment
Поместите блок try catch, но вы сказали, что он не выдает ошибку   -  person paparazzo    schedule 25.10.2017
comment
@Dev в какой базе данных? Обычно, когда у людей возникают такие вопросы, они либо нацеливаются на неправильную базу данных (dev vs test), либо используют базу данных пользовательского экземпляра, которая заменяется каждый раз, когда они перезапускают отладку. Как выглядит строка подключения? Есть ли ключевое слово AttachDbFileName?   -  person Panagiotis Kanavos    schedule 25.10.2017
comment
@Dev разместите строку подключения здесь, не говорите, что все в порядке. Явно что-то не в порядке. Это может быть БД пользовательского экземпляра, это может быть локальная БД, которая перестраивается каким-то сценарием миграции.   -  person Panagiotis Kanavos    schedule 25.10.2017
comment
@PanagiotisKanavos добавил строку подключения   -  person Dev    schedule 25.10.2017
comment
@Paparazzi Я тоже попробовал блок catch ... Не нажимаю блок catch, так как ошибок нет   -  person Dev    schedule 25.10.2017
comment
@ChrisNielsen, ты был прав. Это была область транзакции в коде С# на другом уровне.....   -  person Dev    schedule 25.10.2017


Ответы (2)


Наконец решил, потратив на это день... Я использовал устаревший код. Кто-то очень умный открыл транзакцию с помощью кода C#. и у нас есть эти методы, в которых вы создаете новую строку подключения sql, которая вставляет данные, а затем, поскольку мы не завершили эту транзакцию, она не вставляла запись.

Поэтому лучший способ решить эту проблему — найти слово «транзакция», и вы можете найти что-то вроде:

TransactionOptions options = new TransactionOptions();
options.IsolationLevel = IsolationLevel.ReadCommitted;
transaction = new TransactionScope(TransactionScopeOption.RequiresNew, options);
person Dev    schedule 25.10.2017

Ваш код выглядит нормально, вы можете попробовать сделать это?

using (SqlConnection conn = new SqlConnection(ConnectionString))
    {
        conn.Open();

        using (SqlCommand command = conn.CreateCommand())
        {
            string cmd = string.format("INSERT INTO PaymentDevices (Id, Name) VALUES ({0}, '{1}')",Id,Name);
            command.CommandText = cmd;
            command.CommandType = CommandType.Text;

            command.ExecuteNonQuery();              
        }   
  }

Это поможет вам определить, в чем ваша проблема, если она работает, проблема заключается в самом вашем вызове SP, если она не работает, проблема в вашей строке подключения или транзакция открыта

person Victor Hugo Terceros    schedule 25.10.2017