Foxpro-SQLserver

วิธีที่ 1
SET TABLEVALIDATE TO 0
USE tablename (ที่เสีย)
APPEND BLANK
DELETE
PACK
SET TABLEVALIDATE TO 3
USE

และวิธีที่สอง
ให้สร้างไฟล์โมดูลขึ้นมาตัวหนึ่ง เอาไว้เก็บ procedure/function ที่ใช้ประจำ
ก๊อปปี้ซอร์สข้างล่างทั้งหมดไปไว้ที่ module ไฟล์ที่สร้างขึ้น
ตอนเรียกใช้ module ให้ใช้คำสั่ง set proc to ชื่อโมดูล.prg
ก่อนซ่อมตารางทุกเครื่องต้องปิดไฟล์นั้นก่อน
คำสั่งที่ใช้ในการซ่อมตารางที่ corrupted คือ
do WinRepairData with 'drive:\พาธ\ชื่อไฟล์.dbf'
เสร็จแล้วก็ลอง use ว่าได้ไหม ถ้าไม่ได้แสดงว่าไฟล์มีคนอื่นเปิดค้างอยู่ ปิดให้หมดแล้ว repair ใหม่
*************************************
procedure WinRepairData
Lparameters tcDBF
Local handle, lnFileSize, lnReccount, lnHeaderSize, lnRecordSize, ;
lnCalculatedReccount, llHasMemo
handle=fopen(tcDBF,12) && Opened readwrite
lnFileSize = fseek(handle,0,2) && Get file size
* Read header info
lnReccount = ReadBytes(handle, 4,4)
lnHeaderSize = ReadBytes(handle, 8,2)
lnRecordSize = ReadBytes(handle,10,2)

lnCalculatedReccount = floor((lnFileSize-(lnHeaderSize+1))/lnRecordSize)
If lnCalculatedReccount # lnReccount && If calculated # recorded fix it
WriteBytes(handle, 4,4,lnCalculatedReccount)
endif
=fclose(handle)
endproc

function WriteBytes
Lparameters tnHandle, tnPos, tnSize, tnNumber, tlLR
Local lcString, lnLowDword, lnHighDword,ix
lcString=''
If tlLR
For ix=tnSize-1 to 0 step -1
lcString=lcString+chr(tnNumber/256^ix%256)
Endfor
Else
For ix=0 to tnSize-1
lcString=lcString+chr(tnNumber/256^ix%256)
Endfor
Endif
=fseek(tnHandle, tnPos,0) && Go to Pos
Return fwrite(tnHandle,lcString)
endfunc

function ReadBytes
Lparameters tnHandle, tnPos, tnSize, tlLR
Local lcString, lnRetValue,ix
=fseek(tnHandle, tnPos,0) && Go to Pos
lcString = fread(tnHandle, tnSize) && Read tnSize bytes
lnRetValue = 0
For ix=0 to tnSize-1 && Convert to a number
lnRetValue = lnRetValue + asc(substr(lcString,ix+1)) * ;
iif(tlLR,256^(tnSize-1-ix),256^ix)
Endfor
Return int(lnRetValue)
endfunc
คัดลอกมาจาก
http://www.songkwae.com/foxboard/display_topic_threads.asp?ReturnPage=Thread&ForumID=3&TopicID=363&PagePosition=3&ThreadPage=1
http://www.songkwae.com/foxboard/question.asp?QID=8350
http://www.songkwae.com/foxboard/question.asp?QID=6158
ทดลองดูนะครับ ผมใช้ได้มาแล้วแน่นอนทั้งสองแบบ
* Find out the member_no of the new member
If SQLExec(ThisForm.nHandle, "Select @@identity") < 0
<code intentionally left out>

nNewMemberID = sqlresult.exp

