Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > ХП не добавляет запись


Автор: Unsane 5.3.2008, 19:39
Вызываю хп из программы, id возвращаетсы верный, а вот запись не добавляется, хотя если вызывать вручную из query analiser, то запись добавляется..
Код

            int id = -1;
            using (SqlConnection con = new SqlConnection(connectionString))
            {

                using (SqlCommand cmd = new SqlCommand("AddPeople", con))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@firstName", newPeople.FirstName);
                    cmd.Parameters.AddWithValue("@middleName", newPeople.MiddleName);
                    cmd.Parameters.AddWithValue("@lastName", newPeople.LastName);
                    cmd.Parameters.Add(new SqlParameter("@id", SqlDbType.Int));
                    cmd.Parameters["@id"].Direction = ParameterDirection.Output;
                    con.Open();
                    cmd.ExecuteNonQuery();
                    id = Convert.ToInt32(cmd.Parameters["@id"].Value);
                }
            }
            return id;


Код

ALTER PROCEDURE dbo.AddPeople(
    @firstName nchar(20),
    @middleName nchar(20),
    @lastName nchar(20),
    @id int OUTPUT
    )
AS
BEGIN
    INSERT INTO people
    (
        firstName, 
        middleName, 
        lastName
            ) 
    VALUES (
        @firstName,
        @middleName,
        @lastName
            )
    SET @id = Scope_Identity()
    RETURN @id
END

Автор: thomas 5.3.2008, 21:30
Unsane, 
На первый взгляд в коде C# все верно, тут ошибок точно нет.
А вот код процедуры у меня немного отличается.
dbo и имя хп в квадратных скобках, обьявление параметров без круглых скобок.
И @id не SET a SELECT. И без return.
Код

ALTER PROCEDURE [dbo].[AddPeople]
    @firstName nchar(20),
    @middleName nchar(20),
    @lastName nchar(20),
    @id int OUTPUT
AS
BEGIN
    INSERT INTO people
        (
        firstName, 
        middleName, 
        lastName
        ) 
    VALUES 
        (
        @firstName,
        @middleName,
        @lastName
         )
    SELECT @id = Scope_Identity()
END
 

Да, еще одно, поле id в таблице people должно быть типа int и с автонумерацией.
Но раз у теюя возвращается верный id, значит так оно и есть.

А вообще странно. Ведь id может вернуться только после добавления новой строки в таблицу.


Автор: Unsane 5.3.2008, 21:37
Цитата(thomas @ 5.3.2008,  21:30)
Да, еще одно, поле id в таблице people должно быть типа int и с автонумерацией.
Но раз у теюя возвращается верный id, значит так оно и есть.

А вообще странно. Ведь id может вернуться только после добавления новой строки в таблицу.

В таблице 2 записи(добавлял вручную) с индексами 1 и 2. При запуске из проги возвращает id = 3, но не добавляет запись.

з.ы. id естественно int + identity

Автор: thomas 5.3.2008, 21:42
Unsane, 
Цитата

хотя если вызывать вручную из query analiser,

а ты management studio имеешь?
попробуй там выполнить процедуру.
Хотя на вид она правильно написана.

Не знаю точно, но проверь свойства таблицы, какие права на нее установлены у пользователя. Может там ограничения выставлены.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)