এম এস এসকিউএল সার্ভার থেকে সি # তে ডেটা জিজ্ঞাসা করার সেরা অনুশীলন?


9

সি # তে এমএস এসকিউএল সার্ভার থেকে ডেটা জিজ্ঞাসার সর্বোত্তম উপায় কী?

আমি জানি যে কোডটিতে একটি এসকিউএল কোয়েরি থাকা ভাল অনুশীলন নয়।

কোনও সঞ্চিত পদ্ধতি তৈরি করার এবং প্যারামিটার সহ সি # থেকে কল করার কি সেরা উপায়?

using (var conn = new SqlConnection(connStr))
using (var command = new SqlCommand("StoredProc", conn) { CommandType = CommandType.StoredProcedure }) {
   conn.Open();
   command.ExecuteNonQuery();
   conn.Close();
}

8
"আমি জানি যে কোডটিতে এসকিউএল কোয়েরি থাকা ভাল অনুশীলন নয়।" - ইমো, বাজে কথা বলে।
গ্র্যান্ডমাস্টারবি

4
আপনি যদি কোনও ব্যবহারের ব্লকে তৈরি করে থাকেন তবে আপনাকে কান (কল) করতে হবে না। ব্যবহারের ব্লকের পুরো পয়েন্টটি হ'ল সি ++ স্টাইলের ডেস্ট্রাক্টর পরিষ্কার করা। একটি সভ্য বয়স থেকে একটি মার্জিত পরিষ্কার। চেষ্টা-ধরার স্টাইলের মতো এলোমেলো বা আনাড়ি নয়।
লর্ড টাইডাস

2
অবগতির জন্য। সঞ্চিত পদ্ধতিগুলিও "কোড"। সঞ্চিত প্রকল্পগুলির পুরো বিন্দুটি সেট-ভিত্তিক স্টাইল এসকিউএল এর সাথে প্রসেসরিয়াল কোডটি মেশানোর অনুমতি দেয়। সুতরাং নির্বিশেষে কোডটিতে আপনার কাছে একটি প্রশ্ন থাকবে। অত্যন্ত উচ্চ ভলিউম অ্যাপ্লিকেশনগুলির জন্য সার্ভারগুলি যুক্ত করে অনুভূমিক স্কেলিংয়ের অনুমতি দেওয়ার জন্য ডেটাবেসের বাইরে যুক্তি সম্পাদন করা ভাল। যদি আপনি একটি একক ডিবি বজায় রাখতে পারেন তবে যুক্তির জন্য মুলি-সার্ভার তবে স্কেলিং অনেক সহজ হয়ে যায়।
লর্ড টাইডাস

@ গ্র্যান্ডমাস্টারবি আমাদের কাছে সি # তে এসকিউএল এর যথেষ্ট পরিমাণে ইনলাইন রয়েছে (আমাদের সি # এলওসি এখন ২ মিলিয়নের কাছাকাছি) - এবং years বছর পরে এটি আমাদের কামড়ায় ফিরে আসবে কারণ আমাদের এখন সেই ইনলাইন এসকিউএলটিকে অনুসন্ধান করতে হবে (আমরা সম্প্রতি একটি এসকিউএল বিশেষজ্ঞ নিয়োগ করেছি) - সুতরাং আমরা পারফরম্যান্সের টুইটগুলি করছি)। আমার উপর আস্থা রাখুন: আপনার অ্যাপ্লিকেশনটি কীভাবে বড় হবে এবং ভবিষ্যতে কীভাবে জিনিসগুলি পরিবর্তিত হবে তা আপনি কখনই জানেন না। বিভিন্ন ফাইলগুলিতে আলাদা আলাদা ভাষা রাখুন - এমনকি যদি আপনি এটিকে কেবল প্রকাশের সংস্থানগুলিতে ছেড়ে দেন। আপনি এটিও করতে পারেন // SQLCODE- তবে আপনার এটি করা মনে রাখতে হবে।
জোনাথন ডিকিনসন

1
@ জোনাথনডিকিনসন, আপনি চাইলে সঞ্চিত প্রকট ব্যবহার করুন। আমি বহুবার বলেছি যখন আপনি একই ডাটাবেসের বিপরীতে ভিন্ন ভিন্ন কোড বেসগুলি পরিচালনা করছেন তখন সেগুলি কার্যকর হয়। তবে কেবলমাত্র এগুলি কিছু পরিস্থিতিতে কার্যকর হওয়ার সাথে সাথে সেগুলি সর্বদা তাদের 'খারাপ অভ্যাস' ব্যবহার করে না । যদি এসকিউএল স্টেটমেন্টগুলি সরাসরি ব্যবহার না করে সমস্যা তৈরি করে, তবে এটি সেই অ্যাপ্লিকেশনটির জন্য 'খারাপ অভ্যাস' নয়।
গ্র্যান্ডমাস্টারবি

উত্তর:


10

সঞ্চিত পদ্ধতি ব্যবহার করা এক উপায় এবং বহু বছর ধরে এটি ব্যাপকভাবে ব্যবহৃত হয়।

