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

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

ただいまの
回答率

88.33%

ADO.NETでのUpdate方法のより良い方法

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,044

FacePanel

score -4

下記のように、DataTableのUpdateTimeカラムの値をADO.NETの非接続方式でnullにしたいと思っていますが、なにぶん初心者で、より良い、あるいは正しい方法を提示していただけるとありがたいと思っています。

内容は、すでに質問させていただきました下記の続きとお考えください。
https://teratail.com/questions/150584

開発環境はMicrosoft Visual Studio Community 2017 Version 15.8.4 です。
一旦、解決済みにしてしまいましたが、実際は未解決でした。
また、非接続型を選択する理由は、その他の処理がすべて非接続型であって、統一性を維持するためです。

全く分かっていないとの正直なお言葉を頂いており、この場を借りて少し勉強したいと思っています。
基本的なADO.NETの非接続による方法に則っているかという点を考慮してお答えいただけますようお願いします。

        public void DeleteUpdateTime(DataTable table)
        {
            string sTable = table.TableName;
            using (SqlConnection conn = new SqlConnection(GetConnectionString(databasename)))
            using (SqlDataAdapter da = new SqlDataAdapter(SelectTable(sTable), conn))
            {
                cmd = new SqlCommand("UPDATE Articles SET UpdateTime = null;", conn);

                da.UpdateCommand = cmd;

// ほんとは、ループでなく一括で処理したいけど(WHERE句で変更行を絞っているので、まあいいのかも)
                foreach(DataRow row in table.Rows)
                {
                    row["UpdateTime"] = DBNull.Value;
                }
                da.Update(table);
            }
        }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • FacePanel

    2018/10/08 16:13

    cmd = new SqlCommand("UPDATE Articles SET UpdateTime = null;", cnNote);は、問題ないかと思います。

    キャンセル

  • SurferOnWww

    2018/10/08 16:23

    そう思うなら他人に聞かないで我が道を歩けばいいのでは? 話を聞く気はないようなので 自分は撤退します。悪しからず。

    キャンセル

  • FacePanel

    2018/10/08 18:06

    あれ?cmd = new SqlCommand("UPDATE Articles SET UpdateTime = null;", conn);を外すと処理できませんよ???

    キャンセル

回答 2

+1

回答ではなくて提案です。提案に沿ってやってもらえると、その先の Q&A で話がスムーズに伝わると思います。

「非接続型」にこだわるのであれば、Visual Studio のウィザードを使って定番の「非接続型データアクセス」の Windows Forms 構成のアプリを作って、それをベースに話をした方がよさそうです。

DB が SQL Server であれば、以下のチュートリアル、

チュートリアル : データベースへのデータの保存 (単一テーブル)
https://msdn.microsoft.com/ja-jp/library/0f92s97z(v=vs.120).aspx

10 行でズバリ !! 非接続型のデータ アクセス (ADO.NET) (C#)
https://code.msdn.microsoft.com/windowsdesktop/10-ADONET-C-cbfe7688

・・・のように Visual Studio のデータソース構成ウィザードを利用して型付 DataSet + TableAdapter を作って、それを利用してアプリを作ると、以下のページの図のような構造のアプリが、ほとんど自分でコードを書くこと無しに作れます。

Windows フォーム アプリケーションでのデータへの接続
https://msdn.microsoft.com/ja-jp/library/wxt2cwcc(v=vs.120).aspx

前者のチュートリアルの「単一テーブル」の場合なら、操作に慣れれば 5 分もかからず作れます。慣れなくれも 1 時間もかからないと思います。やってみてください。

それをベースに、DataGridView に表示されているある列の全行を、SQL Server DB のテーブルの当該レコードで NULL にするにはどうすべきかを考えてみるのが良いと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/21 14:04

    いまさらながらではありますが、ありがとうございます。
    ちょっと、むずかしかったですが、やっと理解し始めました。

    キャンセル

check解決した方法

0

やっと、こんな感じで実現しました。
自分で言うのもなんですが、この程度でも実現するのに大変でした。
サイトを探しても、なかなか思うように適合するものが見つけにくいのが現状でした。
MySqlDataAdapter.UpdateCommand Property
https://dev.mysql.com/doc/dev/connector-net/8.0/html/P_MySql_Data_MySqlClient_MySqlDataAdapter_UpdateCommand.htm
というのを見つけて、初めてそれらしいことが出来ましたが、このような作業は、私のような初心者には非常に難しいというのが、感想です。

private void UpdateData(SqlConnection sConn, DataTable tAtc)
{
SqlDataAdapter da = new SqlDataAdapter();
SqlCommand cmd;
SqlParameter parm;

sSelect = "SELECT * FROM Articles WHERE ID = @oldID";

cmd = new SqlCommand(sSelect, sConn);

da.SelectCommand = cmd;

cmd = new SqlCommand("UPDATE Articles SET Source = @Source WHERE ID = @oldID", sConn);
parm = cmd.Parameters.AddWithValue("@Source", SourceBox.Text);
parm = cmd.Parameters.AddWithValue("@oldID", Convert.ToInt32(IdBox.Text));

parm.SourceVersion = DataRowVersion.Original;

da.UpdateCommand = cmd;

SqlParameter parameter = new SqlParameter(cmd.Parameters.ToString(), cmd);
parameter.SourceColumn = StrArticleID;
parameter.SourceVersion = DataRowVersion.Original;
da.UpdateCommand = cmd;

try
{
sConn.Open();
cmd.ExecuteNonQuery();
da.Update(tAtc);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

でも、今回とてもためになりました。
参考サイトをご紹介くださった皆様に感謝しています。
あっ、これだと、row["UpdateTime"] = DBNull.Valueがないですが、
上記のコードのparm =のところに入れればいいようです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る