Помогите новичку

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Riter
Обычный пользователь
Обычный пользователь
 
Сообщения: 58
Зарегистрирован: 24.07.2004 (Сб) 17:56

Помогите новичку

Сообщение Riter » 09.08.2004 (Пн) 9:55

У меня есть база я хочу ее редактировать, как это лучше делать через datagrid или запросом.
Если запросом, как его правильно составить? Я например хочу изменить данные в ячейке.
Запрос "UPDATE table1 SET field1 = 2 where field1=4" поменяет все данные в столбце с 4 на 2, а мне нужно только одну ячейку. Можно же указать конкретную ячейку зная № столбца и строки?
И как можно перемещаться tab по datagrid, отлавливая нажатие клавиши, или есть другой способ? Заранее спасибо.

Dzhon
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 236
Зарегистрирован: 09.12.2003 (Вт) 13:30
Откуда: Россия, Омск

Сообщение Dzhon » 09.08.2004 (Пн) 11:35

Если у тебя в таблице имеется ключ (допустим ID_KEY) тогда так:
Код: Выделить всё
UPDATE TABLE1 SET CHTO_OBNOVIT WHERE ID_KEY

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 09.08.2004 (Пн) 11:38

Я поясню чуть подробнее...

Как редактировать - через грид или запросом - это дело вкуса.
Я предпочитаю запросом.

В WHERE пишется условие на редактируемую запись. То есть действие производится со всеми записями в таблице, которые удовлетворяют этому условию. Запись в таблице однозначно идентифицируется своим Primary Key.

Когда ты знаешь номер строки в гриде, ты должен знать Primary Key записи в таблице (часто, это одно поле в таблице). Откуда ты это должен узанть? Ну, когда ты формировал запрос, чтобы отобразить данные в гриде, ты мог вытащить больше колонок, и их пользователю не показывать

Давай на примере покажу.
Вот таблица MyTable - ID, Field1, Field2, Field3. ID - это Primary Key. Для своего грида ты сделал запрос SELECT * FROM MyTable. Теперь ты встал в гриде на какую-то строчку в гриде, ты узнал, что стоишь на записи с ID = 35. Тогда запрос на редактирование будет такой:
Код: Выделить всё
UPDATE MyTable SET Field1 = 2 WHERE ID = 35
- этот запрос изменит все записи с ID =35. Но такая запись только одна, тк ID - это Primary Key.
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Riter
Обычный пользователь
Обычный пользователь
 
Сообщения: 58
Зарегистрирован: 24.07.2004 (Сб) 17:56

Сообщение Riter » 09.08.2004 (Пн) 13:22

Ясненько, спасибочки.

Riter
Обычный пользователь
Обычный пользователь
 
Сообщения: 58
Зарегистрирован: 24.07.2004 (Сб) 17:56

Сообщение Riter » 09.08.2004 (Пн) 15:19

И еще один вопрос. Я создал новую базу в ней таблицу, но при подключении с другого компа я базу вижу, а таблицу нет.

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 09.08.2004 (Пн) 15:55

из VB? Как это выражается - поподробнее и с кодом, пожалуйста
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Riter
Обычный пользователь
Обычный пользователь
 
Сообщения: 58
Зарегистрирован: 24.07.2004 (Сб) 17:56

Сообщение Riter » 09.08.2004 (Пн) 16:29

Adodc1 подключаю констр. к базе. Выбираю таблицу из предложенных, а предлагается только из базы test. Во всех других базах таблицы невидит.

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 09.08.2004 (Пн) 17:11

Riter писал(а):Adodc1 подключаю констр. к базе.

Это как?

В моем понимании, подключение должно выглядеть примерно так:
Use Connection String
Provider = Microsoft Jet OLEDB 4.0
Выбрать базу в сети
Протестить коннекцию на всякий случай

На вкладке Record Source выбрать adCmdTable
Выбрать таблицу

Все делаешь так, но в списке не появляется твоей таблицы?

Еще попробуй прямо в коде подключиться
Dim cnn as New Connection
cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\othercomp\Public\MyDatabase.mdb;Persist Security Info=False"
cnn.Open
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Riter
Обычный пользователь
Обычный пользователь
 
Сообщения: 58
Зарегистрирован: 24.07.2004 (Сб) 17:56

Сообщение Riter » 09.08.2004 (Пн) 17:47

Непонимаю, она пытается найти эту таблицу в test хотя я указал в базе work. :evil: Что я неправильно сделал? Вот код:

Dim adoConnect As ADODB.Connection
Set adoConnect = New ADODB.Connection
Dim strConnect As String
strConnect = "Provider=MSDASQL.1;Persist Security Info=False;Data Source=myodbc3-test;Initial Catalog=work"
adoConnect.Open strConnect, Text1, Text2

Dim txSql As String
Set rs = New ADODB.Recordset
txSql = "select * from table1" ' если выбираю таблицу которая есть в тесте все идет.
rs.CursorLocation = adUseClient
rs.Open txSql, adoConnect, adOpenDynamic, adOpenStatic
Set DataGrid1.DataSource = rs

И еще вопрос что это такое adOpenDynamic, adOpenStatic?

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 09.08.2004 (Пн) 18:04

Хм... А где у тебя база - на SQL Server'e? Или на чем-то экзотическом, что ты используешь ODBC?

