সর্বশেষ inোকানো আইডি কীভাবে পাবেন?


174

আমার এই কোডটি রয়েছে:

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();
}

আমি যখন এই টেবিলটিতে inোকান, তখন আমার কাছে একটি অটো_স্রোমেন্ট ইন প্রাইমারি কী কলাম বলা হয় GamesProfileId, এর পরে আমি কীভাবে শেষ সন্নিবেশ করবো যাতে আমি এই আইডিটি অন্য টেবিলে to োকাতে পারি?

উত্তর:


256

এসকিউএল সার্ভার 2005+ এর জন্য, যদি কোনও সন্নিবেশ ট্রিগার না থাকে তবে সন্নিবেশ বিবৃতিটি (সমস্ত এক লাইন, এখানে স্পষ্টতার জন্য বিভক্ত) পরিবর্তন করুন

INSERT INTO aspnet_GameProfiles(UserId,GameId)
OUTPUT INSERTED.ID
VALUES(@UserId, @GameId)

এসকিউএল সার্ভার 2000 এর জন্য, বা যদি একটি সন্নিবেশ ট্রিগার থাকে:

INSERT INTO aspnet_GameProfiles(UserId,GameId) 
VALUES(@UserId, @GameId);
SELECT SCOPE_IDENTITY()

এবং তারপর

 Int32 newId = (Int32) myCommand.ExecuteScalar();

5
OUTPUT INSERTED.IDটেবিলে একটি সক্রিয় ট্রিগার ক্ষেত্রে সমস্যা তৈরি করতে পারে
আর্মেন

2
হুম। যখন আমি এটি চেষ্টা করেছি তখন আমার একটি ত্রুটি হয়েছিল: "অবজেক্টের রেফারেন্স কোনও অবজেক্টের উদাহরণে সেট করা হয়নি।" যদিও এটি এক্সিকিউটের সাথে সাথেই চালানো হয়।
খানি

@ খ্যানি আপনি কি ঠিক করেছেন?
টুগোর্ডোবেলো

5
'আউটপুট ইনসার্টেড.আইডি' এর 'আইডি' হল প্রাথমিক কী বিটিডব্লিউ। আমি ভেবেছিলাম এটি একটি সংরক্ষিত শব্দ।
ডানম্বুয়েন

1
@ ভয়েডকিং: আমি এটি কীভাবে রাখতে পারি .. আপনি কিছু ভুল করছেন। সহায়তার জন্য নমুনা কোড সহ একটি নতুন প্রশ্ন পোস্ট করুন। স্পষ্টতই, আপনি আমাকে বলেছিলেন আমি ভুল করছি যখন এটি স্পষ্টভাবে আপনি ব্যতীত সকলের জন্য কাজ করে ...
gbn

38

আপনি CommandTextসমান একটি কমান্ড তৈরি করতে পারেন

INSERT INTO aspnet_GameProfiles(UserId, GameId) OUTPUT INSERTED.ID VALUES(@UserId, @GameId)

এবং কার্যকর int id = (int)command.ExecuteScalar

এই এমএসডিএন নিবন্ধটি আপনাকে কিছু অতিরিক্ত কৌশল দেবে।


6
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();
}

এই vil কাজ :)


vil? আমি মনে করি আমাদের সত্যবাদী হওয়ার জন্য আরও ব্যাকরণগতভাবে সঠিক উত্তর লিখতে হবে
জিজিপ্প্প

3

আমার একই চাহিদা ছিল এবং এই উত্তরটি খুঁজে পেয়েছি ..

এটি কোম্পানির টেবিলে একটি রেকর্ড তৈরি করে (কমপ), এটি কোম্পানির টেবিলে তৈরি অটো আইডিটি ধরে এবং স্টাফ টেবিলের (স্টাফ) এ ফেলে দেয় যাতে 2 টেবিলগুলি সংযুক্ত করা যায়, অনেক কর্মী এক কোম্পানির সাথে থাকতে পারে। এটি আমার এসকিউএল ২০০৮ ডিবিতে কাজ করে, এসকিউএল 2005 এবং তারপরের উপর কাজ করা উচিত।

