СообЧа > База Знаний > Программирование > Visual Basic > Базы данных

Вопрос

В каких единицах задается размер поля в Visual Data Manager? В байтах? А то я установил 100, а туда обычная строка не влазит. А что означает тип поля «Memo»? Когда установил его — все влезло.

Ответ

Размер поля — кол-во байтов в зависимости от типа поля:
date — 8 байт
byte — 1 байт
string — максимальное число символов (но не больше 255)
Memo — длинный текст (до 65535) или комбинация текста и чисел (в принципе двоичное поле). В help-е по DAO в принципе все написано.

tagir

Вопрос

Подскажите ссылочку на какой-нибудь ActiveX grid где есть возможность использовать в ячейках combobox,checkbox.

Ответ

True DBGrid от Component One умеет это делать и многое другое.

Сергей Л.

Поищи VSFlexGrid

Наметкин Андрей

Вопрос

В Delphi есть Qreport. Есть ли что-то подобное в VB?

Ответ

Да, в VB есть замечательный генератор отчетов Data Report. Для того, чтобы его добавить к проекту, нужно щелкнуть по проекту правой клавишей в окне с его структурой и выбрать Добавить -> Data Report. Еще понядобится Data Environment (добавляется также).

DedMorozzz

Вопрос

Есть строка
rs_Doc.Find "dbStr = '" & Trim$(txtStr.Text) & _
"' AND dbInt = " & CStr(Int), _
0, adSearchForward, 1

Которая вызывает ошибку 3001
"Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another."

Если убираю второе условие
(rs_Doc.Find "dbStr = '" & Trim$(txtStr.Text) & "'", adSearchForward, 1), то все работает, то же самое если убираю первое
(rs_Doc.Find "dbInt = " & CStr(Int), 0, adSearchForward, 1), опять все работает, а вместе не хотят.

Ответ

Вот маленькая цитата из умной книжки:

"Самый большой недостаток метода Find: он может искать соответствие только по единственному критерию. Для множества критериев вместо метода Find используется свойство Filter."

Дмитрий Данелия

Вопрос

Как в DataGrid отобразить данные определенных полей из двух таблиц (таблицы имеют связь между собой)?

Ответ

Самый простой вариант — создаешь соответствующий ADO ли DAO Recordset, пишешь SELECT, вроде:

select t1.colA, t2.colB from table1 t1 inner join table2 t2 on t1.colC=t2.colE

Полученный Dataset или Recordset привязывай к DataGrid.

Вопрос

Как в ListBox вставить содержимое базы данных, не набирая его вручную.

Ответ

Зайди в «Вид» (Project) затем выбери «Ссылки» (References), поставь крыж напротив Microsoft DAO 3.51 Object Library. Затем в форме вставь ListBox Скопируй следующий код, обращая внимание на ссылки

Private Sub Form_Load()
Dim wrk As Workspace
Dim db As Database
Dim rs As Recordset
Set wrk = CreateWorkspace("", "admin", "", dbUseJet)
Set db = wrk.OpenDatabase("Имя базы данных, с которой надо взять данные")
Set rs = db.OpenRecordset("Имя таблицы")
rs.MoveFirst
Do While rs.EOF = False
Me.List1.AddItem (rs.Fields("имя поля").Value)
rs.MoveNext
Loop
End Sub

shuric

Вопрос

У меня на форме, MSFlexGrid и кнопки премещения назад, вперед. При их нажатии бегает полосочка и выделяет записи на Гриде.

Как сделать чтобы в Гриде показывалась запись которая не видна, то есть чтобы ее увидить приходиться перемещаться полосок прокрутки, но она выделяется?

Ответ

Используй свойство TopRow.

Viaceslavas Kaleda

Вопрос

Как вести поиск по базе данных отдельного слова?
К примеру, в некоторой строке

"фывывф фыв ыф ыф ыф ввыф QWERTY лыфвд"
 
находится слово 'QWERTY', его и надо найти.