সি # (বা যে কোনও। নেট ভাষা) থেকে এসকিউএল সার্ভার ডেটাবেসগুলির সাথে ইন্টারঅ্যাক্ট করার আরও একটি আধুনিক উপায় হ'ল সত্তা ফ্রেমওয়ার্ক। সত্তা ফ্রেমওয়ার্কের সুবিধা হ'ল এটি বিমূর্ততার একটি উচ্চতর স্তর সরবরাহ করে।

মাইক্রোসফ্ট থেকে উদ্ধৃতি ( https://msdn.microsoft.com/en-us/data/jj590134 ):

ADO.NET সত্তা ফ্রেমওয়ার্ক বিকাশকারীদের একটি সম্পর্কিত সম্পর্কিত স্টোরেজ স্কিমার বিরুদ্ধে সরাসরি প্রোগ্রামিংয়ের পরিবর্তে ধারণাগত অ্যাপ্লিকেশন মডেলের বিরুদ্ধে প্রোগ্রামিং করে ডেটা অ্যাক্সেস অ্যাপ্লিকেশন তৈরি করতে সক্ষম করে। লক্ষ্যটি হ'ল ডেটা-ভিত্তিক অ্যাপ্লিকেশনগুলির জন্য প্রয়োজনীয় কোড এবং রক্ষণাবেক্ষণের পরিমাণ হ্রাস করা। সত্তা ফ্রেমওয়ার্ক অ্যাপ্লিকেশনগুলি নিম্নলিখিত সুবিধাগুলি সরবরাহ করে:

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

একটি ওআরএম বনাম সজ্জিত প্রক্রিয়াগুলির ব্যবহারে ট্রেডঅফস জড়িত থাকে, বিশেষত সুরক্ষার ক্ষেত্রে এবং যেখানে যুক্তি থাকে।

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

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

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


বা অন্য ওআরএম। ইএফের সাথে তুলনা করার সময় তাদের অনেকগুলি সুবিধা এবং অসুবিধা রয়েছে them
সুইভ

8
ওআরএমগুলির অসুবিধাগুলির তালিকাভুক্তি উত্তরটি আরও দরকারী করে তুলবে।
ডেন

6

প্রকৃতপক্ষে মৌলিক দাবিটি বিতর্কযোগ্য - কোডে এসকিউএল থাকা বা ডাটাবেজে কোড থাকা (যেখানে আপনি সঞ্চিত পদ্ধতিতে এগিয়ে যাচ্ছেন) এর মধ্যে ট্রেড-অফ রয়েছে।

যার ফলশ্রুতিটি হ'ল কোনও একক "সেরা" নেই, এটি আপনি সাধারণীকরণের কিছু নয় কারণ আপনি যে কোনও পথেই আপোস করছেন (আপনি সুবিধা অর্জন করতে পারেন তবে সীমাবদ্ধতাও প্রবর্তন করেন)।

আপনার অ্যাপ্লিকেশন এবং আপনার ডাটাবেসের মধ্যে যদি একটির সাথে একটি করে চিঠিপত্র থাকে তবে তা আসলেই কিছু যায় আসে না। অন্যদিকে, যদি আপনার কাছে একটি বৃহত মূল ডাটাবেস ভাগ করে নেওয়া হয় তবে সেই অ্যাপ্লিকেশনগুলির মধ্যে ডাটাবেসের মধ্যে ধারাবাহিকতা প্রয়োগকারী উল্লেখযোগ্য সংখ্যক অ্যাপ্লিকেশন ভাগ করে নেয় more

আপনার অ্যাপ্লিকেশনটির আর্কিটেকচার এবং লেয়ারিংয়ের বিষয়ে সবচেয়ে বেশি উদ্বেগ হ'ল - সত্তা ফ্রেমওয়ার্ক বা এনহাইবার্নেটের মতো কোনও ওআরএম ব্যবহার করা বা আরও সরাসরি কিছু করা আপনার প্রশ্নের তৈরি নির্বিশেষে এই সিদ্ধান্ত থেকে আপনার অ্যাপ্লিকেশনটির বেশিরভাগ বিচ্ছিন্ন করা উচিত কিনা এমন একটি উপযুক্ত ডেটা অ্যাক্সেস স্তর দেওয়া বা সঞ্চিত পদ্ধতি ব্যবহার করুন।


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


2
"নো সিঙ্গল বেস্ট" এর জন্য +1, কোড মোতায়েনের জন্য -1 সঞ্চিত প্রোক পরিবর্তনগুলি মোতায়েন করার চেয়ে সহজ, আপনার অ্যাপ্লিকেশনটির জন্য বোধগম্য এবং ডাল বিচ্ছিন্নতা নিশ্চিত করার জন্য এমন একটি পদ্ধতির চয়ন করার জন্য +1 - সুতরাং +1।
জোয়েল ব্রাউন

আমি "আমার জন্য" এর সাথে স্থাপনকারী বিটকে যোগ্য করে তুলেছিলাম কারণ এটি আমার ক্ষেত্রে ধারাবাহিকভাবে ঘটেছে (বিশেষত ওয়েব অ্যাপ্লিকেশনগুলির ক্ষেত্রে) - এই ক্ষেত্রে এটি কিছুটা পুনরায় লেখার জন্য বহন করতে পারে for
মার্ফ

+1, যা অ্যাপ্লিকেশন এবং পরিস্থিতির উপর সবচেয়ে ভাল নির্ভর করে।
গ্র্যান্ডমাস্টারবি

1
আমি অনুমান করি এটি আপনি যে পরিস্থিতিতে কাজ করছেন তার উপর নির্ভর করে D এই বিষয়টির জন্য, উত্পাদন নিয়ন্ত্রণ ছাড়াই নতুন মার্কআপ, স্ক্রিপ্ট এবং এমনকি নতুন সংকলিত কোডটিকে একটি কেন্দ্রীভূত অ্যাপে ফেলে দেওয়াও খুব সহজ হতে পারে।
জোয়েল ব্রাউন

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

4

যতক্ষণ আপনি নিজের ইনপুটগুলিকে প্যারামিট্রাইজ করেছেন কোনও পন্থা বৈধ valid কোড আর্গুমেন্টগুলির মধ্যে বেশিরভাগ প্রশ্নই খারাপ পুরানো দিনগুলি থেকে আসে যখন অনেক গ্রন্থাগার আপনাকে একসাথে আপনার বক্তব্যগুলিকে স্ট্রিং-যুক্ত করতে বাধ্য করেছিল এবং সেখান থেকেই এসকিএল ইনজেকশন আক্রমণ এসেছে।


1
পরামিতি যথেষ্ট? আপনারও কি স্যানিটাইজ করার দরকার নেই?
স্টুপারউজার

এটি আপনার উত্স এবং আপনার উদ্দেশ্য উপর নির্ভর করে। আমি আক্ষরিকভাবে তাঁর প্রশ্নটি নিচ্ছিলাম, তিনি কিছু পরামিতি সহ কেবল পঠনযোগ্য। সাধারণ ক্ষেত্রে সঠিকভাবে প্যারামিটারাইজড হলে কোনও ধরণের ব্যতিক্রম পাওয়া যায় বা খারাপ ইনপুট সহ কোনও ফলাফল না হলে আপনি নোংরা ইনপুটটি দিয়ে সবচেয়ে খারাপ কাজ করবেন। প্রবেশাধিকারটি আলাদা এবং সাধারণত উত্সটিকে কর্তৃত্ব হিসাবে বিবেচনা না করা হলে সাধারণত বৈধতার প্রয়োজন হয় needs
বিল

0

সেরা অনুশীলনটি এখানে সত্যই নিমজ্জিত - এটি করার জন্য প্রচুর ভাল উপায় রয়েছে এবং আপনি যেটি চয়ন করেন তা আপনার অ্যাপ্লিকেশনটি কী এবং আপনার কী করা উচিত তার উপর নির্ভর করে। এটি বলেছিল, কেবলমাত্র দুটি জিনিসই আপনি সত্যই ভুল করতে পারেন:

  • @ বিল যেমন উল্লেখ করেছে, আপনার প্রশ্নগুলি সর্বদা প্যারামিটারাইজ করা উচিত। স্ট্রিং বিল্ডিং এসকিউএল ইঞ্জেকশনের পাশাপাশি বাগগুলি ট্র্যাক করার জন্য সমস্ত ধরণের হার্ড ভেক্টর। অনেক বুদ্ধিমান লোকেরা কীভাবে স্কুয়েলাইজ করতে এবং এসকেএল থেকে পালাতে পারে তা বুঝতে পেরেছিল যাতে আপনার নিজের এটি বের করার দরকার নেই।

  • আপনার সংযোগগুলি বন্ধ করুন। সর্বোত্তম উপায় হ'ল সবকিছুকে একটি বিবৃতি ব্যবহার করে মোড়ানো, তবে চেষ্টা / ধরা / শেষ পর্যন্ত খুব শীতল হলে যদি এটি আপনার নৌকাকে ভাসিয়ে দেয়। তবে সর্বদা নিশ্চিত হয়ে নিন যে আপনি কোনও সস্তা গাড়ির মতো সংযোগ ব্যবহার করেছেন - এটিকে কঠোর এবং দ্রুত চালনা করুন এবং এটি থেকে দ্রুত মুক্তি পান।

অন্যান্য অনুশীলনের জন্য আমি দৃ ve়তার সাথে তর্ক করব যে হ'ল আপনার ডেটা অ্যাক্সেস কোডটিকে যতটা সম্ভব কম জায়গায় কেন্দ্রীভূত করা উচিত তা নিশ্চিত করা উচিত। আমরা ফ্রন্ট-এন্ড ওয়েব অ্যাপ্লিকেশনগুলিকে System.Data.SqlClient এ সরাসরি রেফারেন্স রাখতে অনুমতি দিই না এই সতর্কতামূলক প্রয়োগকে সহায়তা করতে।

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