Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.04.2011, 19:16   #1
tumanovalex
Пользователь
 
Регистрация: 07.03.2011
Сообщений: 83
Вопрос Как определить ключ добавленной или существующей записи?

В базе данных Access 2 таблицы: 1 таблицы tblDate - ключ dateId, поле dateInfo, 2-я таблица tblData - ключ dataID, связанное с dateId первой таблицы поле dataDateID и поля dataTime, dataF, dataA. На форме есть DateTimePicker и DataGridView. При записи данных я делаю так:
Код:
OleDbCommand command = connection.CreateCommand();
command.CommandText = "SELECT dateInfo FROM tblDate WHERE dateInfo = @datecyr";
command.Parameters.Add("@datecyr", OleDbType.DBDate);
command.Parameters[0].Value = cmbDate.Value;
if (command.ExecuteScalar() == null)
{
  command.CommandText = "INSERT INTO tblDate(dateInfo) VALUES(@datecyr)";
  command.Parameters.Add("@datecyr", OleDbType.DBDate);
  command.Parameters[0].Value = cmbDate.Value;
  command.ExecuteNonQuery();
}
// Вот здесь не знаю, как найти dateID добавленной даты и уже имеющейся в базе для добавления его в таблицу tblData в поле dataDateID.
String str = "INSERT INTO tblData(dataTime, dataF, dataA) ";
String sTime, sFreq, sAmp;
for (int i = 0; i < dataGridView1.RowCount - 1; i++)
{
  sTime = dataGridView1.Rows[i].Cells[0].FormattedValue.ToString();
  sFreq = dataGridView1.Rows[i].Cells[1].FormattedValue.ToString();
  sAmp  = dataGridView1.Rows[i].Cells[2].FormattedValue.ToString();
  command.CommandText = str + "Values(" + "'" + sTime + "'" + ", "
                                             + "'" + sFreq + "'" + ", "
                                             + "'" + sAmp + "'" + ")";
  command.ExecuteNonQuery();
} // for  
dataGridView1.RowCount = 1;
Подскажите, пожалуйста, как определить значение ключа dateID добавленной и уже имеющейся в базе даты.
tumanovalex вне форума Ответить с цитированием
Старый 30.04.2011, 23:34   #2
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
Подскажите, пожалуйста, как определить значение ключа dateID добавленной и уже имеющейся в базе даты.
Код:
OleDbCommand cmdInsert = new OleDbCommand("Insert ...", connection);
OleDbCommand cmdSelectId = new OleDbCommand("Select @@Identity", connection);

cmdInsert.ExecuteNonQuery(); // Добавляем запись.
int id = (int)cmdSelectId.ExecuteScalar(); // Получает id вставленной записи.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 01.05.2011, 09:24   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Daramant
Код:
new OleDbCommand("Select @@Identity", connection);
маленькая ремарка по ходу...
справедливости ради, хочу отметить, что свойство @@Identity применимо только для Microsoft Access 2000 или более поздних версий.
Впрочем, думаю, что подобный антиквариат (версии Access < 2000) уже и не используются...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.05.2011, 11:05   #4
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
справедливости ради, хочу отметить, что свойство @@Identity применимо только для Microsoft Access 2000 или более поздних версий.
Приходится пользоваться тем функционалом, который доступен.
@@Identity есть и в MS SQL Server, но там конечно лучше написать:
Код:
INSERT ...
SELECT SCOPE_IDENTITY();
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 01.05.2011, 21:48   #5
tumanovalex
Пользователь
 
Регистрация: 07.03.2011
Сообщений: 83
По умолчанию

Спасибо за ответы. При добавлении номер добавленной даты получаю. А при наличии даты в базе как получить в моем случае ее id?. В этом случае мне дату дабавлять в базу не надо (она уже есть), а command.ExecuteScalar() возвращает только дату, а не номер. А мне нужно и при наличии в базе даты получить ее id (чтобы связать таблицы).
tumanovalex вне форума Ответить с цитированием
Старый 01.05.2011, 22:28   #6
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
А при наличии даты в базе как получить в моем случае ее id?. В этом случае мне дату дабавлять в базу не надо (она уже есть), а command.ExecuteScalar() возвращает только дату, а не номер. А мне нужно и при наличии в базе даты получить ее id (чтобы связать таблицы).
Тогда сделай select, если запись есть, то используй ее id, иначе - вставляешь новую запись.

