waniwanisan
@waniwanisan

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

シーケンス取得 登録ボタンを押すとデータグリッドビューとpostgresテーブルにデータ保存

解決したいこと

シーケンス取得(シーケンス名'pgsqlseq1')

テーブル保存

データグリッドビュー保存で実装しているがシーケンス取得をC#上でどう取得するかアドバイスお願いいたします。

現状、テーブルにデータを追加するとシーケンスが発行されるがデータグリッド側の登録が上手くいかない。

発生している問題・エラー

・//DataTebleにデータを追加するの第七引数には現状1を置いており、このまま登録しても一意性制限で弾かれるのでシーケンスを取得して1を変更したい。

・NpgsqlCommand command = new NpgsqlCommand("insert into information values (nextval('pgsqlseq1'),:y, :b, :c, :d, :this.mail.Text,

現状、これはシーケンスの取得ではなく発行なのでシーケンス取得と同時に直したい。

該当するソースコード

```postgres C#
private void addButton_Click(object sender, EventArgs e)
{

        // フォームの入力チェック
        if (!isFormCheck())
        {
            MessageBox.Show("氏名を入力してください!!");
            return;
        }
        //denwaDataGrid.RowHeadersVisible = false;

        //string a = this.myouji.Text + this.namae.Text;

        string b = "";

        if (radioButton1.Checked == true)
        {
            b = this.radioButton1.Text;
        }
        else if (radioButton2.Checked == true)
        {
            b = this.radioButton2.Text;
        }

        string c = "";
        if (this.year.Text != "" && this.month.Text != "" && this.day.Text != "")
        {
            c = this.year.Text + "年" + this.month.Text + "月" + this.day.Text + "日";
        }

        string d = "";
        if (this.phone1.Text != "" && this.phone2.Text != "" && this.phone3.Text != "")
        {
            d = this.phone1.Text + "-" + this.phone2.Text + "-" + this.phone3.Text;
        }

        string x = "";
        if (this.postalCode1.Text == "" || this.postalCode2.Text == "")
        {
            x = this.areaBox.Text + this.city.Text + this.town.Text;

        }
        else if (this.postalCode1.Text != "" && this.postalCode2.Text != "")
        {
            x = this.postalCode1.Text + "-" + this.postalCode2.Text + this.areaBox.Text + this.city.Text + this.town.Text;
        }

        string y = this.myouji.Text + this.namae.Text;

        //https://okwave.jp/qa/q5746298.html 参考文献C#からinsert実行

        /*var connString = "Host=localhost;Port=5432;Username=postgres;Password=uw72qdet;Database=denwachou";
        var cmd = new NpgsqlCommand("insert into information values (this.myouji.Text + this.namae.Text, b, c, d, this.mail.Text, x)", conn);
            */

        NpgsqlConnection conn = new NpgsqlConnection
        ("Host=localhost;Port=5432;Username=postgres;Password=uw72qdet;Database=denwachou");

        ここでシーケンスを取得?

        NpgsqlCommand command = new NpgsqlCommand("insert into information values (nextval('pgsqlseq1'),:y, :b, :c, :d, :this.mail.Text, :x)", conn);

        command.Parameters.Add(new NpgsqlParameter("y", y));
        command.Parameters.Add(new NpgsqlParameter("b", b));
        command.Parameters.Add(new NpgsqlParameter("c", c));
        command.Parameters.Add(new NpgsqlParameter("d", d));
        command.Parameters.Add(new NpgsqlParameter("this.mail.Text", this.mail.Text));
        command.Parameters.Add(new NpgsqlParameter("x", x));

        conn.Open();
        command.ExecuteNonQuery();

        //DataTebleにデータを追加する
        denwaDataSet.denwaDataTable.AdddenwaDataTableRow(
            y,
            b,
            c,
            d,
            this.mail.Text,
            x,
            1 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            );


    }
0

2Answer

一旦、シーケンスで採番した値を取得すれば良いのではないでしょうか?

シーケンス取得(シーケンス名'pgsqlseq1')
select nextval('pgsqlseq1')
0Like

Comments

  1. @waniwanisan

    Questioner

    上記のコードはサイトを漁っていたので分かりますが具体的なコードで記していただけないでしょうか?

上記のコードはサイトを漁っていたので分かりますが具体的なコードで記していただけないでしょうか?

Npgsqlの使い方は、別途調べて頂ければと思いますが...
一応下記に、サンプルを記載しておきます。

シーケンス取得(抜粋)
var da = new NpgsqlDataAdapter(@"select nextval('pgsqlseq1')", conn);
var ds = new DataSet();

da.Fill(ds);

// ds.Tables[0].Rows[0][0] でシーケンスの値が取得できます
0Like

Comments

  1. @waniwanisan

    Questioner

    ```
    DataSet ds = new DataSet();
    NpgsqlCommand cmd = new NpgsqlCommand("select nextval('pgsqlseq1')", conn);
    NpgsqlDataAdapter adapter = new NpgsqlDataAdapter();
    adapter.SelectCommand = cmd;
    adapter.Fill(ds);
    int user_id = Convert.ToInt32(ds.Tables[0].Rows[0][0].ToString());
    ```
    少し長くなってしまったがYamazin様のサンプルを参考に何とか更新されたシーケンスをint型として持たせることに成功しました。
    ありがとうございます。

Your answer might help someone💌