এস # এসকিউএল টেবিলটি সি # ডেটাটেবেলে পড়ুন


95

আমি একটি এসকিউএল টেবিলের মধ্যে একটি ডেটা টেবিল aboutোকানো সম্পর্কে প্রচুর পোস্ট পড়েছি, তবে কী কোনও এসকিউএল টেবিলটি। নেট ডাটাবেটে টেনে আনার সহজ উপায় আছে?


8
উম্ম ... একটি ডেটা অ্যাডাপ্টারে পূরণ করার পদ্ধতিটি ব্যবহার করবেন?
জন ব্লেডসো

উত্তর:


159

এখানে, এটি একটি শট দিন (এটি কেবলমাত্র একটি সিডোকোড)

using System;
using System.Data;
using System.Data.SqlClient;


public class PullDataTest
{
    // your data table
    private DataTable dataTable = new DataTable();

    public PullDataTest()
    {
    }

    // your method to pull data from database to datatable   
    public void PullData()
    {
        string connString = @"your connection string here";
        string query = "select * from table";

        SqlConnection conn = new SqlConnection(connString);        
        SqlCommand cmd = new SqlCommand(query, conn);
        conn.Open();

        // create data adapter
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        // this will query your database and return the result to your datatable
        da.Fill(dataTable);
        conn.Close();
        da.Dispose();
    }
}

18
datatableক্ষেত্র কল করার আগে সক্রিয়া করা আবশ্যকda.Fill(dataTable)
Dabblernl

@ yonan2236 ডেটাটেবলের পাশে টি এসকিউএল থেকে আউটপুট পরম থাকার বিষয়ে কী? কীভাবে আউটপুট পরম পাবেন? এটা কি সম্ভব? নমুনা?
আহমদ ইব্রাহিমি

4
এই কোডটি ত্রুটির ঝুঁকিতে রয়েছে এবং উপলভ্য সংস্থানগুলি এইভাবে ব্যবহার করার পরামর্শ দেওয়া হয় না। পরিষ্কার সমাধানের জন্য দয়া করে @ টিম রজার্সের উত্তর দেখুন।
শান-কুন ক্লার্ক-ডেভিস

এগুলি ছাড়াও লিনকিউতে একবার দেখুন (যদি ইতিমধ্যে তা না থাকে) কারণ এটি এখানে সত্যিই কিছু জাদু করতে পারে :-)
শান-কুন ক্লার্ক-ডেভিস

যদিও এই কোডটি কাজ করে, ত্রুটিটি হ্যান্ডেল করতে try/catchএটি ব্যবহার করে না using()
Si8

78
var table = new DataTable();    
using (var da = new SqlDataAdapter("SELECT * FROM mytable", "connection string"))
{      
    da.Fill(table);
}

7
@ জ্যান-কুনক্লার্ক-ডেভিস: গৃহীত উত্তরের কোডটি যদি কোনও ব্যতিক্রম ছুঁড়ে দেওয়া হয় তবে উত্স ফাঁস হয়। আপনি usingযদি এর সম্পূর্ণ সমতুল্য বুঝতে পারেন তবে আপনি এতটা তুচ্ছ করতে পারবেন না ।
বেন ভয়েগট

@ জ্যান-কুনক্লার্ক-ডেভিস আপনি তুচ্ছ করবেন কেন Using?? তুচ্ছ করার মতো Withবা Try-Catch। আমি বিপরীত; কোনও শ্রেণীর দ্বারা সমর্থিত না হলে আমি হতাশ।
স্টিভসিংক

12

প্রচুর উপায়।

একটি ADD.Net ব্যবহার করুন এবং একটি ডেটা টেবিল পেতে ডেটা অ্যাডাপ্টার পূরণ করুন:

using (SqlDataAdapter dataAdapter
    = new SqlDataAdapter ("SELECT blah FROM blahblah ", sqlConn))
{
    // create the DataSet 
    DataSet dataSet = new DataSet(); 
    // fill the DataSet using our DataAdapter 
    dataAdapter.Fill (dataSet);
}

এরপরে আপনি ডেটাসেটের বাইরে ডেটা টেবিলটি পেতে পারেন।

উর্ধ্বমুখী উত্তরের ডেটাসেটে নোটটি ব্যবহার করা হয়নি, (এটি আমার উত্তর পরে প্রকাশিত হয়েছে) এটি করে

// create data adapter
SqlDataAdapter da = new SqlDataAdapter(cmd);
// this will query your database and return the result to your datatable
da.Fill(dataTable);

যা আমার কাছে পছন্দনীয়।

আমি দৃ entity়তার সাথে সত্তা কাঠামোটি দেখার পরামর্শ দিচ্ছি ... ডাটাবেটস এবং ডেটাসেট ব্যবহার করা দুর্দান্ত ধারণা নয়। এগুলিতে কোনও ধরণের সুরক্ষা নেই যার অর্থ ডিবাগিং কেবল রান টাইমে করা যেতে পারে। দৃ strongly়ভাবে টাইপযুক্ত সংগ্রহগুলির সাথে (যে আপনি লিনকুইএসএসকিউএল বা সত্তা কাঠামো ব্যবহার করে পেতে পারেন) আপনার জীবন অনেক সহজ হবে।

সম্পাদনা: সম্ভবত আমি পরিষ্কার ছিল না: ডেটাবেবলস = ভাল, ডেটাসেট = অশুভ। আপনি যদি ADO.Net ব্যবহার করে থাকেন তবে সাধারণত এডো.নেটের শীর্ষে বসে আপনি এই দুটি প্রযুক্তি (ইএফ, লিনক 2 এসকিএল, ড্যাপার, নিবারনেট, মাসের অরক) ব্যবহার করতে পারেন। আপনি যে সুবিধাটি পাবেন তা হ'ল আপনি আপনার মডেলটি এত সহজেই আপডেট করতে পারবেন যেহেতু আপনার স্কিমা পরিবর্তনগুলি সরবরাহ করে আপনি যদি কোড জেনারেশনকে বিভক্ত করে সঠিক বিমূর্তির সঠিক স্তর পান।

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


4
টাইপ করা ডেটাসেটগুলিতে EF এর মতো প্রকারের সুরক্ষা এবং দৃ strongly়ভাবে টাইপ করা সংগ্রহ রয়েছে। তবে সেগুলি কেবল তখন যখন আপনার অ্যাপ্লিকেশনটি ডাটাবেসে শক্তভাবে মিলিত হয়। আপনি যদি এমন কোনও সরঞ্জাম লিখছেন যা বিভিন্ন বিভিন্ন ডাটাবেসের সাথে কাজ করতে পারে তবে টাইপ সুরক্ষা হতাশার ইচ্ছা।
রস প্রেসার

4
নেট এ টাইপ করা ডেটাসেটগুলি এক্সএমএল পাগলামি এবং হায়রে একটি ভয়াবহ সৃষ্টি। আমি এমন কোনও জায়গায় কখনও কাজ করি নি যা মাইক্রোসফ্ট টাইপ করা ডেটাসেটের জন্য সমস্ত রক্ষণাবেক্ষণের ওভারহেডকে স্বীকার করতে ইচ্ছুক। আমি মনে করি না যে মাইক্রোসফ্টও আজকাল এর বুদ্ধিমান পরামর্শ দেয়। একাধিক ডাটাবেস সহ ধরণের সুরক্ষার ক্ষেত্রে আপনি এটি পেতে পারেন - মূল বিষয়টি হ'ল আপনি এটিকে টাইপ করা সংগ্রহকে asap এ রূপান্তর করতে পারেন এবং এটি পাস করে দেন যাতে আপনি প্রকারের সমস্যাগুলি নির্দিষ্ট জায়গায় সীমাবদ্ধ করেন। Orms এটিতে সহায়তা করবে এবং একাধিক ডাটাবেসের সাথে পুরোপুরি ভালভাবে কাজ করবে। আপনি যদি EF পছন্দ করেন না তবে ড্যাপারের মতো হালকা কিছু ব্যবহার করুন।
জন নিকোলাস

4
আপনি আমাকে বুঝতে পারেন নি। আপনি যদি কোনও সাধারণ উদ্দেশ্যমূলক সরঞ্জামটি লিখছেন যা কোন ধরণের ডাটাবেসে এটি সংযুক্ত হতে চলেছে তার কোনও ধারণা নেই, তবে সুরক্ষা টাইপ করা হতাশার ইচ্ছা।
রস প্রেসার

4
SQL দেওয়া হয়। আপনি যদি কোন ধরণের ডাটাবেস না জানেন তবে কেন এটি এমনকি একটি ডাটাবেস হতে হবে? এরকম জেনেরিক সরঞ্জামটির প্রয়োগ কী হবে? আপনার যদি কখনও ডাটাবেসের সাথে সংযোগ স্থাপনের প্রয়োজন হয় যা সত্যই এতটা আলাদা যে আপনি এটি কোনও সংগ্রহস্থল প্যাটার্নের পিছনে বিমূর্তভাবে দূরে সরিয়ে ফেলতে পারবেন এবং তারপরে আপনার আলাদা আলাদা বিশেষায়িত ডাটাবেস অ্যাডাপ্টারগুলির প্রয়োজন হবে এবং সেই সময়ে আপনি নির্দিষ্টকরণগুলি সম্পর্কে জানতে পারবেন। সত্যটি গ্রাহক কোডের ধরণের প্রত্যাশা রয়েছে -> অ্যাডাপ্টারে টাইপ assertions। আপনার সীমাবদ্ধতার অর্থ আপনার ডাটাবেস ভাষা সম্পর্কে কোনও ধারণা নেই এবং তাই জিজ্ঞাসা করতে পারবেন না।
জন নিকোলাস

4
মনে করুন আপনি কোনও এসএমএস ক্লোন লিখছেন?
রস প্রেসার

9

বিক্রেতা স্বতন্ত্র সংস্করণ, কেবলমাত্র ADO.NET ইন্টারফেসের উপর নির্ভর করে; 2 উপায়:

public DataTable Read1<T>(string query) where T : IDbConnection, new()
{
    using (var conn = new T())
    {
        using (var cmd = conn.CreateCommand())
        {
            cmd.CommandText = query;
            cmd.Connection.ConnectionString = _connectionString;
            cmd.Connection.Open();
            var table = new DataTable();
            table.Load(cmd.ExecuteReader());
            return table;
        }
    }
}

public DataTable Read2<S, T>(string query) where S : IDbConnection, new() 
                                           where T : IDbDataAdapter, IDisposable, new()
{
    using (var conn = new S())
    {
        using (var da = new T())
        {
            using (da.SelectCommand = conn.CreateCommand())
            {
                da.SelectCommand.CommandText = query;
                da.SelectCommand.Connection.ConnectionString = _connectionString;
                DataSet ds = new DataSet(); //conn is opened by dataadapter
                da.Fill(ds);
                return ds.Tables[0];
            }
        }
    }
}

আমি কিছু পারফরম্যান্স টেস্টিং করেছি এবং দ্বিতীয় পদ্ধতিটি সর্বদা প্রথমটিকে ছাড়িয়ে যায়।

Stopwatch sw = Stopwatch.StartNew();
DataTable dt = null;
for (int i = 0; i < 100; i++)
{
    dt = Read1<MySqlConnection>(query); // ~9800ms
    dt = Read2<MySqlConnection, MySqlDataAdapter>(query); // ~2300ms

    dt = Read1<SQLiteConnection>(query); // ~4000ms
    dt = Read2<SQLiteConnection, SQLiteDataAdapter>(query); // ~2000ms

    dt = Read1<SqlCeConnection>(query); // ~5700ms
    dt = Read2<SqlCeConnection, SqlCeDataAdapter>(query); // ~5700ms

    dt = Read1<SqlConnection>(query); // ~850ms
    dt = Read2<SqlConnection, SqlDataAdapter>(query); // ~600ms

    dt = Read1<VistaDBConnection>(query); // ~3900ms
    dt = Read2<VistaDBConnection, VistaDBDataAdapter>(query); // ~3700ms
}
sw.Stop();
MessageBox.Show(sw.Elapsed.TotalMilliseconds.ToString());

Read1চোখের দিকে আরও ভাল দেখায়, তবে ডেটা অ্যাডাপ্টার আরও ভাল পারফর্ম করে (বিভ্রান্ত না করে যে একটি ডিবি অন্যটিকে ছাড়িয়ে গেছে, অনুসন্ধানগুলি সমস্ত আলাদা ছিল)। উভয়ের মধ্যে পার্থক্য যদিও প্রশ্নের উপর নির্ভরশীল। এর কারণটি হ'ল ড্যাটাএডাপ্টারে থাকাকালীন সারিগুলি যুক্ত করার সময় ডকুমেন্টেশন থেকেLoad বিভিন্ন সীমাবদ্ধতা পরীক্ষা করা প্রয়োজন (এটি একটি পদ্ধতি ) যা কেবলমাত্র তার জন্য ডিজাইন করা হয়েছিল - ডেটা টেবিলগুলির দ্রুত তৈরি।DataTableFill


4
আপনি ঘিরা প্রয়োজন DataTable.Load()সঙ্গে .BeginLoadData()এবং .EndLoadData()সঙ্গে হিসাবে একই গতি অর্জন করা DataSet
নিকোলা বোগদানোভিć

1

কেন্দ্রভিত্তিক মডেল: আপনি যে কোনও জায়গা থেকে এটি ব্যবহার করতে পারেন!

আপনার ফাংশন থেকে এই ক্লাসে আপনাকে কেবল বিন্যাসের নীচে কল করতে হবে

DataSet ds = new DataSet();
SqlParameter[] p = new SqlParameter[1];
string Query = "Describe Query Information/either sp, text or TableDirect";
DbConnectionHelper dbh = new DbConnectionHelper ();
ds = dbh. DBConnection("Here you use your Table Name", p , string Query, CommandType.StoredProcedure);

এটাই. এটা নিখুঁত পদ্ধতি।

public class DbConnectionHelper {
   public DataSet DBConnection(string TableName, SqlParameter[] p, string Query, CommandType cmdText) {
    string connString = @ "your connection string here";
    //Object Declaration
    DataSet ds = new DataSet();
    SqlConnection con = new SqlConnection();
    SqlCommand cmd = new SqlCommand();
    SqlDataAdapter sda = new SqlDataAdapter();
    try {
     //Get Connection string and Make Connection
     con.ConnectionString = connString; //Get the Connection String
     if (con.State == ConnectionState.Closed) {
      con.Open(); //Connection Open
     }
     if (cmdText == CommandType.StoredProcedure) //Type : Stored Procedure
     {
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.CommandText = Query;
      if (p.Length > 0) // If Any parameter is there means, we need to add.
      {
       for (int i = 0; i < p.Length; i++) {
        cmd.Parameters.Add(p[i]);
       }
      }
     }
     if (cmdText == CommandType.Text) // Type : Text
     {
      cmd.CommandType = CommandType.Text;
      cmd.CommandText = Query;
     }
     if (cmdText == CommandType.TableDirect) //Type: Table Direct
     {
      cmd.CommandType = CommandType.Text;
      cmd.CommandText = Query;
     }
     cmd.Connection = con; //Get Connection in Command
     sda.SelectCommand = cmd; // Select Command From Command to SqlDataAdaptor
     sda.Fill(ds, TableName); // Execute Query and Get Result into DataSet
     con.Close(); //Connection Close
    } catch (Exception ex) {

     throw ex; //Here you need to handle Exception
    }
    return ds;
   }
  }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.