>>>Hi all,
>>>
>>>I have a SQL SERVER Table with PK column defined as Uniqueidentifier
>>>
>>>
>>>[CustomerID] uniqueidentifier ROWGUIDCOL NOT NULL ,
>>>
>>>CONSTRAINT [DF_TR_TRAN_tr_id] DEFAULT (newid()) FOR [CustomerID],
>>>
>>>
>>>(Name:CustomerId RowGuid = Yes, Default value = Newid())
>>>
>>>The problem starts when I try to update the above table using SQL Pass-through from Foxpro.
>>>
>>>I have set up the cursor as follows:
>>>
>>> CURSORSETPROP("FetchMemo", .T.)
>>> CURSORSETPROP("Tables", "Customers")
>>> CURSORSETPROP("UpdatableFieldList", "Col1, Col2... )
>>> CURSORSETPROP("UpdateNameList", "Col1 Customers.Col1, Col2... )
>>> CURSORSETPROP("KeyFieldList","CustomerId")
>>> CURSORSETPROP("WhereType", 3)
>>> CURSORSETPROP("SendUpdates", .T.)
>>>
>>>
>>>
>>>If I exclude the "CustomerId" column from the
>>> "UpdatableFieldList" and "UpdateNameList" properties of the cursor,
>>> - INSERT works ok,
>>> - UPDATE and DELETE are throwing the following error :
>>> "No key columns specified for the update table "name".
>>> Use the KeyFieldList property of the cursor"
>>>
>>>(Please note that KeyFieldList property of the cursor has been set corectly.)
>>>
>>>
>>>
>>>When I add the "CustomerId" column to the "UpdatableFieldList" and "UpdateNameList"
>>>
>>> - UPDATE and DELETE work fine,
>>> - INSERT repors the error :"Invalid character value for CAST specification"
>>>
>>>
>>>I guess I can't have it both ways.
>>>
>>>Any ideas? Any help highly appreciated!
>>>
>>>
>>>Regards,
>>>
>>>Zoran
>>
>>Zoran,
>>Second version is the right one IMHO. It says invalid character for cast specification. Did you use some non hex digit as your GUID for insert?
>>Guids are like:
>>5D63CA4C-30E7-482C-8D2F-8E34AF1DA4FB
>>Cetin
>
>
>Cetin,
>
>I was trying to get away with empty CustomerId value, hoping that SQL server will do its work assigning the default value (NewId)
>
>I guess I will have to do one more trip to SQL server getting the NewId() value and assigning it to the column from the client side.
>
>Thanks,
>
>
>Zoran
Oh Zoran NO,
The beauty of a GUID is that you can create and send a key w/o a need to roundtrip to backend (besides it's unicity). IOW you know the key before even the backend knows. All NewID() does is to create a GUID and you can do that w/o help of SQL server. ie:
replace myPKID with chrtran(getGUID(), '{}','')
Function getGUID
Declare Integer CoCreateGuid In 'OLE32.dll' ;
string @pguid
Declare Integer StringFromGUID2 In 'OLE32.dll' ;
string rguid, String @lpsz, Integer cchMax
Declare Integer UuidCreateSequential In 'RPCRT4.dll' String @ Uuid
Local pguid,rguid, lcOldError, lnResult
pguid=Replicate(Chr(0),16)
rguid=Replicate(Chr(0),80)
lcOldError = On('error')
On Error lnResult = CoCreateGuid(@pguid)
lnResult = UuidCreateSequential(@pguid)
On Error &lcOldError
Return ;
Iif( InList(m.lnResult,0,1824) And ;
StringFromGUID2(pguid,@rguid,40) # 0, ;
StrConv(Left(rguid,76),10), "" )
endfunc
Cetin