Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите регрессу (MS Access ADO)  (Прочитано 29300 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Лесёнка
Гость
« : 19-03-2007 07:13 » 

Здравствуйте!
Тут есть трабла. Меня перевели на новый участок предприятия, где нет сетки. Вот и пришлось мне БД писать на Access , но поскоку я до этого всегда программила SQL Server 2000+ C#, то представьте мое состояние... В принсипе все шло хорошо до того как...
Я не столкнулась с проблемой мультипоиска ( поиск по разным параметрам , от 1 до 25). Раньше у меня с энтим проблем не было (stored proc), и я как-то не заботилось скока параметров у меня в запросе. Но теперь... Как организовать мультипоиск, если бд Access ( с которым я как это ни смешно едва на ты)?
Вощем помогите моему регрессу кто чем может. А то чувствую себя как полный Скромно так...

Заранее спасибо
Записан
little
Помогающий

de
Offline Offline
Пол: Мужской

« Ответ #1 : 22-03-2007 22:20 » 

Ну, здесь это не в тему, наверно - к дот нету никакго отношения.

А вообще, в акцесе есть запросы с параметрами, можно их юзать, либо формировать свои строки с Sql-запросами, куда уже вставлены нужные значения.
Sql в акцесе, конечно, не чета серверному, но жить можно. Но тут еще можно напороться на ограничение максимальной длины строки запроса, насколько я помню, что-то коло 2000 символов в 2000-м акцесе было.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 25-07-2009 20:48 » 

вопрос по этой же среде плавания )

VS2005, C# , база mdb

имеется таблица t_clientz
Код:
client_id	name
1 ddd
2 fff
3 ggg
4 wer

в самом аксесе запрос
Код:
Select name from t_clientz where 'wer' like '*'+name+'*';
исправно выдаёт строчку с "wer", а код в шарпе с точно таким же запросом - выдаёт 0 строк

Код:
m_Base=new OleDbConnection();
m_Base.ConnectionString=
"Provider=Microsoft.Jet.OLEDB.4.0;"
+"data source ="+ed_BasePath.Text+";";

...
...

string sql="Select name from t_clientz where 'wer' like '*'+name+'*';";

OleDbDataAdapter DA=new OleDbDataAdapter(sql,m_pBase);
DataSet DST=new DataSet();
DA.Fill(DST,"t_clientz");
grid_clientsList.DataSource=DST.Tables["t_clientz"].DefaultView;

в остальном же код рабочий, например, sql="Select * from t_clientz;" выдаёт все записи и показывает в гриде

где грабля ?

а ещё, вот это работает
Код:
string sql="Select name from t_clientz where 'wer' like name;"

стало быть, "глючит" символ "*" в маске ?
« Последнее редактирование: 28-07-2009 04:02 от Алексей1153++ » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 26-07-2009 03:31 » 

я бы перенёс код с like во встраиваемую процедуру в базе, но как это сделать в аксесе не понял (
Запрос с параметром там вписываю, а как его вызвать из SQL-запроса с передачей параметров ?
Записан

HandKot
Молодой специалист

ru
Offline Offline

« Ответ #4 : 27-07-2009 06:01 » 

Цитата
Select name from t_clientz where 'wer' like '*'+name+'*';

подозреваю, что здесь вообще ошибочно написан запрос и почему Акцесс возвращает строку - одному богу известно
скорее всего надо так
Код:
Select name from t_clientz where name like '*' + 'wer' + '*';

что означает выбрать все записи, в которых в поле name встречается последовательность wer
или же использовать встроенную ф-цию

Код:
SELECT t_clientz.name, t_clientz.name
FROM t_clientz
WHERE  0 <>InStr(1,'wer',name);


только вот не помню, как провайдеры работатют со встроенными ф-циями Акцесса
Записан

I Have Nine Lives You Have One Only
THINK!
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 27-07-2009 06:05 » 

HandKot, я полагаю, когда есть конструкция вида

'строка1' LIKE 'строка2'

то там без разницы, с какой стороны будет маска... Хотя, это проверю

а InStr - это вселило надежду Улыбаюсь

  Щас всё дома лежит, попробовать тут не могу
Записан

HandKot
Молодой специалист

ru
Offline Offline

« Ответ #6 : 27-07-2009 06:20 » 

в том-то и дело, что сначала указывается строка, в которой искать, а потом маску поиска
в твоём случае, если добавить строку со значением wert, то при твоей инструкции она не найдется

Записан

I Have Nine Lives You Have One Only
THINK!
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 27-07-2009 06:25 » 

а , понятно, туплю ) Буду пробовать, спасибо
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 27-07-2009 15:20 » 

