質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
LINQ to SQL

LINQ to SQLは.NET Framework 3.5のコンポーネントで、リレーショナル データをオブジェクトとして管理するためのランタイム インフラストラクチャを提供します。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

2126閲覧

SQL Serverのレコードを更新したい。

inusuke

総合スコア10

LINQ to SQL

LINQ to SQLは.NET Framework 3.5のコンポーネントで、リレーショナル データをオブジェクトとして管理するためのランタイム インフラストラクチャを提供します。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2018/12/13 07:58

編集2018/12/13 08:25

レコードの更新を行いたい

SQL Serverのレコードを更新するサブルーチンを作成しています。
変更したいSQL Server側のフィールドはbit型です。
更新するレコードは1件だけになります。

発生している問題・エラーメッセージ

フィールドの値が書き変わらない。

該当のソースコード

Visual

1 Private Sub SwitchMissField(ByVal wPersonalID As Integer, ByVal wPassID As String) 2 Dim ent As New DataClasses1DataContext 3 Dim t = From p In ent.Entrant Where p.PersonalID = wPersonalID And p.PasscardID = wPassID 4 5 If t.Count = 1 Then 6 'debug.print("1>" & t.First.Miss) 7 t.First.Miss = If(t.First.Miss = True, False, True) 8 'debug.print("2>" & t.First.Miss) 9 ent.SubmitChanges() 10 End If 11 End Sub

試したこと

Missフィールドに直接値を入れてみましたが、書き変わりませんでした。
値を入れる直前と直後に出力して確認しました。
また、レコード内の別のnvarchar(50)のフィールドに値を入れても、同じようにフィールドの内容に変化はありませんでした。こちらも値の代入直前、直後で出力して確認してあります。

SQL Server Management Studioから直接書き換えることで、値の変更が可能であることは確認済みです。

追加情報

更新したいテーブルの主キーが設定してなかったので、idフィールドを主キーにしてみました。
結果、状況に変化はありませんでした。
データベース側の設定の可能性もあると思うので、そちらも調べてみます。

補足情報(FW/ツールのバージョンなど)

Visual Studio 2017 (ver 15.9.4)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/12/13 08:52

Linq to SQL ですか? 保守とかで使わざるを得ない状況なんでしょうか? まだ Obsolete になったわけではないようですが、それに近いところにあるというのが自分の認識で、新しい開発であれば Linq to Entities を使った方がよさそうだと思うのですが・・・
inusuke

2018/12/13 09:01

ご提案ありがとうございます。 既存システムの改修のため、今のところLinq to SQLで進める方針です。 新規システムであれば、Linq to Entitesを採用したいと思います。
guest

回答2

0

自己解決

原因

前置き

これが正解と推測していますが、テストコードで確認したわけではありません。

Entrantテーブルに主キーが設定してなかった。
追加情報として、主キーを設定しましたと記載しました。
その際、DataSet.xsdにあるEntrantテーブルを削除し、サーバエクスプローラーから再度追加まで行いました。
しかし、さらにDataClass.dbmlにあるEntrantテーブルを削除し、さらに追加することを行っておりませんでした。
そのため、主キーの情報は無いものとして扱われていたようです。

解決方法

すでに示してありますが、

  1. SQL Server Management StudioにてEntrantテーブルにあるidフィールドを主キーに設定
  2. DataSet.xsdにあるEntrantテーブルを削除して、サーバエクスプローラーから追加
  3. DataClass.dbmlにあるEntrantテーブルを削除して、サーバエクスプローラーから追加

ソースコード側には何も問題がなく、主キーが未設定であったことと、設定ファイルの更新不足であることが原因と思われます。

投稿2018/12/13 09:31

inusuke

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

selectして、エンティティの値を変えてコミットしてるだけなので
update文がいるのでは…?

投稿2018/12/13 08:02

yy_tn

総合スコア299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

inusuke

2018/12/13 08:21

ご回答ありがとうございます。 updateが必要では、とのことで調べてみました。 Linq to SQL オブジェクトのメンバーの値を変更して、SubmitでOKなようです。 動作確認はしていませんが、以下のページにサンプルコードがありました。 ご興味を持っていただき、ありがとうございました。 https://docs.microsoft.com/ja-jp/dotnet/framework/data/adonet/sql/linq/how-to-update-rows-in-the-database
yy_tn

2018/12/13 08:52

そうなんですね。失礼致しました…。 ちょっと調べたところ主キーが設定されてないと…的なのが引っかかるのですが PersonalIDが主キーですかね?
inusuke

2018/12/13 09:05

テーブル的にすべてを表記せず、申し訳ありませんでした。 別フィールドで id があり、それが主キーになっています。また、idの値は自動で増加するように設定してあります。 実際の動作としては、新規レコードの追加と、既存レコードのMissフィールドの書き換えを行います。 新規レコードを追加するルーチンに関しては、動作確認も完了しています。
inusuke

2018/12/13 09:32

自己解決しました。 こちらの設定に不備があったための動作不良でした。 貴重なお時間を取らせたこと、お詫び申し上げます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問