SQLSERVERに更新出来ない

解決


yu  2010-05-11 23:23:08  No: 38422  IP: 192.*.*.*

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 10:37:47  No: 38423  IP: 192.*.*.*

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

>Microsoft SQL Server 2000, 2005 

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

編集 削除
yu  2010-05-12 15:48:48  No: 38424  IP: 192.*.*.*

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

編集 削除
nobukoshi802  2010-05-12 18:58:43  No: 38425  IP: 192.*.*.*

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

編集 削除
igy  2010-05-12 23:50:38  No: 38426  IP: 192.*.*.*

>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 11:53:57  No: 38427  IP: 192.*.*.*

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

編集 削除
Atchoum  2011-08-03 15:05:35  No: 38428  IP: 192.*.*.*

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-03 15:12:06  No: 38429  IP: 192.*.*.*

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

編集 削除