C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 >>
■51553  Re[10]: C# システム時刻設定
□投稿者/ Jitta on the way -(2010/07/08(Thu) 18:46:44)
    No51547 (tugu さん) に返信

    > UACは元々無効化の仕様ですので、問題ないと思います。
    >

    ・導入先が、元々 UAC Off で運用している
    ・導入予定のシステムを使用するために Off にする


    どちらでしょう?
    後者なら、お客様の環境を危険な状態にする仕様ですので、再考することを勧めます。
記事No.51520 のレス /過去ログ86より / 関連記事表示
削除チェック/

■53935  Re[2]: ストアドプロシージャ
□投稿者/ がながな -(2010/09/30(Thu) 14:22:41)
    早速のご返事ありがとうございます。
    早速書き直させていただきました
    文法がおかしいのか、下記(↓の箇所)でエラーがでます。
    どのようにすればいいでしょうか?
    よろしくお願いいたします。

        Call CnToryouOpen()
    XCommand = New SqlCommand("SP1001_倉庫データ", CnToryou)
    XCommand.Parameters.AddWithValue("@受付番号", GUketukeNo)
    XCommand.Parameters.AddWithValue("@MainID", GMainID)


    XAdapter = New SqlDataAdapter
    XAdapter.SelectCommand = XCommand

    ↓ここでエラーが出ます。
        XAdapter.Fill(XDataset, "SP1001_倉庫データ")


    XTable = XDataset.Tables("SP1001_倉庫データ")




    F1001_その他の出庫予定品.dgv結果.DataSource = XTable
    CnToryou.Close()
記事No.53930 のレス /過去ログ90より / 関連記事表示
削除チェック/

■53936  Re[3]: ストアドプロシージャ
□投稿者/ マサヤ -(2010/09/30(Thu) 14:30:05)
    エラーの内容はどのようなものでしょうか?
    実行時のエラーでしょうか?コンパイルエラーでしょうか?
記事No.53930 のレス /過去ログ90より / 関連記事表示
削除チェック/

■53937  Re[4]: ストアドプロシージャ
□投稿者/ がながな -(2010/09/30(Thu) 14:36:32)
    sqlexceptionはハンドリングされませんでした。
    行 1: 'SP1001_倉庫データ' の近くに無効な構文があります。
    と出ます。
記事No.53930 のレス /過去ログ90より / 関連記事表示
削除チェック/

■85824  Re[3]: LINQ to SQL:
□投稿者/ ぬる -(2017/11/28(Tue) 09:12:42)
    2017/11/28(Tue) 09:13:40 編集(投稿者)

    ありがとうございます。
    ExecuteCommandのDeleteは間にSelectを入れて正常に削除されていることを確認しています。
    Linqでも生SQLでも、Delete→Selectは問題ないです。
    データが削除されていないとすればDB側で主キー違反になりますが、
    「既に使用されているキーを持つエンティティは追加できません。」というエラーはDB側の主キー違反とは別物だと思います。
記事No.85784 のレス /過去ログ147より / 関連記事表示
削除チェック/

■85825  Re[4]: LINQ to SQL:
□投稿者/ furu -(2017/11/28(Tue) 09:38:27)
    No85824 (ぬる さん) に返信
    > 「既に使用されているキーを持つエンティティは追加できません。」というエラーはDB側の主キー違反とは別物だと思います。

    DBが主キーを持っていることを忖度し、
    db.Studentがdeleteされたことを知らずにエラーを
    出しているんだと思います。

    例えば、not null制約がある列にDB側のトリガーで
    値を設定しているのにDB側に行く前にnot nullで
    エラーになったりします。

    db.Studentを再読込のような最新にする方法があると思うのですが…
記事No.85784 のレス /過去ログ147より / 関連記事表示
削除チェック/