Ответ

Используй оператор LIKE. Например:
У тебя в БД есть поля Name, Fam, Tel и ты точно не знаешь, в каком поле находится искомая фраза "QWERTY". Создаешь критерий:

Crit = "Name like '*QWERTY*' or Fam like '*QWERTY*' or Tel like '*QWERTY*'"

Затем Data.Recordset.FindNext Crit. Все! Это простейший способ, но идея такая.

DedMorozzz

Вопрос

Как вызвать отчет из VB6?
Старого контрола "Crystal Report Control" в девятой версии нет, зато куча новых.
Где можно почитать про Crystal Report 9?

Ответ

Для показа отчета используй контрол CRViewer9…
Кодик примерно такой:

Dim crApplication As New CRAXDDRT.Application
Dim crReport As CRAXDDRT.Report
Dim strReportPath As String
strReportPath = "C:\Development\C1\Resources\Report1.rpt"
Set crReport = crApplication.OpenReport(strReportPath, 1)CRViewer.ReportSource = crReport
CRViewer.ViewReport

Вопрос

Как делается запрос на update field'a?

Ответ

UPDATE Table1 SET Field1='bla', Field2='bla-bla' [WHERE
Field3='bla-bla-bla']

Viaceslavas Kaleda

Вопрос

Версия VB:6.0

На форме имеются элементы Data и ListBox. Data связан с таблицей. Требуется занести данные таблицы в ListBox. (заносятся фамилии пользователей программы).

Может что не правильно делаю, используя эти два элемента в паре. В книгах ответа не нашел.

Ответ

К сожалению ListBox не предназначен для непосредственной работы с элементом Data, даже если ты и выставляешь ему соответствующие свойства DataSource и DataField.

Поэтому, если тебе необходим обязательно ListBox, то его придется заполнить вручную:

Private Sub Form_Initialize()
With Data1.Recordset
   Do Until .EOF
      List1.AddItem .Fields(0).Value
      .MoveNext
   Loop
.MoveFirst
List1.ListIndex = 0
End With
End Sub

Только посмотри какое именно поле тебе нужно отражать, т.к. Recordset содержит на самом деле все поля выбранной таблицы. Но заполнить — это не сложно. Но, очевидно, тебе будет необходимо сделать и синхронизацию перемещения по записям. Т.е., если ты просто заполнишь ListBox и после этого будешь нажимать на стрелки элемента Data — в ListBox-е не будет происходить перемещения, и наоборот — перемещаясь по строкам в ListBox — ты не вызовешь перемещения указателя записей. Это уже дополнительные сложности, хотя тоже, конечно, можно сделать.

Только все это ни к чему — ведь есть специальные элементы управления, предназначенные именно для отображения данных из Баз Данных. Их и используй. Самый простой для элемента Data — это Microsoft Data Bound Grid Control 5.0 (SP3). Задаешь ему свойство Dat aSource-Data1 и все = ты имеешь заполненную полями таблицу, полностью синхронизированную с БД, непосредственно в которой ты можешь и корректировать записи, и добавлять, и удалять.

Из конференции Expert_FAQ

Вопрос

С помощью DAO запускаю запрос на создание таблицы в mdb-бишной базе и все бы ничего, да только база была открыта естественно до выполнения запроса и в коллекции tabledefs новую созданную запросом таблицу не видно (причем свойство «updatable» для mdb-шной базы возвращает «true»).

Есть ли какой — нибудь способ запустить update или refresh или еще что после выполнения запроса?

Ответ

mydatabase.TableDefs.Refresh

Alex Juice

Вопрос

Как конвертировать базу формата Access в SQL?

Ответ

В программе MSAccess это можно сделать:

Сервис — Служебные программы — Мастер преобразования в формат SQL.

Артем Кривокрисенко

Вопрос

