Модераторы: gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужно узнать id записи 
V
    Опции темы
DenWPF
Дата 14.8.2010, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



Вот я добавляю строку и мне нужно узнать её id

как это сделать?
PM MAIL   Вверх
Экскалупатор
Дата 14.8.2010, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 3
Всего: 24



а куда добавляешь?
есть такая штука как @@IDENTITY (Transact-SQL), но она вроде толь в mssql(вроде).
другой вариант мне кажется это сначала вставить строку и сразу же выбрать наибольший id(или найти его по вставленным данным) все это как одну транзакцию оформить.

Это сообщение отредактировал(а) Экскалупатор - 14.8.2010, 20:04
PM MAIL ICQ   Вверх
Gluttton
Дата 14.8.2010, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: нет
Всего: 54



DenWPF, зависит от используемой СУБД.


--------------------
Слава Україні!
PM MAIL   Вверх
DenWPF
Дата 15.8.2010, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



ой я не уточнил. я не использую субд я работаю через C#.

Пока для меня единтсвенный вариант:
1. отправляю запрос на добавление (логин пароль)
2. ищу в таблице этот логин и вытягиваю id


вариант "сначала вставить строку и сразу же выбрать наибольший id" - не подходит, в этот момент кто то другой тоже может добавить строку.
PM MAIL   Вверх
Gluttton
Дата 15.8.2010, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: нет
Всего: 54



Цитата(DenWPF @  15.8.2010,  11:56 Найти цитируемый пост)
я не использую субд

 smile 
Цитата(DenWPF @  15.8.2010,  11:56 Найти цитируемый пост)
я работаю через C#.

С чем? С БД не так ли?
Цитата(DenWPF @  15.8.2010,  11:56 Найти цитируемый пост)
2. ищу в таблице этот логин и вытягиваю id

Вполне себе вариант.

Цитата(DenWPF @  15.8.2010,  11:56 Найти цитируемый пост)
вариант "сначала вставить строку и сразу же выбрать наибольший id" - не подходит, в этот момент кто то другой тоже может добавить строку. 

Экскалупатор это тоже понимает и по этому предлагает
Цитата(Экскалупатор @  14.8.2010,  20:03 Найти цитируемый пост)
все это как одну транзакцию оформить


А вообще самый правильный вариант - воспользоваться средствами СУБД (ну не верю я, что СУБД не используется при работе с БД smile ).

При работе с БД из клиентского приложения используется драйвер БД, который "транслирует" запросы от приложения к СУБД, а СУБД выполняет запрос к БД. Обратно результат возвращается в таком же порядке - БД -> СУБД -> драйвер -> приложение. Тот факт, что наличие драйвера СУБД и самой СУБД не очевиден может свидетельствовать о том, что в качестве СУБД используется MS SQL Server, а если это действительно так, то Экскалупатор дал самый верный ответ
Цитата(Экскалупатор @  14.8.2010,  20:03 Найти цитируемый пост)
 @@IDENTITY (Transact-SQL), 




--------------------
Слава Україні!
PM MAIL   Вверх
jonie
Дата 15.8.2010, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 8
Всего: 118



@@IDENTITY неверный ответ. SCOPE_IDENTITY верный.
Цитата

    * IDENT_CURRENT returns the last identity value generated for a specific table in any session and any scope.
    * @@IDENTITY returns the last identity value generated for any table in the current session, across all scopes.
    * SCOPE_IDENTITY returns the last identity value generated for any table in the current session and the current scope.


Это сообщение отредактировал(а) jonie - 15.8.2010, 12:46


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Gluttton
Дата 15.8.2010, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: нет
Всего: 54



jonie, не знал такого - спасибо за информацию!


--------------------
Слава Україні!
PM MAIL   Вверх
DenWPF
Дата 15.8.2010, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



спасибо.


Код

string query = "insert into users" +
                 "(name.lastname) " +
                 "values ('" + txtName.Text.ToString() + "','" + txtLastName.Text.ToString()+"');SELECT SCOPE_IDENTITY();";


SqlCommand dbcm = new SqlCommand(query, dbconn);
                dbconn.Open();
string insertedID= dbcm .ExecuteScalar();



PM MAIL   Вверх
jonie
Дата 15.8.2010, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 8
Всего: 118



DenWPF, мы вам потом расскажем про sql-injection и функции вроде quotename , ну и про параметры не забудем, наверно.. я уже молчу про то что ToString() будет вызван автоматически..

Это сообщение отредактировал(а) jonie - 15.8.2010, 23:52


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Exai1e
Дата 15.8.2010, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 908
Регистрация: 3.12.2006
Где: Moscow

Репутация: нет
Всего: 30



DenWPF,
jonie правильно говорит,
добавляй значение в таблицу используя параметры, к примеру:

Код

        private const string addUserCommand = "insert into users " +
            "(name, surname, lastname, registration_date, pincode, email, about)" +
            " values " +
            "(:name, :surname, :lastname, :registration_date, :pincode, :email, :about)";

        public void AddUser(User pUser)
        {
            OleDbConnection connection = new OleDbConnection(connectionString);
            try
            {
                connection.Open();
                OleDbTransaction trans = connection.BeginTransaction();
                OleDbCommand cmd = new OleDbCommand(addUserCommand, connection, trans);

                cmd.Parameters.AddWithValue("name", pUser.Name);
                cmd.Parameters.AddWithValue("surname", pUser.Surname);
                cmd.Parameters.AddWithValue("lastname", pUser.Lastname);
                cmd.Parameters.AddWithValue("registration_date", pUser.RegistrationDate);
                cmd.Parameters.AddWithValue("pincode", pUser.PinCode);
                cmd.Parameters.AddWithValue("email", pUser.Email);
                cmd.Parameters.AddWithValue("about", pUser.About);

                cmd.ExecuteNonQuery();
                trans.Commit();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                connection.Close();
            }
        }




--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
DenWPF
Дата 16.8.2010, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



спасибо, а так как то можно?

Код

           string sql = "INSERT INTO Person(surname,name,lastname,bday,phone,selfinfo,photo,login,password,job) VALUES

(:surname,:name,:lastname,:dateFormat,:phone,:selfinfo,:link_photo,:login,:pass,:job);SELECT SCOPE_IDENTITY();";
            int d = 0;
            string str = "";
            try
            {
                using (SqlConnection connection = ConnectToDataBase.GetConnection())
                {
                    SqlCommand command = new SqlCommand(sql, connection);
                    command.Parameters.Add("surname",surname.Text);
                    command.Parameters.Add("name",name.Text);
                    command.Parameters.Add("lastname", lastname.Text);
                    command.Parameters.Add("bday", dateFormat);
                    command.Parameters.Add("phone",phone.Text);
                    command.Parameters.Add("selfinfo",selfinfo.Text);
                    command.Parameters.Add("photo",link_photo.Text);
                    command.Parameters.Add("login",login.Text);
                    command.Parameters.Add("pass",pass.Text);
                    command.Parameters.Add("job",job.Text);

                    connection.Open();
                    str = command.ExecuteScalar().ToString();
                    connection.Close();
                }
            }
            catch (SqlException se)
            {
            } 


ах да, там не : а @ 



а если я использую using мне надо где то конект закрывать ?

Это сообщение отредактировал(а) DenWPF - 16.8.2010, 01:11
PM MAIL   Вверх
Exai1e
Дата 16.8.2010, 02:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 908
Регистрация: 3.12.2006
Где: Moscow

Репутация: нет
Всего: 30



DenWPF, можно, только брать значения напрямую из textbox'ов, не лучший вариант, т.к. значения возможно надо проверить на валидность введенных данных и прочее, сделай класс например отвечающий за действия с User'ами, там метод где будет этот код (в метод например будеш передавать значения из textbox'ов, проверять правильность введенных данных и т.д.) и с ним уже работай
Цитата

а если я использую using мне надо где то конект закрывать ?

нет


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
DenWPF
Дата 16.8.2010, 02:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



ок. я так обычно и делаю, просто это для наглядности. значит таким образом я спасаюсь от sql инъекций?
PM MAIL   Вверх
Exai1e
Дата 16.8.2010, 02:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 908
Регистрация: 3.12.2006
Где: Moscow

Репутация: нет
Всего: 30



DenWPF, по информации из книги "Язык программирования С# 2005 и платформа .NET 2.0" - да, спасаешься smile


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
DenWPF
Дата 16.8.2010, 02:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



а 2010 думаю уже нет=)
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0525 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.