с LIKE не желает работать из шарпа ни под каким соусом (вернее, когда там применяю астериск). С InStr работает.

Скорость тут щас неважна, однако интересно, как скажется на скорости замена LIKE на InStr ?
Записан

Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 27-07-2009 19:44 » 

Алексей1153++, попробуй %
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #10 : 28-07-2009 03:29 » 

или создай запрос в базе
а потом вызывай его как ХП
тогда никаких пролем с диалектом не должно быть
Записан

I Have Nine Lives You Have One Only
THINK!
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 28-07-2009 03:52 » 

% ведёт себя так же.

Насчёт ХП - так я в первую очередь подумал о ней, но не могу понять, как в аксесе передать туда параметры. Какой то синтаксис непонятный, что ли. В интернете не смог тоже найти, как это в аксесе сделать
« Последнее редактирование: 28-07-2009 03:56 от Алексей1153++ » Записан

HandKot
Молодой специалист

ru
Offline Offline

« Ответ #12 : 28-07-2009 06:24 » 

в Access нет ХП, но есть запросы, которые и видны как ХП

вот нужная старая тема
Записан

I Have Nine Lives You Have One Only
THINK!
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 28-07-2009 06:31 » 

ну я про запросы и говорю ) А эту тему видел, даже отметился там. Операторы битые. Попробую разобраться
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 28-07-2009 06:51 » 

ну вот и результат (фиговый)

запрос Z1
Код:
PARAMETERS text1 Text ( 255 );
SELECT [client_id], [name]
FROM t_clientz
WHERE name Like '*'+text1+'*';

запрос Z2
Код:
SELECT client_id,name
FROM Z1
WHERE (((Z1.text1))='d');

