2012-02-03 26 views
0

ユーザーがフォームを完了すると、一度に5レコードまでを完了できます。挿入コードに必要な数のIDを挿入するにはどうすればよいですか?

ユーザーが1つのレコードを完了した場合、1

によるIDの増分はしかし、ユーザーが1つの以上のレコードを完了したとき、私たちは、ユーザーが完了したとして、IDができるだけ多くのレコードずつ増加すると予想。例えば

、のは、ID 2516を持つユーザーが3つのレコードを完了し、私たちのようなものを見ることを期待するとしましょう:

ID User 
1  2516 
2  2516 
3  2516 

4874のIDで別のユーザーが2を完了した場合、我々は次のようになります。

ID User   
4 4874 
5 4874 

など

代わりに、特定のユーザーが入力した新レコードの数にかかわらず、IDの値は1だけインクリメントされます。

私はこれが以下のコードに基づいていることを知っています。

特定のユーザーが送信するレコード数に基づいて値が増えるように修正してもらえますか。

IDシードを使用してそれを増やすことは望ましくありません。

いつものように、あなたの助けが非常に高く評価されます。

sql += "INSERT INTO Emp (UserSequence, employee_id, charity_code, check_amt, chcknum, one_time, bi_weekly, cash, donate_choice, date_stamp) " 
       sql += "VALUES ((select isNull(max(UserSequence), 0) + 1, '" & Replace(employee_idLabel.Text, "'", "''") & "','" & Replace(dedval.SelectedValue, "'", "''") & "','" & Replace(chckval.Text, "'", "''") & "','" & Replace(chcknumval.Text, "'", "''") & "','" & Replace(onetimeval.Text, "'", "''") & "','" & multival.Text & "','" & Replace(cashval, "'", "''") & "','" & Replace(donatechoice.SelectedItem.Value, "'", "''") & "','" & Replace(datestamp, "'", "''") & "');" 
+0

何らかの理由で問題が解決されないストアドプロシージャはありますか?挿入されたレコードごとに(IDの他に)値が同じになるようです。 1つのパラメータとして挿入するレコードの量と、それ以外のすべての値を独自のパラメータとしてprocに渡す方が効率的です。 –

+0

現在のMAX(ID)を選択してID(列)の値を作成しないでください。ただし、データベースでIDENTITYを使用するようにしてください。未チェックのユーザー入力を連結して挿入ステートメントを作成しないでください。 – Filburt

答えて

1

これはあなたのビジネスロジックです。 は、私はあなたにfollowin構造

create table myTable (
    int UserId not null, 
    int myTableId int identity(1,1) primary key, 
    int UserSequence int not null 
) 

をお勧めしますし、このようなステートメントを挿入するだろう。

insert into myTable (UserId, UserSequence) values 
(10, (select isNull(max(UserSequence), 0) + 1 from myTable where UserId=10)) 

これはまさにあなたが必要とするものです。プライマリキーをそのままの状態にしておきますが、ビジネスロジックに役立つ別の列を追加します。

EDIT

ところで、あなたのVB.Codeは非常に面倒になります。

  1. 文字列の連結を使用しないでください。それは危険です。 (間違ったSQL、最悪の場合のSQLインジェクションについての最良の例外)
  2. いくつかのORMを見てみましょう。それは大きくあなたのためのSQLの負担の多くを処理します。個人的には、Entity Frameworkをお勧めします。

ORMを使用すると、コードは次のようになります。

Dim dc As New MyDatabaseContext 
Dim records = dc.Recors.Where(Function(x) x.UserId = 10) 
Dim last as Integer = 0 
If records.Count > 0 Then last = records.Max(Function(x) x.UserSequence) 
Dim instance As New Record With { 
    .UserId = 10, 
    .UserSequence = last + 1 
} 
dc.Records.Add(instance) 
dc.SaveChanges() 
+0

今すぐ最高の答えを+1してください。 – Filburt

+0

ORMの使用を軽視しないでください。多くのユースケースでは、パラメータ化されたクエリを使用するだけで十分です。 –

+0

@ Meta-Knightどうしてですか?小規模なプロジェクトをお持ちの場合は、プロジェクトが大規模であれば、パフォーマンス低下なしで大幅に開発が向上し、このSQLをすべて生成し、パラメータがあなたを食うでしょう。 (独自の経験。私はT'SQLの約200個のストアドプロシージャを個人的に書いています)*新しいテクノロジ*を利用して、非常に特殊な場合にはプレーンSQLを残してください。 – Oybek

2

ID列をIDENTITY列にします。これにより、自動的に各行に増分IDが割り当てられますので、自分で気にする必要はありません(つまり、insert文で列を指定する必要さえない)。

自分で複数のユーザーが同時に挿入しようとする場合は特に、痛みの世界で終了する場合がありインクリメントIDを維持しようとすると
CREATE TABLE Example 
(
ID INTEGER IDENTITY(1,1), 
employee_id INTEGER 
) 

INSERT Example (employee_id) VALUES (2516) -- Gets ID=1 
INSERT Example (employee_id) VALUES (2516) -- Gets ID=2 

+0

ご連絡ありがとうございます。AdaTheDev。私はすでに、それをアイデンティティの列にしたくないと言っていました。その理由は、ごみ箱と呼ばれるものを作成したからです。つまり、データが削除されると、このRecycleBinテーブルに移動します。ユーザーは、データが誤って削除されたと感じる場合、データを復元できます。私たちがこの作業を行う唯一の方法は、EmpテーブルのIDをIDカラムにしないことです。 –

+0

@ChidiOkehあなたの問題の原因は、アイデンティティまたは鍵が(ビジネス)意味を持たないデータベース設計原則に違反していることです。 Oybekは、おそらくあなたのデザインをリファクタリングする最良のソリューションを提供します。 – Filburt

+3

@ChidiOkeh - 謝罪、私はそれを読むことに失敗しました。しかし、私はまだIDENTITY列を使用することをお勧めしますが、 "削除"時にRecycleBinテーブルに移動する代わりに、レコードが削除されたことを示すために設定できる "ステータス"フラグがあります。この方法では、フラグを元に戻すだけです。 – AdaTheDev

0

このコードは、別のプロセスがあなたのSELECTとINSERTの間で実行されるどのような場合には、安全ではないでしょうか?あなたがIDSを心配する必要はありません自動インクリメント/シーケンスフィールドを使用することができれば当然の

INSERT INTO table EMP (ID, ...) VALUES ((SELECT MAX(ID)+1 FROM EMP), ...); 

:あなたは、SQLと同じショットでのことを行うことができます。

+0

オイベック、私はあなたの提案を試みます。それは十分に論理的だと思われる。まもなく皆さんにお知らせします。あなたが言う、安全ではない、あなたはオイベックのコードを指しているのですか?あなたのものは –

+0

です。コンピューティング - INSERTを選択していますが、コンピューティング中に他のユーザーがMAX(ID)選択を無効にすることがあります。 – vulkanino

+0

皆さんの素晴らしいフィードバックをお寄せいただきありがとうございます。次のエラーが表示されます。サブクエリはこのコンテキストでは許可されていません。 Oybekのコードでは、スカラー式しか使用できません。上記のコードを私が今問題があるもので更新しました。 –

関連する問題