===========================

CREATE PROCEDURE [dbo].[InsertNewCompanyAndStaffDetails]

 @comp_name varchar(55) = 'Big Company',

 @comp_regno nchar(8) = '12345678',

 @comp_email nvarchar(50) = 'no1@home.com',

 @recID INT OUTPUT

- ' @recID' কোম্পানির স্বতঃ উত্পাদিত আইডি নম্বর ধরে রাখতে ব্যবহৃত হয় যা আমরা ধরতে চলেছি

AS
 Begin

  SET NOCOUNT ON

  DECLARE @tableVar TABLE (tempID INT)

- উপরের লাইনটি পরে ব্যবহারের জন্য স্বয়ংক্রিয় উত্পাদিত আইডি নম্বর ধরে রাখতে একটি অস্থায়ী টেবিল তৈরি করতে ব্যবহৃত হয়। এটা শুধুমাত্র একটি ক্ষেত্র 'tempID' এবং তার টাইপ INT হিসাবে একই '@recID'

  INSERT INTO comp(comp_name, comp_regno, comp_email) 

  OUTPUT inserted.comp_id INTO @tableVar

- ' OUTPUT .োকানো হয়েছে। 'উপরের লাইনটি এখনই যে রেকর্ড তৈরি করছে তাতে যে কোনও ক্ষেত্র থেকে ডেটা দখল করতে ব্যবহৃত হয়। আমরা যে ডেটা চাই তা হ'ল আইডি স্বায়ত্তশাসন। তাই নিশ্চিত করুন যে এতে বলছেন আপনার টেবিল জন্য সঠিক ক্ষেত্র নাম, আমার 'comp_id' । এটি পরে আমরা তৈরি করা অস্থায়ী টেবিলের মধ্যে ফেলে দেওয়া হয় dropped

  VALUES (@comp_name, @comp_regno, @comp_email)

  SET @recID = (SELECT tempID FROM @tableVar)

- উপরের লাইনটি আমাদের তৈরি করা অস্থায়ী টেবিলটি অনুসন্ধান করতে ব্যবহৃত হয়েছিল যেখানে আমাদের প্রয়োজনীয় ID সংরক্ষণ করা হয়েছে। যেহেতু এই অস্থায়ী টেবিলটিতে কেবল একটি রেকর্ড রয়েছে এবং কেবল একটি ক্ষেত্র, এটি কেবল আপনার প্রয়োজনীয় আইডি নম্বরটি নির্বাচন করবে এবং এটিকে ' @recID ' এ ফেলে দেবে। ' @recID ' এর এখন আপনার পছন্দমতো আইডি নম্বর রয়েছে এবং আপনি নীচে এটি ব্যবহার করেছেন এমনভাবে আপনি কীভাবে এটি ব্যবহার করতে পারেন।

  INSERT INTO staff(Staff_comp_id) 
  VALUES (@recID)

 End

- সুতরাং আপনি সেখানে যান। 'আউটপুট sertedোকানো হয়েছে inWhatEverFieldNameYouWant ' লাইনে আপনি যা চান তা আসলেই ধরতে পারেন এবং আপনার অস্থায়ী সারণীতে আপনি কোন ক্ষেত্রগুলি চান তা তৈরি করতে পারেন এবং আপনি যেভাবে চান তা ব্যবহার করতে এটি অ্যাক্সেস করতে পারেন।

আমি যুগে যুগে এই জাতীয় কিছু খুঁজছিলাম, এই বিশদ বিরতি সহ, আমি আশা করি এটি সাহায্য করবে।


3

খাঁটি এসকিউএল-তে মূল বিবৃতিটির মতো কুলগুলি:

INSERT INTO [simbs] ([En]) OUTPUT INSERTED.[ID] VALUES ('en')

স্কোয়ার ব্র্যাকেটগুলি টেবিল সিম্বস এবং তারপরে কলামগুলি এন এবং আইডি, রাউন্ড ব্র্যাকেটগুলি শুরু করার জন্য কলামগুলির গণনা এবং তারপরে কলামগুলির মানগুলি আমার ক্ষেত্রে একটি কলাম এবং একটি মান নির্ধারণ করে। এস্ট্রোপোফগুলি একটি স্ট্রিং আবদ্ধ

আমি আপনাকে আমার পদ্ধতির ব্যাখ্যা করব:

এটি বোঝা সহজ হতে পারে না তবে আমি সর্বশেষ sertedোকানো আইডি ব্যবহার করে বড় ছবি পেতে দরকারী বলে আশা করি। অবশ্যই বিকল্প সহজ পদ্ধতির আছে। তবে আমার নিজের রাখার কারণ রয়েছে। সংযুক্ত ফাংশনগুলি কেবল তাদের নাম এবং প্যারামিটারের নাম অন্তর্ভুক্ত করা হয় না।

আমি চিকিত্সা কৃত্রিম বুদ্ধিমত্তার জন্য এই পদ্ধতিটি ব্যবহার করি পদ্ধতিটি টেবিলে কেন্দ্রীয় টেবিলে (১) উপস্থিত রয়েছে কিনা তা পরীক্ষা করে দেখুন। যদি পছন্দসই স্ট্রিংটি কেন্দ্রীয় টেবিল "সিম্বস" এ না থাকে, বা নকলকে অনুমতি দেওয়া হয়, তবে চাইলে স্ট্রিংটি কেন্দ্রীয় টেবিল "সিম্বস" (2) এ যুক্ত হবে। শেষ সন্নিবেশ করা আইডিটি সম্পর্কিত টেবিল তৈরি করতে ব্যবহৃত হয় (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
    }

2

আমি উপরোক্ত চেষ্টা করেছিলাম কিন্তু তারা কাজ করে না, আমি এই চিন্তাটি পেয়েছি, এটি আমার পক্ষে ঠিক কাজ করে।

var ContactID = db.GetLastInsertId();

এটির কম কোড এবং আমি সহজেই এটি দেওয়া।

আশা করি এটি কাউকে সাহায্য করবে।


1

আপনি এসকিউএল সার্ভারে SCOPE_IDENTITY এ কল ব্যবহার করতে পারেন।


1
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();
        }
    }
}

1

সর্বশেষ sertedোকানো আইডি পাওয়ার জন্য বিভিন্ন ধরণের উপায় রয়েছে তবে সবচেয়ে সহজ উপায়টি আমি খুঁজে পেয়েছি এটি কেবল ডাটাসেটে টেবিলএডাপ্টার থেকে পুনরুদ্ধার করে:

<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;

আশাকরি এটা সাহায্য করবে ...


0

যে কোনও সারি সন্নিবেশ করানোর পরে আপনি কোয়েরির রেখার নীচে সর্বশেষ idোকানো আইডি পেতে পারেন।

এসপেট_গেমপ্রফাইলেস (ইউজারআইডি, গেমআইডি) ভ্যালু (@ ইউজারআইডি, @ গেমআইডি) অন্তর্ভুক্ত করুন; নির্বাচন করুন @@ পরিচয়


-1

ক্যোয়ারিতে SELECT SCOPE_IDENTITY () ব্যবহার করুন


-1

এর পরে:

INSERT INTO aspnet_GameProfiles(UserId, GameId) OUTPUT INSERTED.ID VALUES(@UserId, @GameId)

এটি কার্যকর করুন

int id = (int)command.ExecuteScalar;

এটা কাজ করবে


-2