'Создаю через ADODB соединение с базой.
Dim cn As New ADODB.Connection
Dim KLSN As New ADODB.Recordset
' далее открываю
cn.Open "Provider=…"
KLSN .Open sqlstr, cn, adOpenDynamic, adLockOptimistic

' и закрываю
KLSN.Close

Если далее опять попадется KLSN.Close — выдает ошибку (та же история с KLSN .Open). Как мне программно определить, открыт Recordset или закрыт?

Ответ

If RS.State>0 Then RS.Close

Viaceslavas Kaleda

Вопрос

После изменения данных в ADO, подключенного к базе данных в Access, и update'a, как определить, произошла ли физическая запись данных на диск? Проблема в том, что если тут же использовать такой же запрос из другого ADO, то приходят старые данные. А обновленные — со значительной задержкой по времени.
Кто-нибудь сталкивался с такой проблемой?

Ответ

В качестве ответа на этот вопрос привожу цитату из книги «Разработка приложений на MS VB6. Учебный курс». Может быть поможет.

Цитата:
Статический и последовательный курсоры предоставляют набор записей в том состоянии, в каком он был на момент его формирования. Для получения обновленных записей текущего набора применяйте метод Resync объекта Recordset. Однако этот метод не возвращает новые записи, соответствующие критериям исходного запроса. Чтобы получить новые записи, придется вызвать метод Requery, а он потребует дополнительных ресурсов, так как запрос будет выполнен заново.

Игорь

Вопрос

Mdb-шная база запаролена нужно открыть командой set:

set db = DbEngine.OpenDataBase("MyDB.mdb")

Ответ

Что-то вроде:

OpenDataBase ("MyDB.mdb", dblangcyrillic & ";pwd=__ПАРОЛЬ__")

[Алексей]

Вопрос

Как отправить готовый отчет из Access или Excel по почте (адрес всегда один и тот же)?

Ответ

Для отправки книги Excel по Email пользуюсь функцией:

Application.Dialogs(xlDialogSendMail).Show ("adress@yahoo.com")

Но при этом адрес получателя должен быть также записан в адресную книгу.

Сергей

Вопрос

Как передать параметры в отчет Cristal Reports, используя crpe32.dll?

Ответ

Вообще-то, я предпочитаю использовать SelectionFormula, мне так больше нравится. Но если говорить о параметрах, то это будет выглядеть приблизительно так:

CR.ParameterFields(0) = "StartDate;DateTime(2001,08,20,0,0,0);TRUE"
CR.ParameterFields(1) = "EndDate;DateTime(2001,08,27,23,59,59);TRUE"

  В данном примере CR — имя контрола Создается семейство параметров, каждому из которых присваивается строковое выражение, состоящее из трех частей: имя параметра, значение и флаг обновления (ставим всегда в TRUE). В примере оба параметра являются датами, поэтому для их формирования применена функция DateTime (это функция кристала, а не бэйсика). В качестве второй части передаваемой строки может быть использовано все, что написано на языке самого кристала.

Sergey Y. Tkachev

Вопрос

Есть БД Access. Из таблицы Tabl необходимо получить внешним модулем на VB5 произвольную запись с некоторым номером, для дальнейшей обработки. Как это сделать?

Ответ

Попробуй открывать Recordset в Visual Basic, а потом воспользоваться свойством AbsolutePosition (речь идет про ADODB.Recordset). Можешь перемещаться на запись с конкретным номером, ну а сам конкретный номер можешь генерировать случайным образом.

Sergey Y. Tkachev

Вопрос

