কেন `নির্বাচন @ পরিচয় দশমিক দশমিক ফেরত?


24

আমি ASP.NET MVC 3 (.NET 4.0) অ্যাপ্লিকেশন থেকে একটি এসকিউএল সার্ভার 2008 আর 2 এক্সপ্রেস উদাহরণের বিরুদ্ধে নিম্নলিখিত কোয়েরিটি সম্পাদন করতে ড্যাপার ব্যবহার করছি ।

INSERT INTO Customers (
         Type, Name, Address, ContactName, 
         ContactNumber, ContactEmail, Supplier)
VALUES (
         @Type, @Name, @Address, @ContactName, 
         @ContactNumber, @ContactEmail, @Supplier)

SELECT @@IDENTITY

কলটি connection.Query<int>(sql, ...)একটি অবৈধ কাস্ট ব্যতিক্রম ছোঁড়াচ্ছে। আমি এটি ডিবাগ করেছি এবং এটি সেই পর্যায়ে যেখানে ড্যাপার GetValueফিরে আসার জন্য কল করে SqlDataReader

রিটার্ন টাইপ GetValueহ'ল Object, এটি ডিবাগার শোতে এটি পরীক্ষা করে এটি একটি বক্সযুক্ত দশমিক।

যদি আমি নির্বাচনগুলিতে পরিবর্তন করি তবে SELECT CAST(@@IDENTITY as int)গেটভ্যালুয়ের প্রত্যাবর্তনটি একটি বক্সযুক্ত ইন্টার এবং ব্যতিক্রম নিক্ষেপ করা হয় না।

আইডি কলামটি অবশ্যই টাইপ ইন্টের; দশমিক কেন SELECT @@IDENTITYফেরত আসবে?

কিছু অতিরিক্ত তথ্য:

  • ডাটাবেসটি একেবারে নতুন।
  • গ্রাহক সারণি হ'ল এটিতে আমি যুক্ত করেছি। ডাটাবেসে অন্য কোনও (ব্যবহারকারী) সারণী, দর্শন, ট্রিগার বা সঞ্চিত পদ্ধতি নেই।
  • ডাটাবেসে 10 টি সারি রয়েছে, সেখানে আইডির 1,2,3,4,5,6,7,8,9,10 রয়েছে (অর্থাত কলামটি কোনও প্রান্তের সীমা ছাড়িয়ে নয়)।

আমার টেবিল সংজ্ঞা

CREATE TABLE [dbo].[Customers](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Type] [int] NOT NULL,
    [Name] [nvarchar](255) NOT NULL,
    [Address] [nvarchar](1000) NOT NULL,
    [ContactName] [nvarchar](255) NOT NULL,
    [ContactNumber] [nvarchar](50) NOT NULL,
    [ContactEmail] [nvarchar](255) NOT NULL,
    [Supplier] [nvarchar](255) NOT NULL,
 CONSTRAINT [PK_Customers] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (
    PAD_INDEX  = OFF, 
    STATISTICS_NORECOMPUTE  = OFF, 
    IGNORE_DUP_KEY = OFF, 
    ALLOW_ROW_LOCKS  = ON, 
    ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

গ্রাহকদের টেবিলে আপনার কি কোনও ট্রিগার রয়েছে?
রিচার্ড

3
আমি @@ পরিচয়ের পরিবর্তে SCOPE_IDENTITY () ব্যবহার করব । @@ পরিচয় আপনাকে বর্তমান সংযোগের যে কোনও কিছুই দ্বারা তৈরি করা সর্বশেষ পরিচয় মান দেবে, আপনার বর্তমান ক্ষেত্রের বিপরীতে। সুতরাং, রিচার্ড যেমন পরামর্শ দিয়েছেন, একটি ট্রিগার অন্য টেবিলটি সংশোধন করে এবং একটি পরিচয় তৈরি করে, তা @@ পরিচয় ফেরতকে প্রভাবিত করবে।
নিক চাম্মাস

ডিবিতে কোনও ট্রিগার নেই। এটি একটি তাজা ডাটাবেস এবং গ্রাহক সারণী হ'ল আমি তৈরি টেবিল।
গ্রেগ বি

@ গ্রেগ বি: এটি ফাংশনের রিটার্নের ধরণ। আপনি কি রিটার্ন টাইপ হিসাবে ইন্ট / বিগিন্ট আশা করেছিলেন (যেমন প্রশ্ন থেকেই বোঝা যায়) অথবা আপনি এই ফাংশনের জন্য এমএস পছন্দ সম্পর্কে প্রশ্ন করছেন?
মারিয়ান

উত্তর:


28
  1. @@ পরিচয় একটি সংখ্যার (38,0) প্রদান করে । এটি কোনও ইনট্রে পৌঁছানোর জন্য আপনাকে এটি কাস্ট করতে হবে।

    কাস্ট নির্বাচন করুন (@@ পরিচয় হিসাবে INT)

  2. এছাড়াও, পরিবর্তে স্কোপ_সিডেনটিটি ব্যবহার করে দেখুন। গ্রাহকদের টেবিলটিতে আপনার যদি কোনও ট্রিগার থাকে তবে আপনি অন্য টেবিল থেকে শেষ পরিচয় পেয়ে শেষ করতে পারেন।

  3. অবশেষে, যেহেতু আপনি ড্যাপারটি ব্যবহার করছেন , আপনি সেই সমস্তগুলি একটি সঞ্চিত পদ্ধতির অভ্যন্তরে আবদ্ধ করতে চাইবেন যাতে আপনাকে সন্নিবেশ সম্পাদন করার গ্যারান্টি দেওয়া হয় এবং তারপরে একই ব্যাচের পরিচয়টি নির্বাচন করতে পারেন।

    তাত্ত্বিকভাবে, এটি নিজেরাই দুজনকে কার্যকর করতে বেশিরভাগ সময় কাজ করা উচিত। আপনার যদি দুবার ডাটাবেসে যেতে হয় তবে সমস্যাগুলি দেখা দিতে পারে। (উদাহরণস্বরূপ, সংযোগ পুলিংয়ের সাথে এটি কীভাবে কাজ করে? বাদ দেওয়া সংযোগগুলির কী হবে? ইত্যাদি) আপনি যদি কেবলমাত্র এটি সমস্ত সঞ্চিত পদ্ধতিতে ফেলে দেন তবে আপনাকে রাস্তায় অতিরিক্ত চেষ্টা করার বিষয়ে চিন্তা করতে হবে না।


# 3 এর জন্য ধন্যবাদ। অ্যাডহক এসকিউএল স্টেটমেন্টে ব্যাচ সংজ্ঞায়িত করার কোনও উপায় নেই ?
গ্রেগ বি

আমি এটি অন্য তাকান ছিল। আপনি যদি একটি কলের সমস্ত বিবৃতি অন্তর্ভুক্ত করেন তবে এটি সমস্ত এক ব্যাচ। আপনি যদি বিবৃতিগুলি পৃথক কলগুলিতে ভাঙেন তবে জিনিসগুলি বগি হতে পারে।
রিচার্ড

3
SCOPE_IDENTITY () এর প্রস্তাব দেওয়ার জন্য +1
অ্যান্ড্রু বিকার্টন

10

তৈরি টেবিল বলে:

" পরিচয়কে

ইঙ্গিত করে যে নতুন কলামটি একটি পরিচয় কলাম। যখন টেবিলটিতে একটি নতুন সারি যুক্ত করা হয়, মাইক্রোসফ্ট ® এসকিউএল সার্ভার the কলামটির জন্য একটি অনন্য, বর্ধিত মান সরবরাহ করে। সারণীটির অনন্য সারি শনাক্তকারী হিসাবে পরিচয় কলামগুলি সাধারণত প্রাথমিক কী সীমাবদ্ধতার সাথে একত্রে ব্যবহৃত হয়। পরিচয় বৈশিষ্ট্যটি ক্ষুদ্রকণা, ক্ষুদ্রকণা, অন্তর্, বিগিন্ট, দশমিক (পি, 0), বা সংখ্যাসূচক (পি, 0) কলামগুলিতে বরাদ্দ করা যেতে পারে। প্রতি টেবিলে কেবল একটি পরিচয় কলাম তৈরি করা যায়। বাউন্ড ডিফল্ট এবং ডিফল্ট সীমাবদ্ধতা একটি পরিচয় কলামের সাথে ব্যবহার করা যায় না। আপনাকে অবশ্যই বীজ এবং বৃদ্ধি উভয়ই নির্দিষ্ট করতে হবে। যদি উভয়ই নির্দিষ্ট না করা থাকে তবে ডিফল্টটি (1,1) হয়।

বীজ

সারণীতে লোড হওয়া খুব প্রথম সারির জন্য ব্যবহৃত মান used

বৃদ্ধি

পূর্ববর্তী সারির লোড হওয়া শনাক্তকরণের মানটিতে কি বর্ধিত মান যুক্ত করা হয়? "

সুতরাং সিস্টেম ফাংশন @@ পরিচয় সর্বাধিক আচ্ছাদন প্রকারের সাথে মানিয়ে নিতে হবে।


এবং এটি কেন এটি numericপ্রশস্ত পরিসীমা পেয়েছে হিসাবে ফিরে আসে ..? ধন্যবাদ
গ্রেগ বি

3
একটি ফাংশনে একাধিক রিটার্ন টাইপ থাকতে পারে না। প্রতিটি সম্ভাবনা অন্তর্ভুক্ত করার জন্য এটি বিস্তৃত প্রকারটি ব্যবহার করতে হবে।
মেরিয়ান

6

"কেন নির্বাচিত ফলাফল সনাক্তকরণ একটি দশমিক ফিরে আসবে"

কারণ এটি কোনও ক্ষেত্রে ফিট করার পক্ষে অনেক বড় int- এটি পরিচয় কলামের ধরণের সাথে মেলে না তবে রিচার্ড বলেছে একটি সংখ্যা ফেরায় (38,0) ( numericএবং decimal প্রতিশব্দগুলি হচ্ছে )

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