Hello All, Suggestions Feedback Requested: I'm looking for a solution that will not lock a table, yet allow me to retrieve the: field name, field type as integer, field size, and other attributes of each column from a table.
The Issue: When requesting the Table Schema from mySQL I have found an error that prevents me from deleting the table. This error was found while testing an interface DLL to mySQL. The test creates a dummy table, populates it with data, runs various counts and sums, updates data, and deletes the data. An important part of the test is to be able to retrieve the table's schema. I can't explain why without releasing proprietary corporate information, all I can say is that it's needed. What I can tell you is that when I retrieve it with a mixed case table name, it prevents me from deleting the table. The Cause: VB and VBS programmers usually retrieve table schema through the ADODB.Connection objects, by calling OpenSchema. I have found, though, that if OpenSchema is called with a mixed case table name, ie .. JunkA .. this will lock the table and prevent it from being deleted. I have also found that mySQL has the flag, "lower_case_table_names". This flag is set to 1. I have not tested either work around below with this flag set to 0 or any other value at this time. Solutions found so far: I have found two work arounds for this. 1) The first is to force all table names to lower case. 2) The second work around is to use DESCRIBE [table] or SHOW COLUMNS FROM [table]. Option two requires more programming to accommodate the translation from string type names to integer type names, as used in ADOVBS. I am hoping, however, that I have missed something in the mySQL documentation that actually provides what I'm looking for. Again: I'm looking for a solution that will not lock a table, yet allow me to retrieve the: field name, field type as integer, field size, and other attributes of each column from a table. Code samples follow: ENetArch Code samples: =========================================================== EXE - 1 Option Explicit Private cn As Object Private objStore As Object Private Const szODBC = "UID=sa;PWD=sa;DSN=mySQL;" Private szTableName As String Sub Main() Dim x Set cn = CreateObject("adodb.connection") cn.open (szODBC) Set objStore = CreateObject("navisstardet_mysql.store_mysql") Set objStore.Connect = cn szTableName = "atest_A0" x = objStore.CreateTable(szTableName, Nothing) x = objStore.getStructure_SCF(szTableName) x = objStore.DropTable(szTableName) x = objStore.CreateTable(szTableName, Nothing) x = objStore.getStructure_OS(szTableName) x = objStore.DropTable(szTableName) Set objStore.Connect = cn End Sub =========================================================== DLL - Store_mySQL Option Explicit ' Include ADOVBS Private cn As Object ' =========================================== Private Sub Class_Initialize() Set cn = Nothing End Sub ' =========================================== Public Property Set connect(ByVal objCn As Object) Set cn = objCn End Property ' =========================================== Public Function createTable _ (ByVal szTableName As String, _ ByVal objStr As Object) Dim szSQL As String szSQL = _ " CREATE TABLE " & szTableName & _ " ( " & _ " ID INTEGER AUTO_INCREMENT, " & _ " PRIMARY KEY ( ID ) , " & _ " Date_Created DATETIME , " & _ " Closed BIT , " & _ " Date_Closed DATETIME , " & _ " SortBy VARCHAR (40), " & _ " CompanyName VARCHAR (40), " & _ " ContactName VARCHAR (40), " & _ " Street1 VARCHAR (40), " & _ " Street2 VARCHAR (40), " & _ " City VARCHAR (20), " & _ " State VARCHAR (2), " & _ " Zip VARCHAR (10), " & _ " Country VARCHAR (20), " & _ " Tele VARCHAR (12), " & _ " Email VARCHAR (250), " & _ " WebSite VARCHAR (250) " & _ " ) " cn.execute (szSQL) End Function ' =========================================== Public Function dropTable(ByVal szTableName As String) Dim szSQL As String szSQL = _ " DROP TABLE " & szTableName cn.execute (szSQL) End Function ' =========================================== Function getStructure_OS(ByVal szTableName As String) ' Method 1 ' Two methods of retrieving the tables schema are presented here. ' If you choose to use Method 1, make sure that the tables name is ' all lower case. Retrieving a table's schema, where the table name ' is mixed case presently (2002-09-29) causes a mySQL table to ' lock the table, and it's immediate deletion. ' This can be annoying during testing - of install and uninstall processes. ' Work Around 1 is to use LCASE () to change the table case before ' retrieving the schema. ' Work Around 2 is to issue a " DESCRIBE [table] " or ' " SHOW COLUMN FROM [table] " SQL command. ' ================================================= ' Using Work Around 1 szTableName = LCase(szTableName) ' Rem the above line out to see the error! Dim rs As Object Set rs = cn.OpenSchema _ (adSchemaColumns, Array(Empty, Empty, szTableName, Empty)) Dim nFieldSize As Long Debug.Print Dim t As Long For t = 0 To rs.RecordCount - 1 nFieldSize = 0 If (Not IsNull(rs("CHARACTER_MAXIMUM_LENGTH"))) Then _ nFieldSize = rs("CHARACTER_MAXIMUM_LENGTH") Debug.Print rs("COLUMN_NAME"), rs("DATA_TYPE"), nFieldSize rs.MoveNext Next Debug.Print rs.Close End Function ' =========================================== Function getStructure_SCF(ByVal szTableName As String) ' Method 2 ' Two methods of retrieving the tables schema are presented here. ' If you choose method two, you will need to create a procedure that ' converts the text type into an integer type ... ie .. where szType = "INT" ' nType = 3. This is needed if you are matching field types based on ' the Types listed in ADOVBS. ' Work Around 1 is to use LCASE () to change the table case before ' retrieving the schema. ' Work Around 2 is to issue a " DESCRIBE [table] " or ' " SHOW COLUMN FROM [table] " SQL command. ' ================================================= ' Using Work Around 2 Dim szSQL As String szSQL = _ " SHOW COLUMNS " & _ " FROM " & szTableName Dim rs As Object Set rs = cn.execute(szSQL) Dim nFieldSize As Long Dim szType As String Debug.Print Dim p1 As Long Dim p2 As Long Dim nType As Long Dim t As Long While (Not (rs.BOF Or rs.EOF)) nFieldSize = 0 szType = rs("Type") nFieldSize = 0 p1 = InStr(szType, "(") If (p1 > 0) Then p2 = InStr(szType, ")") nFieldSize = Int("0" & Mid(szType, p1 + 1, p2 - p1 - 1)) szType = Left(szType, p1 - 1) End If nType = getType(szType) Debug.Print rs("Field"), nType, nFieldSize rs.MoveNext Wend Debug.Print rs.Close End Function ' =========================================== Function getType(ByVal szType) As Long szType = LCase(szType) Select Case (szType) Case "int": getType = 3 Case "varchar": getType = 129 Case "datetime": getType = 135 Case "tinyint": getType = 16 Case Else: getType = 0 End Select End Function =========================================================== ' Keywords: ' myODBC, mySQL, Visual Basic, VB, ADODB.RECORDSET ' ADODB.CONNECTION, ADO, OpenSchema, DESCRIBE [table], ' SHOW COLUMNS FROM [table], ERRCODE: 13, ADOVBS ' lower case table names, lower_case_table_names ' Error: ' Microsoft OLE DB Provider for ODBC Drivers -2147467259 ' [MySQL] [ODBC 3.51 Driver] [mysqld-3.23.51-nt] ' Error on delete of '.\ladder\junka.MYI' (Errcode: 13) ' Environment: ' WkStn - Windows 2000 WkStn, 256 meg, AMD K6-2 500 mhz, build 2195, SP1 ' MDAC 2.7 ' myODBC 3.51 - WinX ' ' Server - Windows NT 4.0 Server, 64 meg, Pentium II 400 mhz ' mySQL - 3.23.51 - NT ' lower_case_table_names = 1 --------------------------------------------------------------------- Before posting, please check: http://www.mysql.com/manual.php (the manual) http://lists.mysql.com/ (the list archive) To request this thread, e-mail <[EMAIL PROTECTED]> To unsubscribe, e-mail <[EMAIL PROTECTED]> Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php