এসপেট_গেমপ্রফিলিগুলি (ইউজারআইডি, গেমআইডি) ভ্যালু (@ ইউজারআইডি, @ গেমআইডি) "অন্তর্ভুক্ত করুন; তবে আপনি কেবল ডেস্ক উপায়ে টেবিলটি অর্ডার করে শেষ আইডিতে প্রবেশ করতে পারবেন।

এপনেট_গেমপ্রফাইমগুলি থেকে ইউজারআইডি ডিএসসির মাধ্যমে শীর্ষ 1 টি ব্যবহারকারী নির্বাচন করুন।


প্রদত্ত কেউ আইডেন্টিটিআইপিএসইআরটি ব্যবহার করেনি এবং আরও বড় ইউজারআইডি সহ একটি সারি যুক্ত করে।
ld

@ লোগান আমি বুঝতে পেরেছি, এটি আইডি বা কিছু মিশ্র (চার্ভ + ইনট) এর মতো একটি চরমে কাজ করতে পারে না তবে আপনি ইনক্রিমেন্টাল ইন দিয়ে একটি historicalতিহাসিক কলাম স্থাপন করতে পারেন এবং এটির কৌশলটিও করতে পারেন।
আলেক্স

-6
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
CREATE PROC [dbo].[spCountNewLastIDAnyTableRows]
(
@PassedTableName as NVarchar(255),
@PassedColumnName as NVarchar(225)
)
AS
BEGIN
DECLARE @ActualTableName AS NVarchar(255)
DECLARE @ActualColumnName as NVarchar(225)
    SELECT @ActualTableName = QUOTENAME( TABLE_NAME )
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME = @PassedTableName
    SELECT @ActualColumnName = QUOTENAME( COLUMN_NAME )
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME = @PassedColumnName
    DECLARE @sql AS NVARCHAR(MAX)
    SELECT @sql = 'select MAX('+ @ActualColumnName + ') + 1  as LASTID' + ' FROM ' + @ActualTableName 
    EXEC(@SQL)
END

এটিই আমি সত্যিই সুন্দর বলে মনে করি ..... এখন আপনি এসকিউএল -2005 এর যে কোনও টেবিল থেকে শেষ বর্ধিত আইডি পেতে পারেন this এজন্য আপনাকে কেবল সামনের প্রান্ত থেকে এই পদ্ধতিটি কল করতে হবে। লক্ষ্য করুন যে পাসক্লোনমনেমে ডাটা টাইপ INT থাকা উচিত।
হার্টবিট

2
গৃহীত উত্তরের বিরুদ্ধে এই পদ্ধতির বৃহত্তম সমস্যাটি হ'ল যদি একই সময়ে একাধিক ক্লায়েন্ট ডেটা .োকানো হয় তবে আপনি সমস্যার মধ্যে পড়ে যাবেন। ক্লায়েন্ট যদি দুটি স্কয়ার কল করে (প্রথম sertোকান, দ্বিতীয়টি এই সঞ্চিত পদ্ধতিটি) এবং এই দুটি কলের মধ্যে অন্য ক্লায়েন্ট একটি সন্নিবেশও করে দেয় আপনি ভুল আইডি ফিরে পাবেন!
অলিভার

4
এটি সঠিক ফলাফল ফিরিয়ে দেবে না। এটি কলামে সর্বাধিক মানটি ফিরিয়ে দেবে (যার মধ্যে সারিগুলি অন্যান্য ব্যবহারকারী বা ক্রিয়াকলাপগুলি সন্নিবেশিত করবে) আপনি inোকানো শেষ মান নয়। সুতরাং এটি কেবল একক ব্যবহারকারী সিস্টেমে কাজ করবে। অন্তর্নির্মিত পদ্ধতিগুলির মধ্যে একটি ব্যবহার করা (উদাহরণস্বরূপ স্কোপ_ডিসিটিটি ()) প্রসঙ্গের মধ্যে শেষ IDোকানো আইডি পাওয়ার একমাত্র সঠিক উপায়।
নিকজি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.