ตัวอย่างการสร้าง Store procedure
CREATE PROCEDURE updateadult
@member_no member_no,
@lastname shortstring = NULL,
@firstname shortstring = NULL,
@middleinitial letter = NULL,
@street shortstring = NULL,
@city shortstring = NULL,
@state statecode = NULL,
@zip zipcode = NULL,
@phone_no phonenumber = NULL
AS
DECLARE @sqlstring1 varchar(255)
DECLARE @sqlstring2 varchar(255)

IF @lastname = NULL AND @firstname = NULL AND
@middleinitial = NULL AND @street = NULL AND
@city = NULL AND @state = NULL AND
@zip = NULL AND @phone_no = NULL
BEGIN
PRINT "Nothing to do."
RETURN
END

SELECT @sqlstring1 = NULL
SELECT @sqlstring2 = NULL

IF @lastname != NULL
SELECT @sqlstring1 = @sqlstring1 + "lastname = '" +
@lastname + "',"
IF @firstname != NULL
SELECT @sqlstring1 = @sqlstring1 + "firstname = '" +
@firstname + "',"
<code intentionally left out>

BEGIN TRANSACTION
IF @sqlstring1 != NULL
BEGIN
SELECT @sqlstring1 = "UPDATE member SET " +

SUBSTRING(@sqlstring1, 1,
DATALENGTH(@sqlstring1) - 1) +
" WHERE member_no = " +
CONVERT(char(6), @member_no)
EXECUTE (@sqlstring1)
IF @@error != 0
BEGIN
ROLLBACK TRAN
RAISERROR('The member information was not saved.
Feel free to try again.',16,1)
RETURN
END
END
F @sqlstring2 != NULL
BEGIN
SELECT @sqlstring2 = "UPDATE adult SET " +
SUBSTRING(@sqlstring2, 1,
DATALENGTH(@sqlstring2) - 1) +
" WHERE member_no = " +
CONVERT(char(6), @member_no)
EXECUTE (@sqlstring2)
IF @@error != 0
BEGIN
ROLLBACK TRAN
RAISERROR('The member information was not saved.
Feel free to try again.',16,1)
RETURN
END
END

COMMIT TRANSACTION

โปแกรม Store procedure ในการ Remove member
CREATE PROCEDURE removemember
@member_no member_no
AS
IF NOT EXISTS
(SELECT * FROM member WHERE member_no = @member_no)
BEGIN
PRINT " Member number not found in Member table."
RETURN
END

IF EXISTS (SELECT member_no FROM juvenile
WHERE @member_no = adult_member_no)
BEGIN
RAISERROR('This member can not be deleted. He/she is
an adult with active juveniles.',16,1)
RETURN
END

IF EXISTS (SELECT member_no FROM loan
WHERE member_no = @member_no)
BEGIN
RAISERROR("This member can not be deleted. He/she has
active loans.",16,1)
RETURN
END

BEGIN TRANSACTION

IF EXISTS (SELECT member_no FROM loanhist
WHERE member_no = @member_no)
BEGIN
PRINT 'Deleting Loan History information'
DELETE loanhist WHERE member_no = @member_no
IF @@error != 0
BEGIN
ROLLBACK TRAN
RETURN
END
END

IF EXISTS (SELECT member_no FROM reservation
WHERE member_no = @member_no)
BEGIN
PRINT 'Deleting Loan Reservation information'
DELETE reservation WHERE member_no = @member_no
IF @@error != 0
BEGIN
ROLLBACK TRAN
RETURN
END
END

IF EXISTS (SELECT member_no FROM juvenile
WHERE member_no = @member_no)
BEGIN
DELETE juvenile WHERE member_no = @member_no
IF @@error != 0
BEGIN
ROLLBACK TRAN
RETURN
END
END
ELSE IF EXISTS (SELECT member_no FROM adult
WHERE member_no = @member_no)
BEGIN
DELETE adult WHERE member_no = @member_no
IF @@error != 0
BEGIN
ROLLBACK TRAN
RETURN
END
END

DELETE member WHERE member_no = @member_no
IF @@error != 0
BEGIN
ROLLBACK TRAN
RETURN
END

COMMIT TRANSACTION

edit @ 2006/10/14 12:11:13