Jump to content

База Банных(БД)


Recommended Posts

Запросы

 

Добавление записи в таблицу

Задача:

Добавить в таблицу ("TableName") одну запись и задать текстовому полю ("TextFieldName") этой таблицы значение = "Любой Текст", причем, таблица содержит уникальный индекс по числовому полю ("RecordID") которое не является счетчиком.

Примечание:

Если вы используете имена полей с пробелами (что не рекомендуется) то имена полей в запросе должны обрамляться квадратными скобками - [Имя Поля]

Dim lngID As Long

Dim var As Variant

Dim strSQL As String

'Определяем максимально имеющиеся значение индекса

var = DMax("RecordID", "TableName")

If IsNull(var) Then var = 0 'на случай если запись первая

'Получаем следующие значение индексного поля

lngID = var + 1

'Добавляем запись

strSQL = "INSERT INTO TableName (RecordID, TextFieldName) " & _

"VALUES (" & lngID & ",'Любой Текст')"

CurrentDb.Execute strSQL

 

Обновление

Примечание:

Если вы используете имена полей с пробелами (что не рекомендуется) то имена полей в запросе должны обрамляться квадратными скобками - [Имя Поля]

Private Sub ЗапросРАЗ()

'изменяет начальные значения полей:

' TextFieldName (Текстовое) и

' CurrFieldName (Денежное)

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

'значение ключевого поля [RecordID] - больше двух (RecordID > 2)

Dim strSQL As String

Dim strNewValue As String

Dim curNewSum As Currency

'Задаем значения переменных

strNewValue = "Новое Значение"

curNewSum = 1234.32

'Строим запрос

strSQL = "UPDATE TableName SET " & _

"TextFieldName = '" & strNewValue & "', " & _

"CurrFieldName = '" & curNewSum & "' " & _

"WHERE RecordID > 2"

'Выполняем запрос

CurrentDb.Execute strSQL

End Sub

 

'=================================================================

 

Private Sub ЗапросДВА()

'Возвращает начальные значения в таблицу

Dim strSQL As String

strSQL = "UPDATE TableName SET " & _

"TextFieldName='Начальное значение', " & _

"CurrFieldName = 0.00"

'Выполнение запроса

CurrentDb.Execute strSQL

End Sub

 

 

Удаление Записей по условию значения поля

Примечание:

Если вы используете имена полей с пробелами (что не рекомендуется) то имена полей в запросе должны обрамляться квадратными скобками - [Имя Поля]

Dim strSQL As String

Dim Msg As String, Style As Integer, Title As String, Response As Integer

'Строим запрос подтверждения от пользователя

Msg = "Внимание!" & vbCrLf & _

"Все записи из таблицы [TableName] с индексом больше ДВУХ будут удалены" & vbCrLf & _

"Действительно удалить?"

Style = vbYesNo + vbExclamation + vbDefaultButton2

Title = "Вопрос"

'Получаем ответ

Response = MsgBox(Msg, Style, Title)

'Если пользователь ответил "ДА!"

If Response = vbYes Then

strSQL = "DELETE FROM TableName WHERE RecordID > 2"

CurrentDb.Execute strSQL

End If

 

Запуск Запроса (на изменение записей)

DoCmd.SetWarnings False

DoCmd.OpenQuery "MyQueryName", acNormal, acEdit

'или так

CurrentDb.QueryDefs("MyQueryName").Execute

 

Изменение свойств всех запросов приложения (UseTransaction)

Вместо пояснений, цитата из справочной системы:

Задав для свойства Использовать транзакцию (UseTransaction) значение Нет, можно значительно повысить быстродействие при определенных обстоятельствах. В этом случае пользователь никогда не столкнется с проблемами, связанными со слишком большим количеством запросов на блокировку записей. Кроме того, ядро базы данных Jet не сохраняет результаты запроса во временной базе данных, что тоже повышает быстродействие.

Если существует большое количество записей, которые должны быть записаны во временную базу данных, то выполнение запроса на изменение как отдельной транзакции может снизить быстродействие. Кроме того, при выполнении запроса на удаление или обновление в общей базе данных, возникает большое количество запросов на блокировку записей. Это может снизить быстродействие в некоторых сетевых операционных системах, например, в NetWare выполнение запроса будет прервано, если количество запросов на блокировку записей превысит 10000.

Если завершение транзакции невозможно, появляется сообщение об ошибке и пользователь может сохранить или нет внесенные изменения.

Private Sub ChangeQueriesPrp()

'es 17.01.04

'Изменение свойств сразу всех запросов приложения

Dim dbs As Database, qdf As QueryDef

On Error GoTo ChangeQueriesPrpErr

Set dbs = CurrentDb

For Each qdf In dbs.QueryDefs

'если запрос не на выборку то меняем его свойства

If qdf.Type <> dbQSelect Then

'Debug.Print qdf.Name

qdf.Properties("UseTransaction") = False

End If

Next qdf

Exit Sub

ChangeQueriesPrpErr:

MsgBox "Процедура [ChangeQueriesPrp] привела к ошибке:" & vbCrLf & _

Err.Description & vbCrLf & " Err#" & Err.Number, vbCritical

End Sub

 

Как написать условие WHERE по полю типа "Date/Time"

Андрей Митин

http://am.rusimport.ru/MsAccess/topic.asp?id=134

 

Часто возникают вопросы типа "Почему у меня не работает выражение "select * from [Tbl] where [Date]=#" & me.Дата & "#" (или что то в этом роде).