Будет:
Код:
"SELECT id FROM tblDate WHERE dateInfo = @datecyr"
object result = command.ExecuteScalar();
// Если записи нет, то вставляем ее:
if (result == null)
{
    // insert ...
    "select @@identity"
    result = command.ExecuteScalar();
}
далее используем result как id.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 02.05.2011, 20:26   #7
tumanovalex
Пользователь
 
Регистрация: 07.03.2011
Сообщений: 83
По умолчанию

У меня не получилось:
Код:
OleDbCommand command = connection.CreateCommand();
command.CommandText = "SELECT id FROM tblDate WHERE dateInfo = @datecyr";
command.Parameters.Add("@datecyr", OleDbType.DBDate);
command.Parameters[0].Value = cmbDate.Value;
Object result = command.ExecuteScalar(); // Ошибка: Отсутствует значение для одного или нескольких требуемых параметров
if (result == null)
{
  command.CommandText = "INSERT INTO tblDate(dateInfo) VALUES(@datecyr)";
  command.Parameters.Add("@datecyr", OleDbType.DBDate);
  command.Parameters[0].Value = cmbDate.Value;
  OleDbCommand cmdSelectId = new OleDbCommand("Select @@Identity", connection);
  result = command.ExecuteNonQuery();
}
tumanovalex вне форума Ответить с цитированием
Старый 02.05.2011, 20:43   #8
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
У меня не получилось:
Небольшие исправления:
Код:
OleDbCommand command = connection.CreateCommand();
command.CommandText = "SELECT id FROM tblDate WHERE dateInfo = @datecyr";
command.Parameters.Add("@datecyr", OleDbType.DBDate);
command.Parameters[0].Value = cmbDate.Value;
Object result = command.ExecuteScalar(); // Ошибка: Отсутствует значение для одного или нескольких требуемых параметров
if (result == null)
{
  command.CommandText = "INSERT INTO tblDate(dateInfo) VALUES(@datecyr)";
  //command.Parameters.Add("@datecyr", OleDbType.DBDate); - эта строка не нужна, объект command уже содержит этот параметр, он был добавлен в строке 3.
  command.Parameters[0].Value = cmbDate.Value;
  OleDbCommand cmdSelectId = new OleDbCommand("Select @@Identity", connection);
  //result = command.ExecuteNonQuery(); - надо так:
  command.ExecuteNonQuery();
  result = cmdSelectId.ExecuteNonQuery();
}
Код рабочий, уверены, что именно на той строчке исключение?
Под отладчиком посмотрите - точно ли cmbDate.Value содержит требуемое значение (а не null).
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".

Последний раз редактировалось Daramant; 02.05.2011 в 20:46.
Daramant вне форума Ответить с цитированием
Старый 02.05.2011, 21:47   #9
tumanovalex
Пользователь
 
Регистрация: 07.03.2011
Сообщений: 83
По умолчанию

Все равно не получается. Значение даты не пустое, я пробовал записывать в базу до поиска ключа. Прикрепляю проект.
Вложения
Тип файла: zip MyDateID2.zip (22.2 Кб, 14 просмотров)
tumanovalex вне форума Ответить с цитированием
Старый 02.05.2011, 22:40   #10
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
Все равно не получается.
Так, у вас же поле называется не id, а dateID.
Нужно:
Код:
SELECT dateID FROM tblDate WHERE dateInfo = @datecyr";
Код:
// и в коде, не:
result = cmdSelectId.ExecuteNonQuery();
// а:
result = cmdSelectId.ExecuteScalar();
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление записи и редактирование существующей Cyber Общие вопросы C/C++ 3 16.02.2011 16:15
Ключ последней обновленной записи masterdela SQL, базы данных 7 18.12.2010 15:47
Как определить был ли ввод с клавиатуры или нет? invertor Общие вопросы C/C++ 4 02.07.2010 11:51
Как определить время работы процедуры или операции? Roof Общие вопросы Delphi 7 18.01.2009 21:56
Как определить вставлен ли hasp-ключ? И по возможности его идентификатор Д'якон Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 21.11.2008 20:02