при запуске (в самом аксесе) Z2 всё равно выскакивает окно ввода (  Я с синтаксисом не могу разобраться
Записан

HandKot
Молодой специалист

ru
Offline Offline

« Ответ #15 : 28-07-2009 10:25 » 

вот код. написан на excel, но подойдет везде
Код:
Public Sub test()
    Dim cn As ADODB.Connection
    Dim cmd As ADODB.Command
    Dim prm As ADODB.Parameter
   
    Dim rs As ADODB.Recordset
       
    'работаем с коннектом
    Set cn = New ADODB.Connection
    cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""путь к базе"";User Id=admin;Password=;"
    cn.Open
   
    'работаем с объектом для выполнения ХП
    Set cmd = New ADODB.Command
    Set cmd.ActiveConnection = cn
    cmd.CommandType = adCmdStoredProc
    cmd.CommandText = "TestSP"              'указать имя запроса
   
    'создаем параметр
    Set prm = cmd.CreateParameter("shablon", adVarChar, adParamInput, 255)  'shablon - имя параматра в запросе
    cmd.Parameters.Append prm
    prm.Value = "%" + "wer" + "%"   'устанавливаем значения параметра
   
    'выполянем запрос
    Set rs = New ADODB.Recordset
    rs.Open cmd                     'получаем результат
       
    'завершаем сеанс
    rs.Close
    Set rs = Nothing
   
    Set cmd = Nothing
   
    cn.Close
    Set cn = Nothing
End Sub

код запроса (TestSP)
Код:
PARAMETERS [shablon] Text ( 255 );
SELECT t_clientz.*
FROM t_clientz
WHERE t_clientz.name Like shablon;
Записан

I Have Nine Lives You Have One Only
THINK!
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 28-07-2009 17:32 » 

нашёл описание проблемы в мсдн
Код:
PSS ID Number: 311159

Article Last Modified on 10/16/2002


--------------------------------------------------------------------------------
The information in this article applies to:


Microsoft OLE DB Provider for Jet 4.0

--------------------------------------------------------------------------------

This article was previously published under Q311159
SYMPTOMS
When you execute a SQL query using the Microsoft Jet OLEDB Provider 4.0 and you apply a LIKE clause to a linked SQL Server table, the LIKE clause is not properly forwarded by the Microsoft Jet query processor to SQL Server. This results in a less efficient overall query, because all of the rows are first retrieved from SQL Server locally by Jet.

Note that after all rows are retrieved locally by Jet, the LIKE clause is applied internally to the final result before sending the result back to the client, so the final result is the same set of rows.
RESOLUTION
To resolve this problem, install Microsoft Jet 4.0 Service Pack 6 (SP6). To download Microsoft Jet 4.0 SP6, see one of the following articles in the Microsoft Knowledge Base:
239114 ACC2000: Updated Version of Microsoft Jet 4.0 Available in Download Center  (ms-help://MS.MSDNQTR.2004JAN.1033/enu_kboledb/oledb/311159.htm)

282010 ACC2002: Updated Version of Microsoft Jet 4.0 Available in Download Center (ms-help://MS.MSDNQTR.2004JAN.1033/enu_kboledb/oledb/311159.htm)

STATUS
Microsoft has confirmed that this is a problem in the Microsoft products that are listed at the beginning of this article. This problem was fixed in Jet 4.0 Service Pack 6 (SP6).
MORE INFORMATION
Steps to Reproduce Behavior
Create a new Microsoft Access database named "C:\DB1.MDB".
Open C:\DB1.MDB in Microsoft Access and create a linked table to the authors table located in the pubs database on your SQL Server server. Keep the default linked table name of dbo_authors.
Run the following query using the Microsoft Jet OLEDB Provider 4.0 against the Access database C:\DB1.MDB.
SELECT * from dbo_authors WHERE state LIKE 'M%'

If you monitor the back-end SQL Server server using the SQL Server Profiler utility, you will see that the following SQL statements are sent to SQL Server, indicating that the Microsoft Jet query optimizer is applying the LIKE criteria after retrieving all of the rows from the authors table. Note that all noncritical SQL statements have been removed, and comments have been added to describe the various SQL statements sent by Microsoft Jet.
-- This is sent first by Jet to fetch all key values. 
-- Note that WHERE state LIKE 'M%' is not applied here.

SELECT au_id, state FROM authors

-- This retrieves a single row using the first key value retrieved by the
-- above SQL statement. Jet will apply the LIKE clause internally
-- before retrieving the first row.

SELECT au_id,au_lname,au_fname,phone,address,city,state,zip,contract 
FROM dbo.authors WHERE au_id = @P1

If you run the identical SQL query using the Microsoft Access ODBC Driver, the LIKE clause is properly forwarded to SQL Server in the first SQL statement, resulting in a much more efficient overall query.


Additional query words: JOLT

Keywords: kbbug kbQFE KB311159
Technology: kbAudDeveloper kbOLEDBProvJet400 kbOLEDBProvSearch kbOLEDBSearch
то есть ж окончательная и бесповоротная Улыбаюсь Осталась надежда на вызов запроса с параметром. Пока оставил InStr , попозже поэкспериментирую.
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #17 : 28-07-2009 18:23 » 

пришёл в голову ещё один жестокий вариант : завести таблицу с одной строкой и одним полем для записи туда значения с маской, а затем в запросе использовать это значение . Попробую щас )

Код:
//таблица для параметра
t_parz_for_QUERY1(id, name_mask)

//задаём параметр
delete from t_parz_for_QUERY1;
insert into t_parz_for_QUERY1(name_mask)values('%"+ed_filter1.Text+"%');

//запрос Z1
SELECT name
FROM t_clientz
WHERE name like
(
  SELECT name_mask
  FROM t_parz_for_QUERY1
  WHERE id=  (  select min(id) from t_parz_for_QUERY1  )
);

//долгожданная выборка ))
Select name from Z1


даже получилось, только смущает опять же многоэтажность (
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #18 : 29-07-2009 04:44 » 

что то я не пойму, с чем связано, но LIKE заработал после установки студии 2008 на работе. Надо будет дома проверить ещё
« Последнее редактирование: 29-07-2009 04:46 от Алексей1153++ » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #19 : 30-07-2009 17:46 » 

имеется таблица с уникальными номерами, в которых пропущено несколько номеров. Например

t.ID
1,
2,
4,
5,
6,
9,
как составить запрос, чтобы найти минимальный неиспользованный номера (тут это дожен получиться 3)

моск поломал, ничего не приходит в голову, кроме как перебор в программе (ну или в процедуре)
А хочется один красивый запрос ))
Записан

Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #20 : 30-07-2009 18:16 » 

а зачем?
Код:
select 
        (a.id+1) first_empty, (b.id-a.id) number_of_empty
       
from
        table a, table b

where
        (b.id > a.id+1) and not exists (
                select 
                        c.id
                from
                        table c
                where
                        (c.id > a.id) and (c.id < b.id)
        );

пишу по старой памяти....
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #21 : 30-07-2009 19:24 » 

Слав, откуда аж 3 таблицы, я в шоке))
Это не работает поэтому
Записан

Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #22 : 30-07-2009 19:37 » 