по поводу последнего вопроса:
у тебя, кстати, константа неправильно выбрана для четвертого параметра.
Третий параметр означает тип курсора. Чтобы понять, что туда поставить, надо подумать, какие операции тебе нужны с рекордсетом. Если ты сообираешься обновлять данные прямо через рекордсет, то тебе нужен adOpenDynamic или adOpenKeyset. если же просто для того, чтобы отобразить в гриде, то достаточно adOpenStatic.

четвертый параметр говорит о типе блокировки при обновлении данных в рекордсете. Надо знать, будут ли одновременно пользователи что-то делать. Для простого приложения я бы ставила adLockOptimistic - меньше проблем.
Последний раз редактировалось Rainbow 09.08.2004 (Пн) 18:13, всего редактировалось 1 раз.
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Riter
Обычный пользователь
Обычный пользователь
 
Сообщения: 58
Зарегистрирован: 24.07.2004 (Сб) 17:56

Сообщение Riter » 09.08.2004 (Пн) 18:08

База на Mysql. Скачал с их сайта драйвер и его использую.

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 09.08.2004 (Пн) 18:45

И еще один вопрос. Я создал новую базу в ней таблицу, но при подключении с другого компа я базу вижу, а таблицу нет.


Adodc1 подключаю констр. к базе. Выбираю таблицу из предложенных, а предлагается только из базы test. Во всех других базах таблицы невидит.


У меня смутные сомнения, что у тебя нет прав на работу с базой. Проверь точно ли выставлены привилегии для твоего аккаунта.

Например в .NET (нет VB6 под рукой) я использую строку подключения:
Код: Выделить всё
STMT=;OPTION=3;DSN=myodbc3-test;UID=gaidar;DESC=MySQL ODBC 3.51 TEST DSN;DATABASE=dev_prj;SERVER=localhost;PORT=3306;PASSWORD=


И все - я имею все права и делаю что хочу.

Если же я использую другой аккаунт (юзера):
Код: Выделить всё
STMT=;OPTION=3;DSN=myodbc3-test;UID=jeffrey;DESC=MySQL ODBC 3.51 TEST DSN;DATABASE=dev_prj;SERVER=localhost;PORT=3306;PASSWORD=


То не могу добраться до таблиц. Возможно тоже наблюдаешь и ты.

И, еще ко всему, этот драйвер на их сайте страшно глючный.

Для VB6, вероятно,

PROVIDER=MSDASQL;dsn=myodbc3-test;uid=gaidar;pwd=;database=dev_prj;


и т.д. и т.п.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 09.08.2004 (Пн) 19:00

У меня мысль - попробуй поиграться Wizard'ами, типа Data Form Wizard и т.д. из VB'шной IDE. И посмотри, через них видно твои таблицы с твоими данными или нет. А там и думать будем.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

Riter
Обычный пользователь
Обычный пользователь
 
Сообщения: 58
Зарегистрирован: 24.07.2004 (Сб) 17:56

Сообщение Riter » 10.08.2004 (Вт) 9:01

У меня подозрения, что это какой то глюк. Потому, что убираю я вообще имя базы для подключения, а оставляю таблицу, которая есть в базе test и все работает, как такое может быть? А если подключаюсь к другой базе через их клиента все работает, вижу таблицы. Из VB пишет такую ошибку table test.table1 doesn't exist.
Может кто посоветует другой драйвер.

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 10.08.2004 (Вт) 10:23

Дурацкое, может быть, преддложение, но все же...
Напиши вот эту Connection String:
strConnect = "Provider=MSDASQL.1;Persist Security Info=False;Data Source=myodbc3-test;DATABASE=work"

Ты вообще откуда взял Connection String? И вот ты говоришь, что через их клиента все коннектится - а там неоткуда скопировать Connection String? Не пробовал сконфигурировать ADODC? Он может правильную строку сконфигурировать.

А то, что он коннектится к базе test, если ничего не указано, так, вроде, для каждого юзера есть дефолтная база...

какой-то user на MySQL писал(а):After much searching I found the correct connection string to use for people who do not want to rely on a DSN.

strConn = "Provider=MSDASQL; DRIVER={MySQL ODBC 3.51 Driver}; Server=localhost; UID=username; PWD=xxx; database=databasename; Option=16387;"


Извини, что я "гадаю на кофейной гуще", пытаясь понять, что у тебя там происходит... Почему никто, кто работал с MySQL ничего не говорит - не знаю. Вроде, таких тут немало....
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Riter
Обычный пользователь
Обычный пользователь
 
Сообщения: 58
Зарегистрирован: 24.07.2004 (Сб) 17:56

Сообщение Riter » 10.08.2004 (Вт) 10:50

Заработало! :D Спасибо всем за помощь.

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 10.08.2004 (Вт) 10:57

Фуф! :D

Теперь объясняю, в чем было дело. Параметры Connection String почти все (ну, кроме Provider и еще каких-то) зависят от драйвера. Параметр, который ты писал Initial Catalog, правильный для SQL Server. В твоем случае он просто опускался, тк не был известен, соответсвенно коннект происходил к дефолтной базе test.

Если бы ты внимательно посмотрел на те примеры, которые вчера привел Гайдар, то у тебя бы заработало раньше. Он-то правильную Connection String указал. Только параметров там больше.

Если будешь коннектиться к базе на другом сервере, не забудь указать параметр SERVER=myserver. По умолчанию он, понятно, localhost.
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 5

    TopList