나는 datasnap을 실험하고 있으며 (이전에 사용한 적이 없음) 이상한 문제가 발생했습니다. 내가 잘못하고 있는지 모르겠습니다. 내 양식에 Clientdataset3를 배치했습니다. 데이터 스냅 서버에 연결하는 SQLConnection1 (동일한 형식)에 연결했습니다. 또한 Clientdataset3을 삽입하려는 테이블에 연결된 서버 측의 datasetprovider (명령 텍스트 허용)에 연결했습니다. 그러나 내가 실행할 때 :
procedure TForm3.AdvGlowButton1Click(Sender: TObject);
begin
clientdataset3.CommandText:='insert into "MY_TABLE" (twit) values (:A)';
clientdataset3.Params.ParamByName('A').AsString := cxmemo1.Lines.Text;
clientdataset3.Execute;
end;
"Remote error : no such table : insert"가 표시됩니다.
내가 무엇을 잘못하고 있지 ? 데이터베이스는 XE6을 사용하는 DBX를 통한 SQLite입니다.
SELECT 문을 사용하여 CDS를 채우는 경우 맞춤형 INSERT 문을 보내는 연습을 진행할 필요가 없습니다.
전화 할 수 있어야합니다.
ClientDataSet3.Insert;
// populate fields here
ClientDataSet3.Post;
ClientDataSet3.ApplyUpdates에 대한 호출이 이어집니다.
마찬가지로 ClientDataSet3.Delete를 호출하여 DELETE를 수행 할 수 있습니다.
필요한 INSERT, DELETE 및 UPDATE 문의 구성은 CDS 제공자가 처리합니다. 그러나 나는 당신이 시도하는 방식으로 INSERT 를 할 수 없다고 제안하려는 의도 는 없습니다 -잘 작동합니다.
여기에서 INSERT에 무슨 문제가 있는지 알 수 없습니다. 대신 CREATE TABLE 등의 명령문을 포함하여 저에게 적합한 코드가 있으므로 "차이점을 찾아 낼"수 있습니다. 2014 년 6 월 4 일자 Win7 64 비트 및 v.3.8.5.0의 sqlite3.dll에서 XE6을 사용하고 있습니다.
샘플 코드는 삽입을 수행하는 세 가지 방법 (모두 확인 및 작동)을 제공합니다. 두 가지는 사용자 정의 INSERT 문을 사용하고 세 번째는 코드 (CDS1.Insert)에서 호출 할 수있는 CDS의 기본 삽입 동작을 사용하고 ' DBNavigator의 + '버튼. 기본 CDS 삽입 동작에는 특별한 처리가 필요합니다. 서버의 ID 열이 Autoinc로 정의되어 있지만 CDS 삽입을 수행하는 동안 autoinc 값을 가져 오는 것은 문제가 있으므로 코드는 여기에 설명 된 방법을 사용합니다.
http://edn.embarcadero.com/article/20847
CDS ApplyUpdates 프로세스 중에 대체되는 임시, 음수, ID 값 생성. 서버의 ID 열 값이 64 비트 정수이기 때문에 SqlQuery ID 필드의 ProviderFlags와 관련하여 링크의 에라타 섹션에서 참조한 측정 값이 필요하다는 점을 DFM에서 확인하십시오.
type
TDataOperation = (doCreateTable, doDropTable, doInsert, doInsertUsingParams, doSelect);
TForm3 = class(TForm)
[...]
{ private declarations }
ID : Int64;
function NextID : Int64;
[...]
end;
implementation
{$R *.dfm}
const
scCreateTable = 'CREATE TABLE [MATable2] ([ID] INTEGER NOT NULL '
+ #13#10 + 'PRIMARY KEY AUTOINCREMENT, [AName] VARCHAR(20), '
+ #13#10 + ' [AMemo] MEMO)';
scDropTable =
'DROP TABLE [MATable2]';
scInsert1 =
'INSERT INTO [MATable2] (AName, AMemo) VALUES(''a'', ''A memo'')';
scSelect =
'SELECT * FROM [MATable2]';
scInsertUsingParams =
'INSERT INTO [MATable2] (AName, AMemo) VALUES(:AName, :AMemo)';
procedure TForm3.PerformTableOperation(Operation : TDataOperation);
var
Param : TParam;
begin
if {(Operation in [toCreate, toDrop]) and} CDS1.Active then
CDS1.Close;
case Operation of
doCreateTable : begin
CDS1.CommandText := scCreateTable;
CDS1.Execute;
PerformTableOperation(doSelect);
end;
doDropTable : begin
CDS1.CommandText := scDropTable;
CDS1.Execute;
end;
doSelect : begin
CDS1.CommandText := scSelect;
CDS1.Open;
end;
doInsert : begin
CDS1.CommandText := scInsert1;
CDS1.Execute;
PerformTableOperation(doSelect);
end;
doInsertUsingParams : begin
CDS1.CommandText := scInsertUsingParams;
// CDS1.FetchParams;
CDS1.Params.ParamByName('AName').AsString:= 'bcdef';
CDS1.Params.ParamByName('AMemo').AsString := 'memo b';
CDS1.Execute;
CDS1.Params.Clear;
PerformTableOperation(doSelect);
end;
end;
if CDS1.Active then // it won't be after a toDrop
CDS1.ApplyUpdates(-1);
end;
procedure TForm3.OpenConnection;
begin
SqlConnection1.Open;
end;
procedure TForm3.btnCreateClick(Sender: TObject);
begin
PerformTableOperation(doCreateTable);
end;
[etc ...]
procedure TForm3.btnReopenClick(Sender: TObject);
begin
CDS1.Close;
PerformTableOperation(doSelect);
end;
procedure TForm3.btnSelectClick(Sender: TObject);
begin
PerformTableOperation(doSelect);
end;
procedure TForm3.CDS1AfterDelete(DataSet: TDataSet);
begin
CDS1.ApplyUpdates(-1);
end;
procedure TForm3.CDS1AfterPost(DataSet: TDataSet);
begin
CDS1.ApplyUpdates(-1);
end;
procedure TForm3.CDS1NewRecord(DataSet: TDataSet);
begin
CDS1.FieldByName('ID').AsInteger := NextID;
end;
function TForm3.NextID: Int64;
begin
Dec(ID);
Result := ID;
end;
procedure TForm3.FormCreate(Sender: TObject);
begin
OpenConnection;
end;
end.
그리고 내 DB 구성 요소가 어떻게 설정되었는지 추측 할 필요를 최소화하기위한 부분 DFM이 있습니다.
object Form3: TForm3
[...]
object DBGrid1: TDBGrid
Left = 8
Top = 8
Width = 456
Height = 193
DataSource = DataSource1
TabOrder = 0
TitleFont.Charset = DEFAULT_CHARSET
TitleFont.Color = clWindowText
TitleFont.Height = -11
TitleFont.Name = 'Tahoma'
TitleFont.Style = []
Columns = <
item
Expanded = False
FieldName = 'ID'
Visible = True
end
item
Expanded = False
FieldName = 'AName'
Visible = True
end
item
Expanded = False
FieldName = 'AMemo'
Visible = True
end>
end
[...]
object DBNavigator1: TDBNavigator
Left = 16
Top = 216
Width = 240
Height = 25
DataSource = DataSource1
TabOrder = 6
end
object DBMemo1: TDBMemo
Left = 207
Top = 259
Width = 185
Height = 74
DataField = 'AMemo'
DataSource = DataSource1
TabOrder = 7
end
object DBEdit1: TDBEdit
Left = 24
Top = 264
Width = 121
Height = 21
DataField = 'AName'
DataSource = DataSource1
TabOrder = 8
end
object SQLConnection1: TSQLConnection
ConnectionName = 'SQLITECONNECTION'
DriverName = 'Sqlite'
LoginPrompt = False
Params.Strings = (
'DriverName=Sqlite'
'Database=D:\delphi\xe6\sqlite\matestdb.sqlite')
Connected = True
Left = 40
Top = 16
end
object SQLQuery1: TSQLQuery
MaxBlobSize = 1
Params = <>
SQL.Strings = (
'select * from [matable2]')
SQLConnection = SQLConnection1
Left = 128
Top = 16
object SQLQuery1ID: TLargeintField
FieldName = 'ID'
ProviderFlags = [pfInWhere, pfInKey]
end
object SQLQuery1AName: TWideStringField
FieldName = 'AName'
end
object SQLQuery1AMemo: TWideMemoField
FieldName = 'AMemo'
BlobType = ftWideMemo
Size = 1
end
end
object DataSetProvider1: TDataSetProvider
DataSet = SQLQuery1
Options = [poAllowCommandText, poUseQuoteChar]
UpdateMode = upWhereKeyOnly
Left = 216
Top = 16
end
object CDS1: TClientDataSet
Aggregates = <>
CommandText = 'select * from MATable2'
Params = <>
ProviderName = 'DataSetProvider1'
BeforeInsert = CDS1BeforeInsert
AfterInsert = CDS1AfterInsert
BeforePost = CDS1BeforePost
AfterPost = CDS1AfterPost
AfterDelete = CDS1AfterDelete
OnNewRecord = CDS1NewRecord
AfterApplyUpdates = CDS1AfterApplyUpdates
Left = 288
Top = 16
object CDS1ID: TLargeintField
FieldName = 'ID'
end
object CDS1AName: TWideStringField
FieldName = 'AName'
end
object CDS1AMemo: TWideMemoField
FieldName = 'AMemo'
BlobType = ftWideMemo
Size = 1
end
end
object DataSource1: TDataSource
DataSet = CDS1
Left = 344
Top = 16
end
end
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다