DEPHI2009を使用しております。 dbexpress を利用してSQLSERVER2008に接続しています。sqldataset,ClientDataSetを利用しています。データの呼び出しは、出来るのですが、データの更新・削除が全くできません。代わりに他のデータベース(FIREBIRD)を利用すると問題なく更新されます。データエクスプローラーのMSSQLのテーブルから更新すると問題なく更新されます。
sqldataset.CommandText:='select * from TEST'
//-----------------------データ更新
var
TD : TTransactionDesc;
begin
TD.transactionid :=1;
TD.IsolationLevel := xilreadcommitted;
SQLConnection1.StartTransaction(TD);
try
ClientDataSet1.Edit;
ClientDataSet1.Post;
ClientDataSet1.ApplyUpdates(0);
close;
SQLConnection1.commit(TD);
except
on E:exception do
begin
SQLConnection1.Rollback(TD);
showmessage('エラーが、発生しました');
close;
end;
end;
end;
Delphi 2009機能評価ガイド
http://edn.embarcadero.com/article/38817
を見ると、RDBMSへのアクセスは、
>Microsoft SQL Server 2000, 2005
と書かれているようですが、dbExpress DriverはEnt版に
標準搭載のものを使っていますか?
はい Driver は、標準搭載のものを利用しております。 DELPHI2009では、
SQLSERVER2008は、使えないのでしょうか?
MS-SQL Serverの場合
更新時にはプライマリーキーが必要だと思いました。
datasetに、プライマリーキーとなる項目は選択されていますか?
>DELPHI2009では、SQLSERVER2008は、使えないのでしょうか?
標準搭載のdbExpress Driver では、2008は対象に含まれないみたいですが、
有償の
dbExpress Driver for Microsoft SQL Server
http://www.componentsource.co.jp/products/dbexpress-driver-for-microsoft-sql-server/index.html
を検討したり、
あるいは、Delphi2010 を検討するのは、いかがですか?
igy様、nobukoshi802様有難うございました。調べたところDLPHI2009のDBEXpres
ドライバでは、SQLserver2008に対応していないことが、わかったためにADOを利用することにいたしました。 アドバイス有難うございました。
Delphi2007、SQLServer2008R2、DbExpressにて同じようにはまっていましたが
SQLServerのMultipleActiveResultSet=TrueにしたらApplyUpdatesが通りましたのでご報告。
構成は下記のとおり
TSQLConnection→TSQLTable(TSQLQuery)→TDatasetProvider
→TClientDataSet→TDataSource→DBGrid,DBNavigator
をおいて接続。
データは表示される。
+ボタンで新規に行を追加して、チェックマークで登録。
その後、ボタンClickイベントにClientDataSet.ApplyUpdates
を実行するとエラー
「手動または分散トランザクションモードのため新規接続を作
成できません」
MultipleActiveResultSet=TrueはTSQLConnection.Paramsに1行追加してください。
MultipleActiveResultSetについてマイクロソフトサイトより抜粋
複数のアクティブな結果セット (MARS : Multiple Active Result Set) は、SQL Server 2005 で動作する新機能で、複数のバッチを単一の接続で実行することができます。
http://msdn.microsoft.com/ja-jp/library/h32h3abf(v=vs.80).aspx
Delphi2009の評価ガイドで保証はされていないけど、できることがわかったのでよし。
ちなみに
「手動または分散トランザクションモードのため、新規接続を作成できません。」
(Cannot create new connection because in manual or distributed transaction mode.)
のエラーのとき
下記ページにあるようにTSQLDataSetコンポーネントの「GetMetaData」プロパティを「False」に設定してもだめでした。
dbExpressでMS SQL Serverにアクセス - 明示的なトランザクションでエラー発生
http://blogs.embarcadero.com/teamj/2011/01/18/1668/
ツイート | ![]() |