私はこのコードを持っています:
string insertSql =
"INSERT INTO aspnet_GameProfiles(UserId,GameId) VALUES(@UserId, @GameId)";
using (SqlConnection myConnection = new SqlConnection(myConnectionString))
{
myConnection.Open();
SqlCommand myCommand = new SqlCommand(insertSql, myConnection);
myCommand.Parameters.AddWithValue("@UserId", newUserId);
myCommand.Parameters.AddWithValue("@GameId", newGameId);
myCommand.ExecuteNonQuery();
myConnection.Close();
}
このテーブルに挿入すると、GamesProfileId
という名前のauto_increment int主キー列があります。このIDを使用して別のテーブルに挿入できるように、最後に挿入されたものを取得するにはどうすればよいですか?
SQL Server 2005+の場合、挿入トリガーがない場合は、挿入ステートメント(すべて1行、ここではわかりやすくするために分割)をこれに変更します。
INSERT INTO aspnet_GameProfiles(UserId,GameId)
OUTPUT INSERTED.ID
VALUES(@UserId, @GameId)
SQL Server 2000の場合、または挿入トリガーがある場合:
INSERT INTO aspnet_GameProfiles(UserId,GameId)
VALUES(@UserId, @GameId);
SELECT SCOPE_IDENTITY()
その後
Int32 newId = (Int32) myCommand.ExecuteScalar();
CommandText
が等しいコマンドを作成できます
INSERT INTO aspnet_GameProfiles(UserId, GameId) OUTPUT INSERTED.ID VALUES(@UserId, @GameId)
そしてint id = (int)command.ExecuteScalar
を実行します。
この MSDNの記事 により、いくつかの追加のテクニックが得られます。
string insertSql =
"INSERT INTO aspnet_GameProfiles(UserId,GameId) VALUES(@UserId, @GameId)SELECT SCOPE_IDENTITY()";
int primaryKey;
using (SqlConnection myConnection = new SqlConnection(myConnectionString))
{
myConnection.Open();
SqlCommand myCommand = new SqlCommand(insertSql, myConnection);
myCommand.Parameters.AddWithValue("@UserId", newUserId);
myCommand.Parameters.AddWithValue("@GameId", newGameId);
primaryKey = Convert.ToInt32(myCommand.ExecuteScalar());
myConnection.Close();
}
この悪魔の仕事:)
純粋なSQLでは、メインステートメントは次のようにクールです。
INSERT INTO [simbs] ([En]) OUTPUT INSERTED.[ID] VALUES ('en')
角括弧はテーブルsimbsを定義し、次に列EnとIDを定義し、丸括弧は開始する列の列挙を定義し、次に列の値、この場合は1列と1値を定義します。アポストロフィは文字列を囲みます
私のアプローチを説明します。
理解するのは簡単ではないかもしれませんが、最後に挿入されたIDを使用して全体像を把握できると便利です。もちろん、より簡単な代替アプローチがあります。しかし、私は私を維持する理由があります。関連する関数は含まれず、名前とパラメーター名のみが含まれます。
このメソッドは、医療用人工知能に使用します。このメソッドは、必要な文字列が中央テーブルに存在するかどうかをチェックします(1)。必要な文字列が中央テーブル「simbs」にない場合、または重複が許可されている場合、必要な文字列は中央テーブル「simbs」に追加されます(2)。最後に挿入されたIDは、関連付けられたテーブルを作成するために使用されます(3)。
public List<int[]> CreateSymbolByName(string SymbolName, bool AcceptDuplicates)
{
if (! AcceptDuplicates) // check if "AcceptDuplicates" flag is set
{
List<int[]> ExistentSymbols = GetSymbolsByName(SymbolName, 0, 10); // create a list of int arrays with existent records
if (ExistentSymbols.Count > 0) return ExistentSymbols; //(1) return existent records because creation of duplicates is not allowed
}
List<int[]> ResultedSymbols = new List<int[]>(); // prepare a empty list
int[] symbolPosition = { 0, 0, 0, 0 }; // prepare a neutral position for the new symbol
try // If SQL will fail, the code will continue with catch statement
{
//DEFAULT und NULL sind nicht als explizite Identitätswerte zulässig
string commandString = "INSERT INTO [simbs] ([En]) OUTPUT INSERTED.ID VALUES ('" + SymbolName + "') "; // Insert in table "simbs" on column "En" the value stored by variable "SymbolName"
SqlCommand mySqlCommand = new SqlCommand(commandString, SqlServerConnection); // initialize the query environment
SqlDataReader myReader = mySqlCommand.ExecuteReader(); // last inserted ID is recieved as any resultset on the first column of the first row
int LastInsertedId = 0; // this value will be changed if insertion suceede
while (myReader.Read()) // read from resultset
{
if (myReader.GetInt32(0) > -1)
{
int[] symbolID = new int[] { 0, 0, 0, 0 };
LastInsertedId = myReader.GetInt32(0); // (2) GET LAST INSERTED ID
symbolID[0] = LastInsertedId ; // Use of last inserted id
if (symbolID[0] != 0 || symbolID[1] != 0) // if last inserted id succeded
{
ResultedSymbols.Add(symbolID);
}
}
}
myReader.Close();
if (SqlTrace) SQLView.Log(mySqlCommand.CommandText); // Log the text of the command
if (LastInsertedId > 0) // if insertion of the new row in the table was successful
{
string commandString2 = "UPDATE [simbs] SET [IR] = [ID] WHERE [ID] = " + LastInsertedId + " ;"; // update the table by giving to another row the value of the last inserted id
SqlCommand mySqlCommand2 = new SqlCommand(commandString2, SqlServerConnection);
mySqlCommand2.ExecuteNonQuery();
symbolPosition[0] = LastInsertedId; // mark the position of the new inserted symbol
ResultedSymbols.Add(symbolPosition); // add the new record to the results collection
}
}
catch (SqlException retrieveSymbolIndexException) // this is executed only if there were errors in the try block
{
Console.WriteLine("Error: {0}", retrieveSymbolIndexException.ToString()); // user is informed about the error
}
CreateSymbolTable(LastInsertedId); //(3) // Create new table based on the last inserted id
if (MyResultsTrace) SQLView.LogResult(LastInsertedId); // log the action
return ResultedSymbols; // return the list containing this new record
}
同じニーズがあり、この答えが見つかりました..
これにより、会社のテーブル(comp)にレコードが作成され、会社のテーブルに作成された自動IDを取得し、スタッフテーブル(スタッフ)にドロップして、2つのテーブルをリンクできるようにします。私のSQL 2008 DBで動作し、SQL 2005以上で動作するはずです。
===========================
CREATE PROCEDURE [dbo].[InsertNewCompanyAndStaffDetails]
@comp_name varchar(55) = 'Big Company',
@comp_regno nchar(8) = '12345678',
@comp_email nvarchar(50) = '[email protected]',
@recID INT OUTPUT
-'@ recID'は、取得しようとしている会社の自動生成ID番号を保持するために使用されます
AS
Begin
SET NOCOUNT ON
DECLARE @tableVar TABLE (tempID INT)
-上記の行は、後で使用するために自動生成されたID番号を保持する一時テーブルを作成するために使用されます。フィールドは「tempID」のみで、そのタイプINTは'@ recID'と同じです。
INSERT INTO comp(comp_name, comp_regno, comp_email)
OUTPUT inserted.comp_id INTO @tableVar
-上記の 'OUTPUT Inserted。'行は、現在作成中のレコードのフィールドからデータを取得するために使用されます。必要なこのデータはID自動番号です。テーブルの正しいフィールド名が'comp_id'であることを確認してください。これは、先ほど作成した一時テーブルにドロップされます。
VALUES (@comp_name, @comp_regno, @comp_email)
SET @recID = (SELECT tempID FROM @tableVar)
-上記の行は、必要なIDが保存されている先ほど作成した一時テーブルを検索するために使用されます。この一時テーブルには1つのレコードと1つのフィールドしかないため、必要なID番号のみを選択し、「@ recID」にドロップします。 '@ recID'に必要なID番号が追加され、以下のように使用できます。
INSERT INTO staff(Staff_comp_id)
VALUES (@recID)
End
-さあ、どうぞ。 'OUTPUT Inserted.WhatEverFieldNameYouWant'行で必要なものを実際に取得し、テンポラリーテーブルに必要なフィールドを作成し、アクセスして必要なものを使用できます。
私はこのような何かを長年にわたって探していましたが、この詳細な内訳で、これが役立つことを願っています。
上記を試してみましたが、うまくいきませんでした。この考えが見つかりました。
var ContactID = db.GetLastInsertId();
コードが少なく、簡単に入力できます。
これが誰かを助けることを願っています。
最後に挿入されたIDを取得するためのあらゆる種類の方法がありますが、私が見つけた最も簡単な方法は、次のようにDataSetのTableAdapterから取得することです。
<Your DataTable Class> tblData = new <Your DataTable Class>();
<Your Table Adapter Class> tblAdpt = new <Your Table Adapter Class>();
/*** Initialize and update Table Data Here ***/
/*** Make sure to call the EndEdit() method ***/
/*** of any Binding Sources before update ***/
<YourBindingSource>.EndEdit();
//Update the Dataset
tblAdpt.Update(tblData);
//Get the New ID from the Table Adapter
long newID = tblAdpt.Adapter.InsertCommand.LastInsertedId;
お役に立てれば ...
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace DBDemo2
{
public partial class Form1 : Form
{
string connectionString = "Database=company;Uid=sa;Pwd=mypassword";
System.Data.SqlClient.SqlConnection connection;
System.Data.SqlClient.SqlCommand command;
SqlParameter idparam = new SqlParameter("@eid", SqlDbType.Int, 0);
SqlParameter nameparam = new SqlParameter("@name", SqlDbType.NChar, 20);
SqlParameter addrparam = new SqlParameter("@addr", SqlDbType.NChar, 10);
public Form1()
{
InitializeComponent();
connection = new System.Data.SqlClient.SqlConnection(connectionString);
connection.Open();
command = new System.Data.SqlClient.SqlCommand(null, connection);
command.CommandText = "insert into employee(ename, city) values(@name, @addr);select SCOPE_IDENTITY();";
command.Parameters.Add(nameparam);
command.Parameters.Add(addrparam);
command.Prepare();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void buttonSave_Click(object sender, EventArgs e)
{
try
{
int id = Int32.Parse(textBoxID.Text);
String name = textBoxName.Text;
String address = textBoxAddress.Text;
command.Parameters[0].Value = name;
command.Parameters[1].Value = address;
SqlDataReader reader = command.ExecuteReader();
if (reader.HasRows)
{
reader.Read();
int nid = Convert.ToInt32(reader[0]);
MessageBox.Show("ID : " + nid);
}
/*int af = command.ExecuteNonQuery();
MessageBox.Show(command.Parameters["ID"].Value.ToString());
*/
}
catch (NullReferenceException ne)
{
MessageBox.Show("Error is : " + ne.StackTrace);
}
catch (Exception ee)
{
MessageBox.Show("Error is : " + ee.StackTrace);
}
}
private void buttonSave_Leave(object sender, EventArgs e)
{
}
private void Form1_Leave(object sender, EventArgs e)
{
connection.Close();
}
}
}
この後:
INSERT INTO aspnet_GameProfiles(UserId, GameId) OUTPUT INSERTED.ID VALUES(@UserId, @GameId)
これを実行する
int id = (int)command.ExecuteScalar;
それが動作します
SQL ServerでSCOPE_IDENTITYの呼び出しを使用することもできます。
id int typeでauto incrementに設定されている場合は、これを試してください
SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)
行を挿入した後、クエリの行の下で最後に挿入されたIDを取得できます。
Aspnet_GameProfiles(UserId、GameId)VALUES(@UserId、@GameId);への挿入@@ IDENTITYを選択
INSERT INTO aspnet_GameProfiles(UserId、GameId)VALUES(@UserId、@GameId) ";その後、テーブルをdescのように並べることで、最後のIDにアクセスできます。
Aspnet_GameProfilesから上位1ユーザーIDを選択します。