Чтобы корректно поставить условие по полю типа Date/Time необходимо всего лишь корректно отформатить значение - для Access формат даты должен быть следующим: #mm/dd/yy#. Для SQL-Server это выглядит чуть по-другому: yyyy-mm-dd (такой формат понимается при любых локальных настройках сервера).

Для облегчения можно применять приведенную ниже функцию, например так: "select * from [Tbl] where [Date]=" & FormatSpDate(me.Дата)

Public Function FormatSpDate(ByVal parDate As Date, Optional bSQL As Boolean = False) As String

If bSQL Then

FormatSpDate = Format$(parDate, "'mm\.dd\.yyyy'")

'или можно так

'FormatSpDate = Format$(parDate, "'yyyy\-mm\-dd'")

Else

FormatSpDate = Format$(parDate, "\#mm\/dd\/yy\#")

End If

End Function

 

Модуль преобразования величин для подстановки в SQL-запрос

Максименко Юрий [email protected]

http://db-maker.narod.ru/

 

Предлагаю Вашему вниманию Модуль преобразования величин для подстановки в SQL-запрос с моего сайта. Для тех, кто хотел бы разобраться и, возможно, внести усовершенствования, сделаю парочку пояснений.

 

Назначение функции sqlReplace()

Существует набор символов, имеющих специаьное значение в SQL, но которые могут оказаться и в Ваших текстовых данных. Самый заметный среди таких «проблемных» символов — апостроф. То есть если Вы, например, хотите ввести в выражение запроса название McDonald's, то, чтоб не получить ошибку, должны обработать вхождение апострофа. Так, для MS Access Вы должны будете заменить один апостроф двумя, а для MySQL поставить перед апострофом обратный слэш.

НО если Вы просто примените для этого функцию Replace(), то совершите ошибку, которая Вам аукнется, например, когда Вы попытаетесь программно сохранить выражение запроса в поле таблицы. Надеюсь, Вам понятно, что в случае Replace() Вы получите McDonald''s.

Функция sqlReplace() осуществляет замену корректно, без повторного «квочения» строки.

 

Поддержка нескольких СУБД

В число параметров функций ToSQL() и dateToSQL() входит параметр platform. Он-то и позволяет Вам перейти на другую СУБД, не переписывая те участки, в которых происходит собирание запросов. Пишете новый case в ToSQL() и dateToSQL(), заменяете принятый по уочанию Access на новую платформу — и все запросы теперь собираются в синтаксисе новой платформы

Option Compare Database

Option Explicit

'=======================================================

'Для подстановки даты и времени строкой в запрос SQL.

'platform - СУБД, для которой составляется выражение

 

Function dateToSQL(ByVal Date_ As Date, Optional ByVal platform As String) As String

If platform = "" Then platform = "Access"

Select Case platform

Case "Access"

dateToSQL = "#" & Trim(str(Month(Date_))) & "/" & Trim(str(Day(Date_))) & "/" & Trim(str(Year(Date_)))

dateToSQL = dateToSQL & " " & Trim(str(Hour(Date_))) & ":" & Trim(str(Minute(Date_))) & ":" & Trim(str(Second(Date_)))

dateToSQL = dateToSQL & "#"

Case "MySQL"

dateToSQL = "'" & Year(Date_) & "-" & Month(Date_) & "-" & Day(Date_) & " " & Hour(Date_) & ":" & Minute(Date_) & ":" & Second(Date_) & "'"

Case Else

End Select

End Function

 

'=======================================================

'Заменяет в строке strToSQL спецсимвол specChar на replace - для вставки текстовой константы в запрос SQL

'Отличается от обычной замены тем, что не заменяет спецсимвол specChar, если он уже ранее заменялся на replace

'Примеры:

'sqlReplace("McDonald's")="McDonald''s"

'sqlReplace("McDonald''s")="McDonald''s" !!! заметьте - не "McDonald''''s" !!!

'sqlReplace("McDonald's","'","\'")="McDonald\'s" !!! заметьте - не McDonald''''s

 

Function sqlReplace(ByVal strToSQL As String, Optional ByVal specChar As String, Optional ByVal replace As String) As String

Dim Pos, r, s As Integer

 

If specChar = "" Then specChar = "'"

If replace = "" Then replace = "''"

strToSQL = " " & strToSQL ' на случай начала строки с specChar

 

s = Len(specChar)

r = Len(replace): Pos = 2

Do While Len(strToSQL) >= Pos

If (Mid(strToSQL, Pos, s) = specChar) And (Mid(strToSQL, Pos, 2) <> replace) And (Mid(strToSQL, Pos - 1, 2) <> replace) Then

 

strToSQL = Left(strToSQL, Pos - 1) & replace & Mid(strToSQL, Pos + 1)

Pos = Pos + r

Else

Pos = Pos + 1

End If

 

 

Loop

 

sqlReplace = Mid(strToSQL, 2) 'Убираем пробелы, которые подставили в начале

End Function

 

'=======================================================

'Преобразование величины для подстановки в запрос SQL

 

Public Function ToSQL(ByVal Value, Optional platform As String) As String

 

If IsNull(Value) Then Value = ""

 

If platform = "" Then platform = "Access"

Select Case platform

Case "Access"

 

Select Case VarType(Value)

 

Case vbDate

ToSQL = dateToSQL(Value)

Case vbString

ToSQL = "'" & sqlReplace(Value) & "'"

Case vbInteger, vbLong, vbSingle, vbDouble, vbCurrency

ToSQL = Trim(str(Value))

Case vbBoolean

ToSQL = IIf(Value, "-1", "0")

End Select

Case Else

 

End Select

End Function

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...