Я подключаюсь к базе данных .mdb, используя ADODB. Одно из полей "word" таблицы "Catalog" содержит данные типа OLE-объект. Там находятся файлы *.doc. Каким образом я смогу получить их содержимое (хотя бы добраться до Object.Words.Item(#).Text)?

Ответ

Посмотри по этому адресу:
http://vbnet.ru/faq/showtopic.asp?id=133

Н. Шувалов

Вопрос

Возникла ситуация: необходимо програмно получить список всех баз в SQL Servere (исп. 2000 и 7). Как это сделать?

Ответ

SELECT *FROM master.dbo.sysdatabases

Vladimir Petrov

Вопрос

Как програмно поменять заголовок (label) в Crystal Report 9?

Ответ

   Описываю ситуацию…
   Имею отчет в Кристале. В секции ReportHeader поставлен один TextObject в котором написано название отчета…
   Задача понятна — изменить программно :)
   Делаю следующее:

Dim repTextObject As CRAXDRT.TextObject
Set repTextObject = crReport.Sections("RH").ReportObjects(1)
repTextObject.SetText "Crystal Report"

Вроде работает…

Вопрос

Как програмно создавать базы данных .DBF формата 3 или 4?

Ответ

Вот как создать DBF-файл. Просто вызовите процедуру CreateDBF и в качестве первого параметра укажите имя файла, а в качестве второго параметра имя, длину и тип полей, например:

CreateDBF("C:\Temp\base.dbf", "NAME-C-20|NUM-N-5|DATE-D|FLAG-L|MEMO-M|"

В этом примере будет создан DBF-файл с полями: NAME, NUM, DATE, FLAG и MEMO. Тип C — string, N — integer, D — date, L — boolean, M — memo. Т.е. формат такой:

ИМЯ_ПОЛЯ-ТИП_ПОЛЯ-ДЛИНА_ПОЛЯ.


Option Explicit

Public Sub CreateDBF(FileName As String, Fields As String)

Dim FileNum As Integer
Dim FieldName As String
Dim FieldPos As Integer
Dim FieldsCount As Integer
Dim Field As String
Dim Sym As String * 1
Dim Pos As Long
Dim i As Integer
Dim B As Byte
Dim S As String
Dim L As Integer

FileNum = FreeFile
Open FileName For Output As FileNum
Close #FileNum
FileNum = FreeFile
Open FileName For Binary As FileNum
L = 0
Do While True
 L = InStr(L + 1, Fields, "|")
 If L = 0 Then Exit Do
 FieldsCount = FieldsCount + 1
Loop
If Right(Fields, 1) <> "|" Then Fields = Fields + "|"
If FieldsCount > 255 Then FieldsCount = 255
S = String((B + 1) * 32, Chr(0))
Put #FileNum, 1, S
FieldPos = 1
L = 0
For i = 1 To FieldsCount
 Pos = i * 32 + 1
 Fields = Mid(Fields, L + 1)
 L = InStr(1, Fields, "|")
 S = Left(Fields, L — 1)
 B = InStr(1, S, "-")
 If B = 0 Then Exit For
 FieldName = Left(S, B — 1)
 Sym = UCase(Mid(S, B + 1, 1))
 Select Case Sym
   Case "C", "N"
     B = InStr(B + 1, S, "-")
     B = Val(Mid(Fields, B + 1))
     If B = 0 Then Exit For
   Case "D"
     B = 8
   Case "L"
     B = 1
   Case "M"
     B = 10
   Case Else
     Exit For
 End Select
 Put #FileNum, Pos, FieldName
 Put #FileNum, Pos + 11, Sym
 Put #FileNum, , FieldPos
 Put #FileNum, Pos + 16, B
 FieldPos = FieldPos + B
Next
If i < FieldsCount + 1 Then
 MsgBox "I?eia?u caaaiey iiey:" + Chr(13) + Chr(13) + _
 " NAME-C-20|" + Chr(13) + _
 " NUM-N-5|" + Chr(13) + _
 " DATE-D|" + Chr(13) + _
 " FLAG-L|" + Chr(13) + _
 " MEMO-M|", _
  vbExclamation, "Ioeaea i?e caaaiee iiey" + Str(i)
 Exit Sub
End If
Put #FileNum, 11, FieldPos
B = 3
Put #FileNum, 1, B
B = Year(Now) Mod 100
Put #FileNum, , B
B = Month(Now)
Put #FileNum, , B
B = Day(Now)
Put #FileNum, , B
L = (FieldsCount + 1) * 32 + 1
Put #FileNum, 9, L
B = 13
Put #FileNum, L, B
Close #FileNum

End Sub

Rutshtein Alex

Вопрос

Как связать поле типа OLE с объектом OLE на форме? Можно ли использовать word и html одновременно?

Ответ

 Размести на форме 2 OLE-объекта(в первом (OLE1) не помещай никакого объекта, а во втором (OLE2) объект MSWord). Пять кнопок (первая (cmdNew) будет создавать БД с полем типа OLE, вторая (command1) — переносить данные из OLE2 в OLE1, третья (command2(0)) — "добавить новою запись", четвертая (command2(1)) — "Сохранить изменения"), пятая (command2(2)) — "Удалить запись") и, для удобства, стандартный объект VB6 — Data (пусть имя остается по умолчанию — "Data1"). Далее не забудь указать в Project->References ссылку на Microsoft DAO 2.5/3.5 Compatibility Library.
 
 Теперь впиши код в форму:

Private Sub cmdNew_Click()
Dim NewDB As Database
Dim NewWs As Workspace
Dim NewTbl As TableDef
Dim F1 As DAO.Field

Set NewWs = DBEngine.Workspaces(0)
Set NewDB = NewWs.CreateDatabase("ПУТЬ_К_БАЗЕ_ДАННЫХ", dbLangGeneral)
Set NewTbl = NewDB.CreateTableDef("QWERTY")
Set F1 = NewTbl.CreateField("ASD", dbLongBinary) 'OLE-объект
   NewTbl.Fields.Append F1
   Set F1 = Nothing 'освобождаем память
   NewDB.TableDefs.Append NewTbl
   NewDB.Close
   NewWs.Close
   Set NewDB = Nothing 'освобождаем память
   Set NewWs = Nothing 'освобождаем память
   Set NewTbl = Nothing 'освобождаем память
   
   Data1.DatabaseName = "ПУТЬ_К_БАЗЕ_ДАННЫХ"
   Data1.Connect = dbLangGeneral
   Data1.RecordSource = "QWERTY"
   Data1.Refresh
   Data1.Recordset.AddNew
' в результате у тебя будет создана БД с таблицей QWERTY и полем _
   с типом данных OLE — ASD

end sub

Private sub command2_click(index as integer)
Select Case Index
Case 0
   Data1.Recordset.AddNew
Case 1
   Data1.UpdateRecord
Data1.Recordset.Bookmark = Data1.Recordset.LastModified
Case 2
   With Data1.Recordset
       .Delete
       .MoveNext
       If .EOF Then .MoveLast
   End With
End Select
end sub

Private Sub Data1_Reposition()
data1.Caption = "Запись № " & Data1.Recordset.AbsolutePosition + 1
End Sub

Ревягин_Алексей

Вопрос

Народ, подскадите, пожалуйста: при открытии формы задается Recordset, зараннее объявленный public, однако в других процедурах его не видно. Как сделать Recordset, который объявлен на уровне модуля и к которому можно обратиться из других процедур?

Ответ

Объявляешь в разделе Declaration формы:

PRIVATE DB as database
PRIVATE RS as Recordset
Private Sub Form_Load ()
    set DB = DbEngine.OpenDataBase ("MyBase.mdb")
    set RS = db.OpenRecordset("SELECT *FROM MyTable",dbopenforwardonly)
End Sub

и все, во всех процедурах данной формы Recordset будет виден.

P.S. не забудь его закрыть при выгрузке формы:

Sub Form_QueryUnload (Cancel As Integer, UnloadMode As Integer)
    rs.close
    set rs = nothing
    db.close
    set db = nothing
end sub

Сергей Л.

Вопрос

У меня есть файлы messages.mdb в каждой папке В каждом таком файле есть таблица Messages, в которой хранятся сами письма. Мне нужно скопировать одну запись из одного файла в другой. Как это сделать? Пытался сделать так:

Dim tMessageID$
tMessageID = lstMessages.SelectedItem.Key

Dim cn2 As ADODB.Connection
Dim rs2 As ADODB.Recordset
Set cn2 = New ADODB.Connection
Set rs2 = New ADODB.Recordset

cn2.ConnectionString = "Driver=Microsoft Access Driver (*.mdb);Password=:UserID=Admin;DBQ=" & App.Path & "\" & SelectedBox & "\trash\messages.mdb"

rs2.ActiveConnection = cn.ConnectionString
rs2.CursorType = adOpenDynamic

sSQL = "SELECT * FROM Messages AS DelMsg WHERE MessageID='" & tMessageID & "'"

'Вот тут ввожу псевдоним, но дольше его не видно
rs.Source = sSQL
rs.Open

sSQL = "INSERT INTO Messages SELECT * FROM DelMsg WHERE MessageID='" & tMessageID & "'"
'Тут его вставляю

rs2.Source = sSQL
rs2.Open
'Здесь выдает, что не найдена входная таблица DelMsg

rs2.Close
rs.Close

Ответ

Вставляем из 'c:\temp\111.mdb' в 'c:\temp\aa.mdb'.

sSQL="INSERT INTO Messages IN 'c:\temp\222.mdb' SELECT * FROM Messages IN 'c:\temp\111.mdb' where MessageID='" & tMessageID & "'"

tagir

Вопрос

У меня есть файлы messages.mdb в каждой папке В каждом таком файле есть таблица Messages, в которой хранятся сами письма. Мне нужно скопировать одну запись из одного файла в другой. Как это сделать?
Пытался сделать так:

Dim tMessageID$
tMessageID = lstMessages.SelectedItem.Key

Dim cn2 As ADODB.Connection
Dim rs2 As ADODB.Recordset
Set cn2 = New ADODB.Connection
Set rs2 = New ADODB.Recordset

cn2.ConnectionString = "Driver=Microsoft Access Driver (*.mdb);Password=:UserID=Admin;DBQ=" & App.Path & "\" & SelectedBox & "\trash\messages.mdb"

rs2.ActiveConnection = cn.ConnectionString
rs2.CursorType = adOpenDynamic

'Вот тут ввожу псевдоним но дольше его не видно
sSQL = "SELECT * FROM Messages AS DelMsg WHERE MessageID='" & tMessageID & "'"
rs.Source = sSQL
rs.Open

'Тут его вставляю.
sSQL = "INSERT INTO Messages SELECT * FROM DelMsg WHERE MessageID='" & tMessageID & "'"

rs2.Source = sSQL
rs2.Open
Здесь выдает, что не найдена входная таблица DelMsg :(

rs2.Close
rs.Close

Ответ

Вставляем из 'c:\temp\111.mdb' в 'c:\temp\aa.mdb'

sSQL="INSERT INTO Messages IN 'c:\temp\222.mdb' SELECT * FROM Messages IN 'c:\temp\111.mdb' where MessageID='" & tMessageID & "'"

tagir

Вопрос

Как считать данные из файлов dbf с помощью ADO?

Ответ

Код помещает данные из таблицы d:\region.dbf в Recordset rs.

Option Explicit
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset

Private Sub Command1_Click()
   Dim strSql As String
   cnn.Open "Driver={Microsoft Visual FoxPro Driver};" & _
     "SourceType=DBF;" & _
   "SourceDB= d:\a;" & _
       "Exclusive=Yes;"
   strSql = "select * from region"
   rs.Open strSql, cnn, adOpenDynamic, adLockBatchOptimistic, adCmdText
End Sub

Alexey_Naichuk

Вопрос

Имеются две таблицы, связанные по коду клиента: таблица1 и таблица2. Нужно удалить все записи по клиентам из таблицы1, которые имеются в таблице2. Каким запросом это сделать?

Ответ

DELETE FROM table1 WHERE clientID IN (SELECT ClientID FROM table2)

Shemyakin, Dmitry

Вопрос

Какого надо выбирать провайдера, чтобы, например к ADO-контролу подключать dbf-файлы. Что-то у меня ни с каким не получается.

Ответ

Все просто. В провайдере указывается путь к каталогу. Даже если установить его как, например:
"C:\blabla\dbf\myfile.dbf" система адо не будет использовать это имя файла для нее все равно будет
C:\blabla\dbf\, то есть для запросов становятся доступны все файлы в этом каталоге. Это как открытие mdb файла. То есть аналогия каталог это база mdb а файлы в каталоге как таблицы в нем.

Запрос пишешь следующим образом

SELECT * FROM myfile.dbf

Вызов будет следующий.

Dim rs as ADODB.Recordset
Dim objDbf as CDbf 'объявим экземпляр класса
Set objDbf = New CDbf 'создадим объект
objDbf.FilePath = "C:\blabla\dbf\" ' установим активный каталог для провайдера адо
Set rs = objDbf.GetData("SELECT * FROM myfile.dbf") ' Получим рекордсет
Set objDbf = Nothing 'уничтожим объект


Igor

Вопрос

Работа с базой данных.

Расклад такой:
Таблица — "А"
Поля — "Дата Продажи"
    "Наименование Товара"
     "Стоимость"

Как должен выглядеть SQL запрос чтобы вывести данные о количестве записей из поля "Наименование Товара", общей суммы из поля "Стоимость" на конкретную дату "Дата Продажи" из таблицы "А". Причем должна быть возможность делать выборку на дату задаваемую пользователем,в отдельном Text.Box. Пример: 17.03.02 было проданно 15 наименований товара на сумму 1500 рублей.

"VB 6.0" ,база данных "ACCESS" , контрол "DATA"

Ответ

"SELECT Count([Наименование товара]) AS ItemsCount, Sum([Стоимость]) AS ItemsTotal FROM [А] WHERE [Дата продажи] = " & Str(CLng(Cdbl(txtDate.Text)))

Только смотри аккуратно. Дата продажи должна быть действительно датой, а не датой со временем. Если у тебя это не соблюдается, то лучше используй BETWEEN в условии WHERE

"SELECT Count([Наименование товара]) AS ItemsCount, Sum([Стоимость]) AS ItemsTotal FROM [А] WHERE [Дата продажи] BETWEEN " & Str(CLng(Cdbl(txtDate.Text))) & " AND " & Str(CLng(Cdbl(txtDate.Text))+1)

Sergey Y. Tkachev

Вопрос

Вопрос такой: имется data control можноли в полное мере использоват SQL запросы (delete, update, create, и т.д.).

Ответ

Data1.database.execute "DELETE FROM MyTable" и т.д…

Сергей Л.

Вопрос

Можно ли работать в VB с БД MySql так же как с Access?
Если да, то что для этого надо?

Ответ

Однозначно можно. Через ODBC.
Для этого понадобится библиотечка MyODBC.
Найти ее можно на www.mysql.com Там есть инструкция по установке и использованию. Все что потребуется — это создать источник и использовать его как и любой другой. Под ADO проблем у меня не возникало. Если тебе хочется иметь какую-то среду для разработки табличек и выполнения запросов, то на том же сайте можно найти GUI для MySQL. Называется она MyControlCenter (вроде бы так). Естественно, это все бесплатно.

Мне больше нравится другая программка:
http://www.anse.de/mysqlfront.
У нее и функций побольше, и удобство повыше.

Sergey Y. Tkachev

Вопрос

Пишу:

dim dbspr As ADODB.Connection

Set dbspr = New Connection
dbspr.CursorLocation = adUseClient
dbspr.Open "PROVIDER=Microsoft.Jet." _
& "OLEDB.4.0;Data Source=..\Exam.mdb;Pwd=000;"

А оно выдает ошибку "Невозможно найти установленный IASM"

Кто знает, как открыть базу без проблем?

Ответ

Нужно указывать логин и файл рабочей группы.

Качанюк Александр

Вопрос

Подскажите как получить список SQL Server-ов в сети.

Ответ

"C:\Program Files\Microsoft SQL Server\80\Tools\DevTools\Samples\sqldmo\vb\CreateDatabase\"

frmSQLServersLogin.frm

Private Sub Form_Load()
   Dim i As Integer
   'Use the SQL DMO Application Object to find the available SQL Servers
   Set oSQLServerDMOApp = New SQLDMO.Application
   'Don't show events
   gShowServerEvents = False
   
   Dim namX As NameList
   Set namX = oSQLServerDMOApp.ListAvailableSQLServers
   For i = 1 To namX.Count
     txtServer.AddItem namX.Item(i)
   Next
   'Show top server
   txtServer.ListIndex = 0
End Sub

Vladimir Petrov

Вопрос

Для того, что бы иметь доступ к базе данных, сотворенной в Microsoft Access 97, минуя объект Data, я использовал вот такой код:

strDBName = App.Path & "\Data\" & "Pr_01.mdb"
strRSTable = "TblStart_Exit"
Psw_Pr=""

Set wsTmp = DBEngine.Workspaces(0)
Set dbTmp = wsTmp.OpenDatabase(strDBName, False, False, "MS Access;pwd=" & Psw_Pr)
Set rsTmp = dbTmp.OpenRecordset(strRSTable, dbOpenDynaset)
With rsTmp
.AddNew
!User = Name_User
!Date_st = Date
!Time_st = Time
.Update
End With



Все это прекрасно работало до того момента, когда я решил базу Pr_01.mdb конвертировать в формат Microsoft Access 2000. И вот теперь при использовании VB 6.0, программа пишет что базу открыть она уже не может, так как формат-то неизвестный какой-то. Как открыть эту базу в формате Microsoft Access 2000?

Ответ

Нужно подключить в Project|References библиотеку DAO 3.6.

Павел Сурменок

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset

With cn
'Если база 2000, то провайдер такой:
.Provider = "Microsoft.Jet.OLEDB.4.0"
'а если база 97, то можно использовать и более старый провайдер:
'.Provider = "Microsoft.Jet.OLEDB.3.51"
'указываем путь к базе
.ConnectionString = "C:\pr_01.mdb"
'открываем
.Open
End With

alexeyaa2002

Вопрос

Открываю базу с помощью DAO:

Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String

Set db = DAO.OpenDatabase(App.Path & "\apiguide.mdb") _
strSQL = "SELECT * FROM Groups WHERE parentID=0;"

Set rs = db.OpenRecordset(strSQL)

rs.MoveFirst


Дальше начинаю считывать записи.
Так вот. Как только я открыл рекордсет, rs.RecordCount равен единице, хотя на самом деле записей около десятка. Что делать?

Ответ

Свойство RecordCount показывает не сколько всего записей у данного рекордсета, а сколько записей было обработанно. При инициализации и возврате рекордсета, объект ДАО не знает, сколько записей ему вернул сервер (точно знает о существовании только одной — самой первой записи, на которую и устанавливает курсор). Свойство MoveLast заставляет ДАО обработать все записи в рекордсете, от чего и свойство RecordCount устанавливается равным числу етих записей.

Что касается АДО, то там это «лечится» установкой свойства

RS.CursorLocation = adUseClient

перед откытием рекордсета.

Viaceslavas Kaleda

А можно выполнить дополнительный запрос:

DIM DB as DataBase
DIM RS as Recordset
Set DB = DBEngine.OpenDatabase("MyBase.mdb")
Set RS = Db.OpenRecordset("SELECT COUNT(*) as RecCount " & _
"FROM MyTable",dbopenforwardonly)

Затем получаешь:
rCount = RS!RecCount

Сергей Л.



Copyright © 2000-2004 Сообщество Чайников
Контактная информация