- PR -

列名に不適切文字列を使った場合のCommandBuilderでの更新

1
投稿者投稿内容
さいた
会議室デビュー日: 2004/06/27
投稿数: 10
投稿日時: 2006-02-07 21:40
いつもお世話になっております。

SQLServerよりテーブルを取得し、値を変更してテーブルの更新、という一連の作業を、ADO.NETのDataSet, SqlDataAdapter, SqlCommandBuilderを使って行おうとしております。
しかし、テーブルの列名にキーワードに相当する様な名称が使われていると、DataAdapterのUpdateメソッドを実行した時に、「キーワード'XXX' 付近に不適切な構文があります。」というエラーが発生します。('XXX'の部分は不適切とされてしまう列名)
T-SQLコマンドで実行する時の様に、 [ ] で列名を囲えばうまくいくと思われるのですが、CommandBuilder任せなので指定する事ができません。(又は指定する方法がわかりません・・・)
以下に確認用コードを記します。

-------------------------------
[T-SQL for Prepare table]
create table T1 ( F0 int primary key, [All] nvarchar(10))
-- ※この例では、不適切とされてします列名に"All"というキーワードを使用してます。

[C#CODE]
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter( "select * from T1", "Data Source=(local);Initial Catalog=tempdb;Integrated Security=SSPI");
SqlCommandBuilder cb = new SqlCommandBuilder( da);

da.Fill( ds, "T1");
ds.NewRow( new DataRow
da.Update(); // ERROR : キーワード'All' 付近に不適切な構文があります。
------------------------------
SQLServer Profilerで確認したところ、以下の様なコマンドが発行されています
exec sp_executesql N'INSERT INTO T1( F0 , All ) VALUES ( @p1 , @p2 )',N'@p1 int,@p2 nvarchar(4000)',@p1=1,@p2=N'XXX'

できればこの様にDataSetを利用し、なるべくコード量も少なくしたいと思っておりますが、何か回避策がありましたら、ご教授頂ければ幸いです。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-02-08 19:30
 一番は「不適切な」ことがわかっているなら、「不適切な」名称を使わない、ことでしょうね。保守性がいいとは、あまり言えませんし、エスケープしなければいけないことを、知らない人もいますし。。。

ヒント:→ 自動生成コマンド の、サンプルコードの中に、お望みの答えがあります。

〆 written by Jitta on 2006/02/08
さいた
会議室デビュー日: 2004/06/27
投稿数: 10
投稿日時: 2006-02-08 21:48
Jittaさん、ありがとうございます!

そう・・・、
本当はどの様なアクセスにも対応できる名前にするのが良いのですが、元になるデータがCSV形式のログファイルで、一行目のフィールド名となるべく一致させたい、というので試行錯誤しておりました。

それにしても、CommandBuilderのメンバを、穴の空くほど見ていたつもりでしたが、節穴は自分の方でした。
お陰様で解決いたしました!
ありがとうございます。
1

スキルアップ/キャリアアップ(JOB@IT)