Алексей1153++, таблица одна table
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #23 : 31-07-2009 03:09 » 

а, всё, въехал
Спасибо ))

только в аксесе вторая строчка будет так

(a.id+1) as first_empty, (b.id-a.id) as number_of_empty
« Последнее редактирование: 05-08-2009 11:44 от Алексей1153++ » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #24 : 05-08-2009 08:29 » 

а как программно создать файл базы данных с нуля ?
как выполнить CREATE DATABASE, если я не могу указать провайдера и открыть соединение - ведь ещё не с чем соединяться Улыбаюсь)

Поиск в интернете создал впечатление, что это тщательно скрывается от людей

« Последнее редактирование: 05-08-2009 09:59 от Алексей1153++ » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #25 : 05-08-2009 09:58 » 

как получить доступ с нужным нам namespace:
в проект добавляем две ссылки на ADO и ADOX:
References->Add Reference->вкладка COM
  добавить:
  Microsoft ADO Ext. 2.7 for DDL and Security
  Microsoft ActiveX Data Objects 2.8 Library

вот такой код работает

Код:
bool CreateNewAccessDB(string path,bool bShowError,IWin32Window owner_canbenull)
{
ADOX.Catalog adoxcat=new ADOX.Catalog();

try
{
if(null!=adoxcat.Create(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";"))
{
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(adoxcat.ActiveConnection);
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(adoxcat);
}
}
catch (Exception ex)
{
if(bShowError)
{
MessageBox.Show(owner_canbenull,"","Ошибка при создании базы данных:\r\n\r\n"
+ex.Message,MessageBoxButtons.OK,MessageBoxIcon.Error);
}
return false;
}

return true;
}
« Последнее редактирование: 05-08-2009 11:43 от Алексей1153++ » Записан

Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #26 : 05-08-2009 11:12 » 

Алексей1153++, тихо сам с собою Улыбаюсь а в перерывах почитывая документацию Улыбаюсь
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #27 : 05-08-2009 11:39 » 

ну а что делать, если мне всё срочно, а подсказывать кроме Димки некому ) А он не появляется чёта.

Про документацию - @!#$%^%^&$%& я такую документацию, всё на форумах приходится по кусочкам вырывать
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #28 : 05-08-2009 19:10 » 

симпатичный ресурсик по созданию аксесовских баз

azbukavb.narod.ru/dbdoc/dbdoc1.html
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #29 : 06-08-2009 17:05 » new

 а чем будет отличаться от такого запроса
Код:
select 
        min(a.id)+1 as first_empty
from
        table a, table b
where
        (b.id > a.id+1) and not exists (
                select  
                        c.id
                from
                        table c
                where
                        (c.id > a.id) and (c.id < b.id)
        )

вот такой запрос
Код:
select 
        min(a.id)+1 as first_empty
from
        table a, table b,table c
where
        (b.id > a.id+1) and not ((c.id > a.id) and (c.id < b.id))
        


?
« Последнее редактирование: 06-08-2009 17:10 от Алексей1153++ » Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines