সি শার্প টিউটোরিয়াল – ৭ঃ সি শার্প প্রজেক্টে মাইএসকিউএল ডাটাবেইজের সিলেক্ট অপারেশনের ব্যবহার

সি শার্প টিউটোরিয়ালের আজকের পর্বে আপনাদের সবাইকে স্বাগতম জানাচ্ছি। আমরা সর্বশেষ পোষ্টে সি শার্প প্রজেক্টের ডাটা মাইএসকিউএল ডাটাবেইজে ইনসার্ট করার একটা পদ্ধতি দেখেছিলাম (পোষ্টটা এখানে পাবেন) এবং তার আগের পোষ্টে সি শার্প প্রজেক্টে মাইএসকিউএল ডাটাবেইজের কানেকশন দেওয়ার একটা পদ্ধতি দেখেছিলাম (পোষ্টটা এখানে পাবেন)। আজকের পোষ্টে আমরা সি শার্প প্রজেক্টে মাইএসকিউএল (MySQL) ডাটাবেইজের ডাটা সিলেক্ট করার একটা পদ্ধতি দেখব। সি শার্প প্রজেক্টের অনেকগুলো কাজে মাইএসকিউএল ডাটাবেইজের ডাটা ব্যবহার করতে হয়, যেমনঃ লগইন এর ক্ষেত্রে ইউজার আইডি আর পাসওয়ার্ড চেক করার জন্য, রেজিষ্ট্রেশন এর ক্ষেত্রে ইউজার আইডি চেক করার জন্য, … …
আজকের পোষ্টে আমরা দেখব কিভাবে মাইএসকিউএল ডাটাবেইজের ডাটা সি শার্পের স্ট্রিং ভ্যারিয়েবলে রাখতে হয়। পরবর্তী কোন পোষ্টে আমরা ডাটাগুলো কিভাবে .নেট ফ্রেমওয়ার্কের কম্বোবক্সে রাখতে হয় তা দেখব।
আমরা উদাহরনস্বরুপ একটা সি শার্প প্রজেক্ট নিয়ে কাজ করছি যেটা শুধুমাত্র ইউজারের নাম ডাটাবেইজে স্টোর/সেইভ করে রাখে। মনেকরুন আমাদের ডাটাবেইজের নাম “user” এবং আমরা “info” নামের টেবল/টেবিল এ ডাটা ইনসার্ট করব, যার দুইটা কলাম আছে যেগুলোঃ fname, lname।
simple mysql db structure
আপনার যারা আগের দুইটা পোষ্ট দেখেছেন তার জানেন যে সি শার্প প্রজেক্টে মাইএসকিউএল ডাটাবেইজ ব্যবহার করার জন্য আমাদেরকে নিচের লাইব্রেরী/নেইমস্পেইসটা লিখতে হবেঃ

	using MySql.Data.MySqlClient;

ডাটাবেইজের ডাটা সিলেক্ট করার জন্য আমাদেরকে নিচের কয়েকটা পদ্ধতি অনুসরন করতে হবে।
১। ডাটাবেইজের কানেকশন দেওয়ার জন্য প্রথমে আমাদেরকে MySqlConnection ক্লাসের একটা ইন্সট্যান্স ডিক্লায়ার করতে হবে। এজন্য আমরা নিচের সিনট্যাক্সটা অনুসরন করতে পারিঃ

MySqlConnection instance_name = new MySqlConnection(string connection_string);

instance_name এর জন্য আমরা যেকোন নাম ব্যবহার করতে পারি [এগুলো ভ্যালিড নাম, যেমনঃ conn, _conn, conn_, conn1, etc. এগুলো ইনভ্যালিড নামঃ 1conn, @conn, etc]। MySqlConnection ক্লাসের ইন্সট্যান্স ডিক্লায়ার করার সময় প্যারামিটারে আমাদেরকে যে ডাটাবেইজটা ব্যবহার করব তার কানেকশন স্ট্রিং ডিক্লায়ার করতে হবে। মাইএসকিউএল ডাটাবেইজের জন্য আমরা নিচের কানেকশন স্ট্রিংটা ব্যবহার করতে পারিঃ

“server = server_link; port = port_number; database = database_name; username= username; password=password”

উপরের কানেকশন স্ট্রিংটা ছাড়া আমরা চাইলে নিচের কানেকশন স্ট্রিংটাও ব্যবহার করতে পারিঃ

“datasource = datasource_link; port = port_number; database = database_name; username= username; password=password”

যদি কোন কারনে আপনার নেটওয়ার্কের পোর্ট নাম্বার জানা না থাকে তাহলে আপনি চাইলে কানেকশন স্ট্রিং থেকে পোর্ট নাম্বারটা বাদ দিতে পারেন। সেক্ষেত্রে আমাদের কানেকশন স্ট্রিংটা এইভাবে লিখতে হবেঃ

“server = server_link; database = database_name; username= username; password=password”

আমরা চাইলে কানেকশন স্ট্রিং থেকে আমাদের ডাটাবেইজের নামটা বাদ দিতে পারি। এতে যে সমস্যাটা হয় তা হয় হলঃ ডাটাবেইজের কুয়েরীতে আমাদেরকে প্রতিবার টেবলের নামের আগে ডাটাবেইজের নামটা উল্লেখ করে দিতে হয়। যেমনঃ

select * from user.info;

উপরের কুয়েরীর user.info তে user হল ডাটাবেইজ আর info হল টেবল।
যদি আপনি WAMP/XAMPP অথবা অন্যকোন লোকাল সার্ভার (localhost) ব্যবহার করেন এবং localhost এর কোন তথ্য পরিবর্তন না করেন তাহলে আপনার কানেকশন স্ট্রিংটা অনেকটা নিচের কানেকশন স্ট্রিংটার মত হবেঃ
server/ datasource = localhost
port = 3306;
database_name = depends on you.
username = root;
password =
তাহলে সি শার্পের প্রজেক্টের জন্য আমাদের কানেকশন স্ট্রিংটা হবে অনেকটা নিচের মতঃ

MySqlConnection instance_name = new MySqlConnection("server = localhost;database = database_name; username=root; password=;";
);

আপনারা চাইলে কানেকশন স্ট্রিংটা একটা স্ট্রিং ভ্যারিয়েবলে রাখতে পারেন। যেক্ষেত্রে আমাদের কানেকশন স্ট্রিংটা অনেকটা নিচের মত হবেঃ

string connstr = "server = localhost;database = user; username=root; password=;";
MySqlConnection instance_name = new MySqlConnection(connstr);

২। এরপর ডাটা ইনসার্ট/ডিলিট/আপডেট/সিলেক্ট করার জন্য আমাদেরকে MySqlDataAdapter ক্লাসের একটা ইন্সট্যান্স ডিক্লায়ার করতে হবে। এজন্য আমরা নিচের সিনট্যাক্সটা অনুসরন করতে পারিঃ

MySqlDataAdapter instance_name = new MySqlDataAdapter();

৩। এরপর MySqlDataAdapter এর ইন্সট্যান্সটা দিয়ে আমাদেরকে মাইএসকিউএল এর SelectCommand টা সেট করতে হবে। এটা একটা MySqlCommand। এজন্য আমরা নিচের সিনট্যাক্সটা অনুসরন করতে পারিঃ

Instance_of_MySqlDataAdapter. SelectCommand = new MySqlCommand(string query, instance_of_ MySqlConnection);

এ কমেন্ডটা দুইটা প্যারামিটার ইনপুট নে। যার প্রথমটা হল কুয়েরী এবং দ্বিতীয়টা হল MySqlConnection এর ইনট্যান্স।
আমরা চাইলে কুয়েরীটা একটা স্ট্রিং ভ্যারিয়েবলে ডিক্লায়ার করতে পারি। যদি আমাদের MySqlConnection এর ইন্সট্যান্সটা conn এবং MySqlDataAdapter এর adapter ইন্সট্যান্সটা হয় সেক্ষেত্রে আমরা নিচের সিনট্যাক্স অনুসরন করতে পারিঃ

string query = “select from table_name ….“;
adapter.SelectCommand = new MySqlCommand(query, conn);

৪। ডাটাবেইজ থেকে ডাটা সিলেক্ট করার জন্য MySqlDataReader ক্লাসের ইন্সট্যান্স ডিক্লায়ার করতে হবে। এটা ইনসার্ট, ডিলিট, এবং আপডেট এর জন্য লাগবে না। এজন্য আমরা নিচের সিনট্যাক্সটা অনুসরন করতে পারিঃ

	MySqlDataReader instance_name;

৫। এরপর আমাদের একটা স্ট্রিং ভ্যারিয়েবল এবং একটা ইন্টিজার ভ্যারিয়েবল লাগবে। স্ট্রিং ভ্যারিয়েবলটাতে আমরা ডাটাবেইজের ডাটা রাখব আর ইন্টিজার ভ্যারিয়াবল দিয়ে যতক্ষন ডাটাবেইজ থেকে ডাটা পাবে ততক্ষন স্ট্রিং ভ্যারিয়েবলের ইনডেক্স ১ করে বাড়াতে থাকব। সেজন্য ইন্টিজার ভ্যারিয়েবলটা ডিক্লায়ার করার সময় এর ভ্যালু ০ (শূন্য) ডিক্লায়ার করে দিতে হবে।
৬। এরপর আমরা বাকী কাজগুলো try-catch ব্লকের মধ্যে করব।
try ব্লকে আমরা ডাটা সিলেক্টের সবগুলো কাজ করব এবং catch ব্লকে শুধুমাত্র ডাটাবেইজ কানেকশনের কোন এরর থাকলে শুধুমাত্র সেটা ম্যাসেজ হিসেবে প্রিন্ট করব।
try ব্লকের শুরুতে আমাদেরকে ডাটাবেইজ কানেকশনটা অন করতে হবে। এজন্য আমাদেরকে MySqlConnection এর ইন্সট্যান্সটা দিয়ে আমরা MySqlConnection ক্লাসের Open() ফাংশনটা কল দিতে হবে।
এরপর আমাদেরকে কুয়েরীটা এক্সিকিউট করতে হবে। এজন্য আমাদেরকে MySqlDataAdapter এর ইন্সট্যান্সটা দিয়ে ExecuteReader() ফাংশনটা কল করতে হবে, এবং এই ফাংশনটা আমদেরকে MySqlDataReader এর যে ইন্সট্যান্স ডিক্লায়ার করেছি সেটাতে কল করতে হবে। এতে করে ডাটাবেইজ থেকে যে ভ্যালুগুলো পাবে সবগুলো MySqlDataReader এর ইন্সট্যান্সে স্টোর হবে। এই কল করার কোডটা অনেকটা নিচের মতঃ
মনেকরুন আমাদের MySqlDataReader ক্লাসের ইন্সট্যান্স reader এবং MySqlDataAdapter ক্লাসের ইন্সট্যান্স adapter, সেক্ষেত্রেঃ

	reader = adapter.SelectCommand.ExecuteReader();

নোটঃ ExecuteReader() ফাংশনটা শুধুমাত্র সিলেক্ট অপারেশনের কুয়েরীগুলোর ক্ষেত্রে কাজ করবে। ইনসার্ট, ডিলিট এবং আপডেট এর জন্য ExecuteNonQuery() ফাংশনটা ব্যবহার করতে হবে।

এখন আমাদের MySqlDataReader ক্লাসের ইন্সট্যান্সটা থেকে ডাটাবেইজের ডাটাগুলো আমাদেরকে আমাদের স্ট্রিং ভ্যারিয়েবলে রাখতে হবে। যেহেতু ইন্সট্যান্সটা ডাটাবেইজ থেকে একের অধিক ডাটা পেতে পারে (কুয়েরীর উপর নির্ভর করে) সেহেতু আমাদেরকে একটা লুপের মাধ্যমে ডাটাগুলো স্ট্রিং ভ্যারিয়েবলে রাখতে হবে। এজন্য আমরা while লুপ ব্যবহার করতে পারি এবং কন্ডিশন হিসেবে দিতে পারি MySqlDataReader_instance.Read(), এটার একটা কোড নিচের মত হতে পারে (মনেকরুন আমাদের MySqlDataReader ক্লাসের ইন্সট্যান্স reader) –

while(reader.Read())
{
     	…
     	//do your task
	     …
}

Read() ফাংশনটার কাজ হল এটা যতক্ষন পর্যন্ত reader ইন্সট্যান্স এ ডাটাবেইজের ভ্যালু পাবে ততক্ষন পর্যন্ত while লুপের কন্ডিশন true দিবে।

মনে রাখবেনঃ

আপনার ডাটাবেইজের টেবলে যদি n সংখ্যক কলাম থাকে তাহলে reader[0] তে আপনি ১ম কলামের ডাটা পাবেন, reader[1] এ আপনি ২য় কলামের ডাটা পাবেন,reader[2] তে আপনি ৩য় কলামের ডাটা পাবেন, … …, reader[n-1] এ আপনি n কলামের ডাটা পাবেন। সেক্ষত্রে ডাটাগুলোকে ToString() ফাংশন ব্যবহার করে সহজে স্ট্রিং ডাটা হিসেবে কনভার্ট করতে পারবেন। [কনভার্ট করার নিয়মঃ reader[0].ToString()]

৭। catch ব্লকে আমরা শুধুমাত্র ডাটাবেইজের কোন এরর থাকলে সেটা ম্যাসেজ হিসেবে দেখাব, সেটা যেকোন ম্যাসেজ হতে পারে।
আজকের পোষ্টের জন্য সম্পূর্ন একটা কোডের উদাহরনঃ

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MySql.Data.MySqlClient;

namespace Selecting_Data
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] res = new string[100];
            int jj = 0;
            string connstr = "server=localhost; port=3306; database=user; username=root; password=;";
            MySqlConnection conn = new MySqlConnection(connstr);
            MySqlDataAdapter adapter = new MySqlDataAdapter();
            MySqlDataReader reader;
            string qry = "select * from info";
            adapter.SelectCommand = new MySqlCommand(qry, conn);
            try
            {
                conn.Open();
                reader = adapter.SelectCommand.ExecuteReader();
                while(reader.Read())
                {
                    res[jj++] = reader[0].ToString() + " " + reader[1].ToString();
                }
                res[jj] = "\0";
                conn.Close();
                for (int i = 0; i < jj; i++)
                {
                    Console.WriteLine(res[i]);
                    Console.WriteLine();
                }
                Console.ReadKey();
            }
            catch(MySqlException Ex)
            {
                Console.WriteLine("Error:\n" + Ex.Message);
                Console.ReadKey();
            }
        }
    }
}

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