根據DELTA自動生成SQL語句
from :
http://www.cnblogs.com/hnxxcxg/archive/2012/03/09/2388261.html
上傳客戶端的CLIENTDATASET.delta到伺服器的clientdataset.data,服務端解析clientdataset的資料生成相應的SQL語句。
相對於直接呼叫datasetprovider.applyupdates()方法提交資料而言,前者的可控性更強,對於某些要求靈活性很強的場合,前者可能是必須的提交方式。
procedure TBaseService.ApplyUpdates(const Delta: OleVariant; TableName, KeyField: WideString);
var
Flag: Boolean;
begin
if VarIsNull(Delta) then exit;
with (FParent as TDataServer2) do
begin
cdsDelta.Close;
cdsDelta.Data := Delta;
Flag := cdsDelta.FindField('SYS_STATUS') <> nil;
end; // with
if Flag then
InnerApplyUpdates2(TableName, KeyField)
else
InnerApplyUpdates(TableName, KeyField);
end;
function vartosql(value: Variant): wideString;
var
tmp:widestring;
begin
if (varisnull(Value)) or (varisempty(Value)) then
Result:='NULL'
else
case Vartype(value) of
varDate:
begin
tmp := formatDatetime('yyyy-mm-dd hh:mm:ss', VartoDatetime(Value));
Result:=Quotedstr(tmp);
end;
varString,varOlestr:
Result:=Quotedstr(Trim(Vartostr(Value)));
varboolean:
begin
if Value then
Result:='1'
else
Result:='0';
end;
varSmallint,varInteger,varDouble,varShortInt,varInt64,varLongWord,varCurrency:
begin
Result:=trim(Vartostr(Value));
end;
else
Result:=Quotedstr(Trim(Vartostr(Value)));
end;
end;
procedure TBaseService.InnerApplyUpdates(TableName, KeyField: WideString);
var
i: integer;
s1, s2: string;
CmdStr: string;
FieldList: TStringList;
begin
with (FParent as TDataServer2) do
begin
FieldList := TStringList.Create;
Connection.GetFieldNames(TableName, FieldList);
if not cdsDelta.Active then cdsDelta.Open;
for i := 1 to FieldList.Count do
if cdsDelta.FindField(FieldList[i - 1]) <> nil then
cdsDelta.FindField(FieldList[i - 1]).Tag := 1;
FieldList.Free;
if cdsDelta.RecordCount > 0 then
begin
cdsDelta.First;
s1 := '';
s2 := '';
while not cdsDelta.Eof do
begin
CmdStr := '';
case cdsDelta.UpdateStatus of
usUnmodified:
begin
s2 := VarToSql(cdsDelta[KeyField]);
end;
usModified:
begin
s1 := '';
for i := 1 to cdsDelta.FieldCount do
// if (not cdsDelta.Fields[i - 1].IsNull) and (cdsDelta.Fields[i - 1].Tag = 1) then
if (cdsDelta.Fields[i-1].NewValue <> System.Variants.Unassigned and (cdsDelta.Fields[i - 1].Tag = 1) then
begin
if s1 = '' then
s1 := Trim(cdsDelta.Fields[i - 1].FieldName) + ' = ' + VarToSql(cdsDelta.Fields[i - 1].Value)
else
s1 := s1 + ',' + Trim(cdsDelta.Fields[i - 1].FieldName) + ' = ' + VarToSql(cdsDelta.Fields[i - 1].Value);
end;
if s1 <> '' then
begin
CmdStr := 'Update ' + TableName + ' Set ' + s1 + ' Where ' + KeyField + ' = ' + s2;
end;
end;
usInserted:
begin
s1 := '';
s2 := '';
for i := 1 to cdsDelta.FieldCount do
if (not cdsDelta.Fields[i - 1].IsNull) and (cdsDelta.Fields[i - 1].Tag = 1) then
begin
if s1 = '' then
begin
s1 := Trim(cdsDelta.Fields[i - 1].FieldName);
s2 := VarToSql(cdsDelta.Fields[i - 1].Value);
end
else
begin
s1 := s1 + ',' + Trim(cdsDelta.Fields[i - 1].FieldName);
s2 := s2 + ',' + VarToSql(cdsDelta.Fields[i - 1].Value);
end;
end;
if s1 <> '' then
begin
CmdStr := 'Insert into ' + TableName + '(' + s1 + ') Values (' + s2 + ')';
end;
end;
usDeleted:
begin
s2 := VarToSql(cdsDelta[KeyField]);
CmdStr := 'Delete ' + TableName + ' Where ' + KeyField + ' = ' + s2;
end;
end;
if CmdStr <> '' then Cmd.Execute(CmdStr);
cdsDelta.Next;
end;
cdsDelta.First;
cdsDelta.EmptyDataSet;
cdsDelta.Close;
end;
end;
end;
相關文章
- SQL2Struct:一款根據sql語句自動生成golang結構體的chrome外掛SQLStructGolang結構體Chrome
- 根據SQL Id獲得SQL語句的執行計劃SQL
- PHP根據資料表自動生成CURD操作PHP
- mybatis根據表逆向自動化生成程式碼MyBatis
- 根據作業系統程式號,查詢sql語句作業系統SQL
- C# SQL語句自動生成 給出NUnit Test方案C#SQL
- 根據表結構,自動生成匯入指令碼指令碼
- MySQL關於根據日期查詢資料的sql語句MySql
- Oracle如何根據SQL_TEXT生成SQL_IDOracleSQL
- 在AIX系統根據oracle程式pid查詢sql語句AIOracleSQL
- mysql資料庫語句自動生成MySql資料庫
- Django2.0-db(12)-根據已有的表自動生成模型Django模型
- Java中如何解析SQL語句、格式化SQL語句、生成SQL語句?JavaSQL
- 根據emp,dept,salgrade表進行的sql查詢語句(1)SQL
- dev 根據datatable動態生成gridviewdevView
- 通過SQL PROFILE自動優化SQL語句SQL優化
- EF:根據實體類生成表結構SQLSQL
- java使用jaxb解析XML(含根據xml自動生成實體類)JavaXML
- SQL Server語句的自動優化工具SQLServer優化
- SQL語句 實現自動編號功能SQL
- 一個根據資料庫自動生成model類的擴充套件資料庫套件
- 根據MediatR的Contract Messages自動生成Minimal WebApi介面WebAPI
- 根據作業系統程式號檢視oracle對應的SQL語句內容作業系統OracleSQL
- SpringBoot使用JPA根據實體類自動生成相應表-mysqlSpring BootMySql
- P001-根據編碼規則自動生成ID的函式函式
- 利用FreeSql.Generator自動根據資料庫表動態生成實體類SQL資料庫
- SQL語句圖表生成工具ChartSQLSQL
- 一個根據程式碼自動生成UML的外掛,助你看原始碼事半功倍原始碼
- 訊飛有一個可以根據描述文字自動生成PPT的AI介面,有趣AI
- js根據不同的時間段輸出不同的語句JS
- 定時生成分月表sql語句SQL
- jsqlparser使用記錄---生成sql語句JSSQL
- 用動態SQL語句SQL
- 動態SQL語句 (轉)SQL
- BIRT 中如何根據引數動態拼接 SQLSQL
- 【IT愛好者】SQL Server自動生成INSERT語句(在SQL2005下測試通過)SQLServer
- 依據錯誤號來跟蹤sql語句SQL
- PL/SQL 動態sql語句例SQL