一般來說,Clarion使用數據字典(DCT)作爲程序將要使用的持久性數據(文件)的中心。還有其他方法可以定義表格,但是由於您提到您從APP進行編譯,因此我得出結論,您的APP已鏈接到DCT。
在DCT中,您對應用程序將使用的每個文件都有聲明。在文件聲明中,您可以通知邏輯和磁盤文件名。該錯誤消息表示您在定義磁盤文件名時遇到問題。
Clarion語言將邏輯數據結構定義與其磁盤文件分開。 A「文件」用於號角PROGRAMM,是一個複雜的數據結構,其符合以下:
structName FILE, DRIVER('driverType'), NAME('diskFileName')
key KEY(keyName)
index INDEX(indexName)
recordName RECORD
field DATATYPE
.
.
END
END
以上是基本的聲明語法,以及一個真實的例子將是這樣的:
orders FILE, DRIVER('TopSpeed'), NAME('sales.dat\orders')
ordersPK KEY(id), PRIMARY
customerK INDEX(customerID)
notes MEMO(4096)
RECORD RECORD
id LONG
customerID LONG
datePlaced DATE
status STRING(1)
END
END
orderItems FILE, DRIVER('TopSpeed'), NAME('sales.dat\items')
itemsPK KEY(orderID, id), PRIMARY
RECORD RECORD
orderID LONG
id LONG
productID LONG
quantityOrdered DECIMAL(10, 2)
unitPrice DECIMAL(10, 2)
END
END
現在,通過上面的兩個聲明,我有兩個邏輯文件駐留在同一個磁盤文件中。這是爲某些文件驅動程序提供的功能,如TopSpeed文件驅動程序。由系統設計人員決定是否以及哪些文件將駐留在同一個磁盤文件中,並且如果是這樣的話,我可以在另一個帖子上討論這個問題。
現在,問題可能是由於您可能沒有更改文件聲明的NAME屬性,並且您使用的驅動程序不支持多文件存儲。
下面是上述同一案例的修訂文件定義,但是針對SQL數據庫。現在
szDBConn CSTRING(1024) ! //Connection string to DB server
orders FILE, DRIVER('ODBC'), NAME('orders'), OWNER(szDBconn)
ordersPK KEY(id), PRIMARY
customerK INDEX(customerID)
notes MEMO(4096), NAME('notes')
RECORD RECORD
id LONG, NAME('id | READONLY')
customerID LONG
datePlaced DATE
status STRING(1)
END
END
orderItems FILE, DRIVER('ODBC'), NAME('order_items'), OWNER(szDBconn)
itemsPK KEY(orderID, id), PRIMARY
RECORD RECORD
orderID LONG
id LONG
productID LONG
quantityOrdered DECIMAL(10, 2)
unitPrice DECIMAL(10, 2)
END
END
,如果你留意,你會發現一個szDBconn
變量聲明,這是在文件中引用的聲明的存在。這是通知Clarion文件驅動程序系統需要傳遞ODBC管理器以連接到dabase的必要步驟。檢查Connection Strings瞭解大量連接字符串示例。
檢查文件的DCT定義,看它們是否反映了驅動程序的期望。
此外,請注意,Clarion確實允許混合不同的文件驅動程序以供同一程序使用。因此,如果需要,您可以調整現有程序以使用外部數據源。
這是一個完整的Clarion程序,用於將信息從ISAM文件傳輸到DBMS。
PROGRAM
MAP
END
INCLUDE('equates.clw') ! //Include common definitions
szDBconn CSTRING(1024)
inputFile FILE, DRIVER('dBase3')
RECORD RECORD
id LONG
name STRING(50)
END
END
outuputFile FILE, DRIVER('ODBC'), NAME('import.newcustomers'), |
OWNER(szDBconn)
RECORD RECORD
id LONG
name STRING(50)
backendImportedColumn STRING(8)
imported GROUP, OVER(backendImportedColumn)
date DATE
time TIME
END
processed CHAR(1)
END
END
CODE
IF NOT EXISTS(COMMAND(1))
MESSAGE('File ' & COMMAND(1) & ' doesn''t exist')
RETURN
END
imputFile{ PROP:Name } = COMMAND(1)
OPEN(inputFile, 42h)
IF ERRORCODE()
MESSAGE('Error openning file ' & inputFile{ PROP:Name })
RETURN
END
szDBconn = 'Driver={{PostgreSQL ANSI};Server=192.168.0.1;Database=test;' & |
'Uid=me;Pwd=plaintextpassword'
OPEN(outputFile, 42h)
IF ERRORCODE()
MESSAGE('Error openning import table: ' & FILEERROR())
RETURN
END
! // Lets stuff the information thatll be used for every record
outputFile.imported.date = TODAY()
outputFile.imported.time = CLOCK()
outputFile.processed = 'N'
! //arm sequential ISAM file scan
SET(inputFile, 1)
LOOP UNTIL EOF(inputFile)
NEXT(inputFile)
outputFile.id = inputFile.id
outputFile.name = input.name
ADD(outputFile)
END
BEEP(BEEP:SystemExclamation)
MESSAGE('File importing completed')
那麼,這個示例程序僅用於顯示如何使用程序的不同元素。我沒有使用窗口讓用戶跟蹤進度,並使用Clarion的基元,例如ADD(),這些基元肯定有效,但是在循環內部可能會影響性能。
更好的辦法是在用outputFile{ PROP:SQ } = 'BEGIN TRANSACTION'
打開的事務中封裝整個讀數,最後發出outputFile{ PROP:SQL } = 'COMMIT'
。
是的,儘管PROP:SQL可以發出服務器接受的任何命令,包括DROP DATABASE,所以它非常強大。小心使用。
Gustavo
完成沒有錯誤。但是執行時沒有找到數據文件。 – 2012-07-24 06:36:12