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

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

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

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Q&A

解決済

1回答

9171閲覧

Insert時に現在のIDの最大値+1を設定したい

tryCSharp

総合スコア29

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

0グッド

0クリップ

投稿2019/01/15 02:15

編集2019/01/15 06:15

前提・実現したいこと

Insert時にIDというフィールドへ現在のIDの最大値+1を設定したい。

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

登録時にユーザー毎に取れているMAX(ID)が異なっているためか順番通りに登録されていない。

該当のソースコード(登録部分のみ抜粋して記載します。)

C#

1protected void RegistButton_Click(object sender, EventArgs e) 2{ 3 try 4 { 5 using (OleDbConnection cn = new OleDbConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString2"].ConnectionString)) 6 { 7 OleDbCommand cmd = new OleDbCommand(); 8 OleDbTransaction trn = null; 9 OleDbDataReader dr = null; 10 11 try 12 { 13 cn.Open(); 14 trn = cn.BeginTransaction(); 15 16 cmd.Connection = cn; 17 cmd.Transaction = trn; 18 19 cmd.CommandText = "SELECT MAX(ID) + 1 FROM TABLE1"; 20 dr = cmd.ExecuteReader(); 21 22 string strMaxID; 23 dr.Read(); 24 if (dr[0].ToString() != "") 25 { 26 strMaxID = dr[0].ToString(); 27 } 28 else 29 { 30 strMaxID = "19000001"; 31 } 32 33 dr.Close(); 34 35 string strCmd = "INSERT INTO TABLE1(ID, Column1, Column2) "; 36 strCmd += "VALUES(" + strMaxID + ", 'カラム1', 'カラム2'); 37 38 cmd.CommandText = strCmd; 39 cmd.ExecuteNonQuery(); 40 trn.Commit(); 41 42 ClientScript.RegisterStartupScript(this.GetType(), "registmessage", "<script type='text/javascript'>alert('登録しました。'); location.href=location.href;</script>"); 43 } 44 catch (Exception ex) 45 { 46 string strErrMsg = "登録に失敗しました。\n" + ex.Message.Replace("\"", "'").Replace("\r\n", "\n"); 47 ClientScript.RegisterStartupScript(this.GetType(), "errormessage", "<script type='text/javascript'>alert('" + strErrMsg + "');</script>"); 48 trn.Rollback(); 49 } 50 } 51 } 52 catch (Exception ex) 53 { 54 string strErrMsg = "登録に失敗しました。\n" + ex.Message.Replace("\"", "'").Replace("\r\n", "\n"); 55 ClientScript.RegisterStartupScript(this.GetType(), "errormessage", "<script type='text/javascript'>alert('" + strErrMsg + "');</script>"); 56 } 57}

試したこと

MySQLでは出来たという記憶があったのでOracleにてInsertと同時に SELECT MAX(ID) + 1 FROM TABLE1 が出来ないか調査しましたがOracleでは出来ないようでした。
なお、IDは管理者が変更したい要望がある為、シーケンスを使用することは出来ません。

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

開発環境は以下のようになります。
Oracle: Oracle 11g
サーバーOS:Windows Server 2012
クライアントOS:Windows7
.NET:4.0
サーバーIIS:8.0
クライアントIIS:10.0 Express
Visual Studio:2015 Community

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/01/15 02:50

ASP.NET とは直接の関係はないようですが、であれば ASP.NET のタグは外していただくようお願いします。
退会済みユーザー

退会済みユーザー

2019/01/15 02:54

ID は文字列型のようですが、MAX(ID) はともかくとして(それでも桁数がすべてのレコードで同じでないと望む結果は得られないと思いますが)、MAX(ID) + 1 というような整数型のように扱うのは Oracle では有効なのでしょうか? Oracle はほとんど知らないので、的外れな質問かもしれませんが、そうであったらすみません。
tryCSharp

2019/01/15 03:11

申し訳ございません。 ASP.NETのタグは外しました。 調査不足で申し訳ございませんでした。私のやりたいことは実現することが出来ました。
guest

回答1

0

ベストアンサー

OracleにてInsertと同時に

SELECT MAX(ID) + 1 FROM TABLE1 が出来ないか調査しましたがOracleでは出来ないようでした。

できるはずですが?質問にCREATE TABLE と共にINSERT SELECT と実行結果を提示しては?

投稿2019/01/15 02:31

Orlofsky

総合スコア16415

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

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

tryCSharp

2019/01/15 02:46

調査不足で申し訳ございません。 INSERT INTO TABLE1("ID", "COLUMN1", "COLUMN2") VALUES((SELECT MAX(ID) + 1 FROM TABLE1), 'カラム1', 'カラム2') で出来ました(T_T)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問