Другое использование для volatile
- обработчики сигналов. Если у вас есть такой код:
quit = 0;
while (!quit)
{
/* very small loop which is completely visible to the compiler */
}
Компилятору разрешено замечать, что тело цикла не касается переменной quit
, и преобразовывать цикл в цикл while (true)
. Даже если переменная quit
установлена в обработчике сигналов для SIGINT
и SIGTERM
; компилятор не может этого знать.
Однако, если переменная quit
объявлена как volatile
, компилятор вынужден загружать ее каждый раз, потому что она может быть изменена в другом месте. Это именно то, что вы хотите в этой ситуации.
Для Jet MDB (и, возможно, в целом для многих OLEDB Поставщики) вы можете использовать такой подход:
Private Sub Main()
Dim cnDB As ADODB.Connection
Set cnDB = New ADODB.Connection
cnDB.Open "Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Jet OLEDB:Engine Type=5;Data Source='sample.mdb'"
'Check presence of table --------------
Dim rsSchema As ADODB.Recordset
Set rsSchema = _
cnDB.OpenSchema(adSchemaColumns, _
Array(Empty, Empty, "t1", Empty))
If rsSchema.BOF And rsSchema.EOF Then
MsgBox "Table does not exist"
Else
MsgBox "Table exists"
End If
rsSchema.Close
Set rsSchema = Nothing
'--------------------------------------
cnDB.Close
End Sub
Если вы просто хотите удалить таблицу не выдавая сообщения об ошибке, вы можете использовать следующий SQL, если используете MySQL.
DROP TABLE t1 IF EXISTS
Другие базы данных имеют аналогичную функцию, но синтаксис отличается. Чтобы сделать то же самое в MSSQL:
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1') DROP TABLE t1;
Хотя это выглядит очень некрасиво ... должен быть лучший синтаксис, чтобы получить тот же результат.
Лучше проверять наличие соответствующей таблицы, чем пытаться отбросить ее.
Синтаксис SQL зависит от сервера базы данных / engine, который вы используете, но для Sql Server вы можете использовать что-то вроде:
Sql Server 2000:
SELECT 1 as Exists FROM sysobjects WHERE name = 't1'
Sql Server 2005/2008:
SELECT 1 as Exists FROM sys.objects WHERE name = 't1'
Затем вы можете использовать VB, например:
Dim rs as Recordset
Dim iExists as Integer
rs = cmd.Execute
On Error Goto DoesNotExist
rs.MoveFirst
iExists = CInt(rs!Exists)
DoesNotExist:
If iExists = 1 Then
' Put code here for if the table exists
Else
' Put code here for if the table does not exist
End If
Примечание: этот код нуждается в приведении в порядок и "продакшене" =) (т.е. я на самом деле не проверял, что это работает, поскольку у меня нет VB6 на этой машине)