SQLSERVERに更新出来ない

解決


yu  2010-05-12 08:23:08  No: 38422

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;


igy  2010-05-12 19:37:47  No: 38423

Delphi 2009機能評価ガイド
http://edn.embarcadero.com/article/38817
を見ると、RDBMSへのアクセスは、

>Microsoft SQL Server 2000, 2005 

と書かれているようですが、dbExpress DriverはEnt版に
標準搭載のものを使っていますか?


yu  2010-05-13 00:48:48  No: 38424

はい  Driver は、標準搭載のものを利用しております。  DELPHI2009では、
SQLSERVER2008は、使えないのでしょうか?


nobukoshi802  2010-05-13 03:58:43  No: 38425

MS-SQL Serverの場合
更新時にはプライマリーキーが必要だと思いました。
datasetに、プライマリーキーとなる項目は選択されていますか?


igy  2010-05-13 08:50:38  No: 38426

>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 を検討するのは、いかがですか?


yu  2010-05-13 20:53:57  No: 38427

igy様、nobukoshi802様有難うございました。調べたところDLPHI2009のDBEXpres
ドライバでは、SQLserver2008に対応していないことが、わかったためにADOを利用することにいたしました。  アドバイス有難うございました。


Atchoum  2011-08-04 00:05:35  No: 38428

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の評価ガイドで保証はされていないけど、できることがわかったのでよし。


Atchoum  2011-08-04 00:12:06  No: 38429

ちなみに
「手動または分散トランザクションモードのため、新規接続を作成できません。」
(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/


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加