Лесёнка
Гость
|
|
« : 19-03-2007 07:13 » |
|
Здравствуйте! Тут есть трабла. Меня перевели на новый участок предприятия, где нет сетки. Вот и пришлось мне БД писать на Access , но поскоку я до этого всегда программила SQL Server 2000+ C#, то представьте мое состояние... В принсипе все шло хорошо до того как... Я не столкнулась с проблемой мультипоиска ( поиск по разным параметрам , от 1 до 25). Раньше у меня с энтим проблем не было (stored proc), и я как-то не заботилось скока параметров у меня в запросе. Но теперь... Как организовать мультипоиск, если бд Access ( с которым я как это ни смешно едва на ты)? Вощем помогите моему регрессу кто чем может. А то чувствую себя как полный Заранее спасибо
|
|
|
Записан
|
|
|
|
little
|
|
« Ответ #1 : 22-03-2007 22:20 » |
|
Ну, здесь это не в тему, наверно - к дот нету никакго отношения.
А вообще, в акцесе есть запросы с параметрами, можно их юзать, либо формировать свои строки с Sql-запросами, куда уже вставлены нужные значения. Sql в акцесе, конечно, не чета серверному, но жить можно. Но тут еще можно напороться на ограничение максимальной длины строки запроса, насколько я помню, что-то коло 2000 символов в 2000-м акцесе было.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 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++ »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #3 : 26-07-2009 03:31 » |
|
я бы перенёс код с like во встраиваемую процедуру в базе, но как это сделать в аксесе не понял ( Запрос с параметром там вписываю, а как его вызвать из SQL-запроса с передачей параметров ?
|
|
|
Записан
|
|
|
|
HandKot
Молодой специалист
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!
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #5 : 27-07-2009 06:05 » |
|
HandKot, я полагаю, когда есть конструкция вида 'строка1' LIKE 'строка2' то там без разницы, с какой стороны будет маска... Хотя, это проверю а InStr - это вселило надежду Щас всё дома лежит, попробовать тут не могу
|
|
|
Записан
|
|
|
|
HandKot
Молодой специалист
Offline
|
|
« Ответ #6 : 27-07-2009 06:20 » |
|
в том-то и дело, что сначала указывается строка, в которой искать, а потом маску поиска в твоём случае, если добавить строку со значением wert, то при твоей инструкции она не найдется
|
|
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #7 : 27-07-2009 06:25 » |
|
а , понятно, туплю ) Буду пробовать, спасибо
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #8 : 27-07-2009 15:20 » |
|
с LIKE не желает работать из шарпа ни под каким соусом (вернее, когда там применяю астериск). С InStr работает.
Скорость тут щас неважна, однако интересно, как скажется на скорости замена LIKE на InStr ?
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #9 : 27-07-2009 19:44 » |
|
Алексей1153++, попробуй %
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
HandKot
Молодой специалист
Offline
|
|
« Ответ #10 : 28-07-2009 03:29 » |
|
или создай запрос в базе а потом вызывай его как ХП тогда никаких пролем с диалектом не должно быть
|
|
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #11 : 28-07-2009 03:52 » |
|
% ведёт себя так же.
Насчёт ХП - так я в первую очередь подумал о ней, но не могу понять, как в аксесе передать туда параметры. Какой то синтаксис непонятный, что ли. В интернете не смог тоже найти, как это в аксесе сделать
|
|
« Последнее редактирование: 28-07-2009 03:56 от Алексей1153++ »
|
Записан
|
|
|
|
HandKot
Молодой специалист
Offline
|
|
« Ответ #12 : 28-07-2009 06:24 » |
|
в Access нет ХП, но есть запросы, которые и видны как ХП вот нужная старая тема
|
|
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #13 : 28-07-2009 06:31 » |
|
ну я про запросы и говорю ) А эту тему видел, даже отметился там. Операторы битые. Попробую разобраться
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 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
Молодой специалист
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!
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 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 , попозже поэкспериментирую.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 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
даже получилось, только смущает опять же многоэтажность (
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #18 : 29-07-2009 04:44 » |
|
что то я не пойму, с чем связано, но LIKE заработал после установки студии 2008 на работе. Надо будет дома проверить ещё
|
|
« Последнее редактирование: 29-07-2009 04:46 от Алексей1153++ »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #19 : 30-07-2009 17:46 » |
|
имеется таблица с уникальными номерами, в которых пропущено несколько номеров. Например
t.ID 1, 2, 4, 5, 6, 9, как составить запрос, чтобы найти минимальный неиспользованный номера (тут это дожен получиться 3)
моск поломал, ничего не приходит в голову, кроме как перебор в программе (ну или в процедуре) А хочется один красивый запрос ))
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #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) );
пишу по старой памяти....
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #21 : 30-07-2009 19:24 » |
|
Слав, откуда аж 3 таблицы, я в шоке)) Это не работает поэтому
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #22 : 30-07-2009 19:37 » |
|
Алексей1153++, таблица одна table
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 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++ »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #24 : 05-08-2009 08:29 » |
|
а как программно создать файл базы данных с нуля ? как выполнить CREATE DATABASE, если я не могу указать провайдера и открыть соединение - ведь ещё не с чем соединяться ) Поиск в интернете создал впечатление, что это тщательно скрывается от людей
|
|
« Последнее редактирование: 05-08-2009 09:59 от Алексей1153++ »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 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
|
|
« Ответ #26 : 05-08-2009 11:12 » |
|
Алексей1153++, тихо сам с собою а в перерывах почитывая документацию
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #27 : 05-08-2009 11:39 » |
|
ну а что делать, если мне всё срочно, а подсказывать кроме Димки некому ) А он не появляется чёта.
Про документацию - @!#$%^%^&$%& я такую документацию, всё на форумах приходится по кусочкам вырывать
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #28 : 05-08-2009 19:10 » |
|
симпатичный ресурсик по созданию аксесовских баз
azbukavb.narod.ru/dbdoc/dbdoc1.html
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #29 : 06-08-2009 17:05 » |
|
а чем будет отличаться от такого запроса 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++ »
|
Записан
|
|
|
|
|