■85827  Re[4]: LINQ to SQL:
□投稿者/ WebSurfer -(2017/11/28(Tue) 12:26:48)
    No85824 (ぬる さん) に返信

    > ExecuteCommandのDeleteは間にSelectを入れて正常に削除されていることを確認しています。
    > Linqでも生SQLでも、Delete→Selectは問題ないです。
    > データが削除されていないとすればDB側で主キー違反になりますが、
    > 「既に使用されているキーを持つエンティティは追加できません。」というエラーはDB側の主キー違反とは別物だと思います。

    ということは、また想像が入ってますが、

    (1) Linq to Entity の場合、編集・更新操作を行うには対象となるレコードのエンティティオブジェクトの
      状態を、登録なら Added、編集なら Modified、削除なら Deleted としてマークし、DbContext.SaveChanges
      メソッドを適用します。(これは想像ではありません)

    (2) ここからは想像が入っていますが、Linq to SQL でも (1) と同様であろうと思われます。

    (3) ところが、ExecuteCommand("delete ...") では当該エンティティに Deleted マークは付かない。なので、
      db.SubmitChanges メソッドは意味がない。でも、SQL Server の当該レコードは削除される。

    (4) コンテキスト db は上記 (3) の操作は知らない。当該エンティティの状態は Deleted にはなっていない。
      Unchanged のまま。

    (5) その状態で、db.Student.InsertOnSubmit で新たに Id = 1 の Student エンティティをコンテキスト db
      に追加(そのエンティティの状態は Added になる)。

    (6) 結果、Id = 1 で Unchanged マークがついたエンティティと、同じく Id = 1 で Added マークがついた
      エンティティの両方がコンテキストに存在することになる。

    (7) db.SubmitChangesで「既に使用されているキーを持つエンティティは追加できません」という結果になる。

    ・・・ということであろうと思われます。(furu さんの No85825 もそのことを言われていると思います)

    上記の想像が当たっていれば、以下のようにすればよさそうです。

    (a) 上記 (5) で InsertOnSubmit に代えて ExecuteCommand("insert ...") を使う、or

    (b) furu さんの言われるようにコンテキストにアタッチされるエンティティを最新のものにしてから
      db.Student.InsertOnSubmit ⇒ db.SubmitChanges を行う。
記事No.85784 のレス /過去ログ147より / 関連記事表示
削除チェック/

■85831  Re[4]: LINQ to SQL:
□投稿者/ WebSurfer -(2017/11/28(Tue) 14:36:01)
    No85824 (ぬる さん) に返信
    
    想像するばかりでは何なので No85827 で書いたことが正しいかどうか実際にコードを
    書いて検証してみました。
    
    DataContext にアタッチされたエンティティの状態を調べる方法が分からなかったので、それは調べ
    ていませんが、 No85827 で書いた、
    
    (a) 上記 (5) で InsertOnSubmit に代えて ExecuteCommand("insert ...") を使う、or
    
    (b) furu さんの言われるようにコンテキストにアタッチされるエンティティを最新のものにしてから
      db.Student.InsertOnSubmit ⇒ db.SubmitChanges を行う。
    
    ・・・で期待通りの結果になることは確認できました。なので、No85827 で書いた想像は当たっている
    のではないかと思います。
    
    ちなみに検証に使ったコードは以下の通りです。
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleAppLinqToSQL
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (var db = new DataClasses1DataContext())
                {
                    var query = from item in db.Table
                                select item;
    
                    foreach (Table table in query)
                    {
                        Console.WriteLine("Id={0}, Name={1}, Price={2}", table.Id, table.Name, table.Price);
                    }
    
                    db.Table.InsertOnSubmit(new Table() { Id = 15, Name = "ABCDEF", Price = 100 });
                    db.SubmitChanges();
    
                    db.ExecuteCommand("delete from [Table] where Id = 15");
                    // 以下のコードは意味なし ⇒ コメントアウト
                    //db.SubmitChanges();
    
                    // これは SubmitChanges でエラー
                    //db.Table.InsertOnSubmit(new Table() { Id = 15, Name = "ACB", Price = 100 });
                    //db.SubmitChanges();
    
                    // これは OK
                    db.ExecuteCommand("insert into [Table] (Id,Name,Price) values (15,'newABC',200)");
                }
    
                // 上の db.ExecuteCommand("insert ..."); に代えて以下のようにしても OK 
                //using (var db = new DataClasses1DataContext())
                //{
                //    db.Table.InsertOnSubmit(new Table() { Id = 15, Name = "newABC", Price = 200 });
                //    db.SubmitChanges();
                //}
            }
        }
    }
記事No.85784 のレス /過去ログ147より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -