সন্নিবেশ কমান্ড কার্যকর করুন এবং সিকিএল-তে sertedোকানো আইডি ফিরিয়ে দিন


111

আমি এমভিসি ৪ তে সি # ব্যবহার করে একটি এসকিউএল টেবিলের মধ্যে কিছু মান সন্নিবেশ করছি am প্রকৃতপক্ষে, আমি মানগুলি সন্নিবেশ করতে এবং সর্বশেষ সন্নিবেশিত রেকর্ডের 'আইডি' ফিরিয়ে দিতে চাই। আমি নিম্নলিখিত কোড ব্যবহার।

public class MemberBasicData
{
    public int Id { get; set; }
    public string Mem_NA { get; set; }
    public string Mem_Occ { get; set; }     
}

IDোকানো হলে ডাটাবেসে স্বয়ংক্রিয়ভাবে আইডি বৃদ্ধি করা হয়।

public int CreateNewMember(string Mem_NA, string Mem_Occ )
{
    using (SqlConnection con=new SqlConnection(Config.ConnectionString))
    {
        using(SqlCommand cmd=new SqlCommand("INSERT INTO Mem_Basic(Mem_Na,Mem_Occ) VALUES(@na,@occ)",con))
        {
            cmd.Parameters.AddWithValue("@na", Mem_NA);
            cmd.Parameters.AddWithValue("@occ", Mem_Occ);
            con.Open();

            int modified = cmd.ExecuteNonQuery();

            if (con.State == System.Data.ConnectionState.Open) con.Close();
                return modified;
        }
    }
}
   

আমি জানি ExecuteNonQueryযে সারিটি প্রভাবিত সংখ্যাগুলি বোঝায় ot এর পরিবর্তে আমি ব্যবহার করি

int modified = (int)cmd.ExecuteScalar();

কিন্তু এটি কাজ করছে না। এটি সমাধান করার জন্য আমাকে সাহায্য করুন। এবং এর মতো কোনও কোড রয়েছে cmd.ExecuteInsertAndGetID()(আমার কোড দিয়ে কাজ করছে না)।


তুমি কি বলতে চাচ্ছো InsertedID?
সোনার Gön 22l

উত্তর:


211

নীচের সমাধানটি 2005 এবং এর থেকেও বেশি বেকার সার্ভারের সাথে কাজ করবে। প্রয়োজনীয় ক্ষেত্রটি পেতে আপনি আউটপুট ব্যবহার করতে পারেন । আইডি-র স্থান আপনি নিজের চাবিটি লিখতে পারেন যা আপনি ফিরে আসতে চান। এটা এভাবে করো

এসকিউএল সার্ভার 2005 এবং তারপরের জন্য

    using(SqlCommand cmd=new SqlCommand("INSERT INTO Mem_Basic(Mem_Na,Mem_Occ) output INSERTED.ID VALUES(@na,@occ)",con))
    {
        cmd.Parameters.AddWithValue("@na", Mem_NA);
        cmd.Parameters.AddWithValue("@occ", Mem_Occ);
        con.Open();

        int modified =(int)cmd.ExecuteScalar();

        if (con.State == System.Data.ConnectionState.Open) 
            con.Close();

        return modified;
    }
}

পূর্ববর্তী সংস্করণগুলির জন্য

    using(SqlCommand cmd=new SqlCommand("INSERT INTO Mem_Basic(Mem_Na,Mem_Occ)  VALUES(@na,@occ);SELECT SCOPE_IDENTITY();",con))
    {
        cmd.Parameters.AddWithValue("@na", Mem_NA);
        cmd.Parameters.AddWithValue("@occ", Mem_Occ);
        con.Open();

        int modified = Convert.ToInt32(cmd.ExecuteScalar());

        if (con.State == System.Data.ConnectionState.Open) con.Close();
            return modified;
    }
}

1
int modified = (int) cmd.ExecuteScalar ();
নীল

10
নোট করুন যে কলামের নামটি অবশ্যই সারণীর পরিচয় কলামের সাথে মেলে। উদাহরণ হিসেবে বলা যায় এই পরিচয় কলামের নামের সাথে একটা টেবিল: select EmployeeId, * from Employeesসন্নিবেশ বিবৃতিতে এই টুকরা প্রয়োজন:output inserted.EmployeeId
joshjeppson

কোয়েরিটি আসলে এই ক্ষেত্রে সন্নিবেশ করেছে কিনা তা আপনি কীভাবে পরীক্ষা করবেন?
এটিডি

8
কোনও ইনটকে কাস্ট করার চেষ্টা করার সময় আমি একটি অবৈধ কাস্ট ত্রুটি পেয়েছিলাম int modified = (int)cmd.ExecuteScalar();। এটিকে একটি ইনটে রূপান্তর করতে আমাকে কনভার্ট ব্যবহার করতে হয়েছিল। int modified = Convert.ToInt32(cmd.ExecuteScalar());
ব্যাডাক

নীচে পরিবর্তন আমার জন্য কাজ করে। সন্নিবেশ মেমো-বেসিক (মেম_না, মেমো_সিসি) আউটপুট ইনসার্টেড.আইডি ভ্যালু (?,?)
এবিবি

45

কোয়েরিটি এতে পরিবর্তন করুন

"INSERT INTO Mem_Basic(Mem_Na,Mem_Occ) VALUES(@na,@occ); SELECT SCOPE_IDENTITY()"

এটি সর্বশেষ sertedোকানো আইডিটি ফিরিয়ে দেবে যা আপনি তারপরে পেতে পারেন ExecuteScalar


1
এটি একটি ত্রুটি দেখায় "ইনভালিডকাস্ট ব্যতিক্রমটি ব্যবহারকারী কোড দ্বারা আনহ্যান্ডেল করা হয়েছিল"
নীল

2
@neel, কারণ স্কোপ_সিডেনটিটি () সংখ্যার ডেটা টাইপ দেয় যা আপনি কেবল দশমিক। নেট ডেটা টাইপের বিপরীতে ফেলতে পারেন। আর একটি উপায় হ'ল কনভার্ট ব্যবহার করুন cast
হর্ষ

2
এই উত্তরটি আরও ভাল কারণ আপনার সারণির আইডি কলামটি beingোকানো হবে না।
goamn

1
নির্বাচন করুন SCOPE_IDENTITY () আমার পক্ষে কাজ করছে না তবে আউটপুট INSERTED.ID।
15:

1
@ টিগারটু: এসকিউএল সার্ভারের কোন সংস্করণ আপনি ব্যবহার করছেন? মাইক্রোসফ্ট অবশেষে হ্রাস পেয়েছে এটা সম্ভব SCOPE_IDENTITY()OUTPUT INSERTEDআইআইআরসি এসকিউএল সার্ভার ২০০৮ এ উপস্থিত হয়েছিল এবং এটি করার জন্য এটি সবচেয়ে পছন্দসই উপায়
কেন কেইনান

19

এসকিউএল সার্ভার সঞ্চিত পদ্ধতি:

CREATE PROCEDURE [dbo].[INS_MEM_BASIC]
    @na varchar(50),
    @occ varchar(50),
    @New_MEM_BASIC_ID int OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO Mem_Basic
    VALUES (@na, @occ)

    SELECT @New_MEM_BASIC_ID = SCOPE_IDENTITY()
END

সি # কোড:

public int CreateNewMember(string Mem_NA, string Mem_Occ )
{
    // values 0 --> -99 are SQL reserved.
    int new_MEM_BASIC_ID = -1971;   
    SqlConnection SQLconn = new SqlConnection(Config.ConnectionString);
    SqlCommand cmd = new SqlCommand("INS_MEM_BASIC", SQLconn);

    cmd.CommandType = CommandType.StoredProcedure;

    SqlParameter outPutVal = new SqlParameter("@New_MEM_BASIC_ID", SqlDbType.Int);

    outPutVal.Direction = ParameterDirection.Output;
    cmd.Parameters.Add(outPutVal);
    cmd.Parameters.Add("@na", SqlDbType.Int).Value = Mem_NA;
    cmd.Parameters.Add("@occ", SqlDbType.Int).Value = Mem_Occ;

    SQLconn.Open();
    cmd.ExecuteNonQuery();
    SQLconn.Close();

    if (outPutVal.Value != DBNull.Value) new_MEM_BASIC_ID = Convert.ToInt32(outPutVal.Value);
        return new_MEM_BASIC_ID;
}

আমি আশা করি এগুলি আপনাকে সাহায্য করবে ....

আপনি চাইলে এটিও ব্যবহার করতে পারেন ...

public int CreateNewMember(string Mem_NA, string Mem_Occ )
{
    using (SqlConnection con=new SqlConnection(Config.ConnectionString))
    {
        int newID;
        var cmd = "INSERT INTO Mem_Basic(Mem_Na,Mem_Occ) VALUES(@na,@occ);SELECT CAST(scope_identity() AS int)";

        using(SqlCommand cmd=new SqlCommand(cmd, con))
        {
            cmd.Parameters.AddWithValue("@na", Mem_NA);
            cmd.Parameters.AddWithValue("@occ", Mem_Occ);

            con.Open();
            newID = (int)insertCommand.ExecuteScalar();

            if (con.State == System.Data.ConnectionState.Open) con.Close();
                return newID;
        }
    }
}

0
USE AdventureWorks2012;
GO
IF OBJECT_ID(N't6', N'U') IS NOT NULL 
    DROP TABLE t6;
GO
IF OBJECT_ID(N't7', N'U') IS NOT NULL 
    DROP TABLE t7;
GO
CREATE TABLE t6(id int IDENTITY);
CREATE TABLE t7(id int IDENTITY(100,1));
GO
CREATE TRIGGER t6ins ON t6 FOR INSERT 
AS
BEGIN
   INSERT t7 DEFAULT VALUES
END;
GO
--End of trigger definition

SELECT id FROM t6;
--IDs empty.

SELECT id FROM t7;
--ID is empty.

--Do the following in Session 1
INSERT t6 DEFAULT VALUES;
SELECT @@IDENTITY;
/*Returns the value 100. This was inserted by the trigger.*/

SELECT SCOPE_IDENTITY();
/* Returns the value 1. This was inserted by the 
INSERT statement two statements before this query.*/

SELECT IDENT_CURRENT('t7');
/* Returns value inserted into t7, that is in the trigger.*/

SELECT IDENT_CURRENT('t6');
/* Returns value inserted into t6. This was the INSERT statement four statements before this query.*/

-- Do the following in Session 2.
SELECT @@IDENTITY;
/* Returns NULL because there has been no INSERT action 
up to this point in this session.*/

SELECT SCOPE_IDENTITY();
/* Returns NULL because there has been no INSERT action 
up to this point in this scope in this session.*/

SELECT IDENT_CURRENT('t7');
/* Returns the last value inserted into t7.*/

0
using(SqlCommand cmd=new SqlCommand("INSERT INTO Mem_Basic(Mem_Na,Mem_Occ) " +
    "VALUES(@na,@occ);SELECT SCOPE_IDENTITY();",con))
{
    cmd.Parameters.AddWithValue("@na", Mem_NA);
    cmd.Parameters.AddWithValue("@occ", Mem_Occ);
    con.Open();

    int modified = cmd.ExecuteNonQuery();

    if (con.State == System.Data.ConnectionState.Open) con.Close();
        return modified;
}

SCOPE_IDENTITY : একই সুযোগে একটি পরিচয় কলামে প্রবেশ করা শেষ পরিচয় মানটি দেয় s আরও তথ্যের জন্য http://technet.microsoft.com/en-us/library/ms190315.aspx


3
সুন্দর হবে তবে এক্সিকিউটননকুইয়ারি আইডি নয়, কেবল ক্ষতিগ্রস্ত সারিগুলির সংখ্যা প্রদান করে। এর পরিবর্তে ডকুমেন্টস.মাইক্রোসফটকম
en-
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.