SQLDataReader থেকে ডেটা পড়ুন


157

আমার একটি এসকিউএল সার্ভার ২০০৮ ডাটাবেস রয়েছে এবং আমি এটিতে ব্যাকএন্ডে কাজ করছি। আমি asp.net/C# তে কাজ করছি

SqlDataReader rdr = cmd.ExecuteReader();  
while (rdr.Read())  
{              
   //how do I read strings here????  
}  

আমি জানি পাঠকের মূল্যবোধ রয়েছে। আমার এসকিউএল কমান্ডটি কোনও টেবিল থেকে মাত্র 1 কলাম নির্বাচন করতে হবে। কলামটিতে কেবল স্ট্রিং রয়েছে। আমি এক এক করে পাঠকের স্ট্রিং (সারি) পড়তে চাই। আমি এটা কিভাবে করবো?

উত্তর:


154
using(SqlDataReader rdr = cmd.ExecuteReader())
{
    while (rdr.Read())
    {
        var myString = rdr.GetString(0); //The 0 stands for "the 0'th column", so the first column of the result.
        // Do somthing with this rows string, for example to put them in to a list
        listDeclaredElsewhere.Add(myString);
    }
}

106
string col1Value = rdr["ColumnOneName"].ToString();

অথবা

string col1Value = rdr[0].ToString();

এগুলি objectহ'ল, সুতরাং আপনাকে এগুলি নিক্ষেপ করতে হবে বা .ToString()


3
[] অপারেটর কোনও জিনিস ফেরত দেয়, আপনাকে এটি স্ট্রিং হিসাবে কাস্ট করতে হবে।
স্কট চেম্বারলাইন

আপনি যদি পাঠকের মতো সূচি ব্যবহার করেন GGETString (0) এটি আপনার ক্যোয়ারিতে আপনি নির্বাচিত প্রথম কলাম বা টেবিলের প্রথম কলামটি ব্যবহার করবে। আমার কাছে 3 টি কলামযুক্ত একটি টেবিল রয়েছে: আইডি, দির, ইমেল। আমার কমান্ড dir এবং ইমেল নির্বাচন করে। পাঠক.গেটস্ট্রিং (0) দির বা আইডি পুনরুদ্ধার করবে? সূচিগুলি কি এসকিউএল সার্ভারে টেবিলের বাইরে ভিত্তি করে আছে বা কোনও সারণী থেকে কলামগুলি নির্বাচন করতে আপনি যে প্রশ্নটি সম্পাদন করেছেন তা বন্ধ রয়েছে?
shenk

1
@ শ্যাঙ্ক সূচকগুলি আপনার নির্বাচিত পরামিতিগুলির ক্রমের ভিত্তিতে তৈরি। যেভাবেই হোক, আপনি কলামের নাম বা উপকরণগুলি (যেমন rdr ["আইডি"] ব্যবহার করে
রদির

1
@ মারকএভেনিয়াস এটি আগে ব্যবহার করতেন যে সংখ্যাসূচক অর্ডিনালগুলির মাধ্যমে সূচীকরণ কলামের নাম /
উপাধিকারের

3
@ বাল্টোস্টার যা আকর্ষণীয়; আমি এটা সম্পর্কে অবগত ছিল না। তবে, পারফরম্যান্সের পার্থক্যের উপর নির্ভর করে (বিশেষত আপনার অ্যাপ্লিকেশনটির ভিত্তিতে তারের উপরে ডেটা ঠেলে দেওয়ার তুলনায়) আমি সাধারণত বলব যে কলামের নামগুলি দেখতে পঠনযোগ্যতা এবং রক্ষণাবেক্ষণ দক্ষতার সাথে কোনও প্রান্তিক উন্নতি ঘটবে। ধন্যবাদ!
মার্চ এভিনিয়াস

36

কলামের নামটি যেখানে "ColumnName"রয়েছে ডাটাবেস থেকে ফিরে আসা শুরু করুন । যদি এটি স্ট্রিং হয় তবে আপনি ব্যবহার করতে পারেন .ToString()। যদি এটি অন্য ধরণের হয় তবে আপনাকে এটি ব্যবহার করে রূপান্তর করতে হবে System.Convert

SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
    string column = rdr["ColumnName"].ToString();
    int columnValue = Convert.ToInt32(rdr["ColumnName"]);
}

23
while(rdr.Read())
{
   string col=rdr["colName"].ToString();
}

এটা কাজ করবে


3
toString()বৈধ নয় .ToString()কেবল
fyi

1
@ মেথডম্যান আপনার তথ্যের জন্য ধন্যবাদ। আপনার পরামর্শ অনুসারে আমি আমার উত্তর সম্পাদনা করেছি।
মোহিনী মাহেত্রে

এইচআই, আমি কলামটি কলাম দ্বারা না করে কীভাবে বস্তু হিসাবে সারি পাব? উদাহরণস্বরূপ {আইডি: 1, নাম: 'জন'}
বিনসোই

আমি যদি নীচের মতো কিছু চাই if (rdr [0]) {// এখানে কিছু করুন} অন্যথায় যদি (আরডিআর [1]) {// এখানে কিছু করুন} আমি এটিকে বুল করার চেষ্টা করেছি কিন্তু এটি আক্রমণাত্মক castালাইয়ের ত্রুটি দেয়
ফাহাদ এজাজ বাট

16

একক ফলাফলের জন্য:

if (reader.Read())
{
    Response.Write(reader[0].ToString());
    Response.Write(reader[1].ToString());
}

একাধিক ফলাফলের জন্য:

while (reader.Read())
{
    Response.Write(reader[0].ToString());
    Response.Write(reader[1].ToString());
}

15

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

public static class Sql
{
    public static T Read<T>(DbDataReader DataReader, string FieldName)
    {
        int FieldIndex;
        try { FieldIndex = DataReader.GetOrdinal(FieldName); }
        catch { return default(T); }

        if (DataReader.IsDBNull(FieldIndex))
        {
            return default(T);
        }
        else
        {
            object readData = DataReader.GetValue(FieldIndex);
            if (readData is T)
            {
                return (T)readData;
            }
            else
            {
                try
                {
                    return (T)Convert.ChangeType(readData, typeof(T));
                }
                catch (InvalidCastException)
                {
                    return default(T);
                }
            }
        }
    }
}

ব্যবহার:

cmd.CommandText = @"SELECT DISTINCT [SoftwareCode00], [MachineID] 
                    FROM [CM_S01].[dbo].[INSTALLED_SOFTWARE_DATA]";
using (SqlDataReader data = cmd.ExecuteReader())
{
    while (data.Read())
    {
        usedBy.Add(
            Sql.Read<String>(data, "SoftwareCode00"), 
            Sql.Read<Int32>(data, "MachineID"));
    }
}

সহায়ক পদ্ধতিটি আপনার পছন্দ অনুযায়ী যে কোনও মানকে কাস্ট করে, যদি এটি কাস্ট করতে না পারে বা ডাটাবেসের মানটি NULL হয় তবে ফলাফলটি শূন্য হবে।


2
কোডের টুকরো টুকরো, আমি এটিকে একটি এক্সটেনশন পদ্ধতি হিসাবে পরিবর্তিত করেছি এবং খুব ভালভাবে কাজ করেreader.GetColumn<int>("M_ID");
আলী উমাইয়ার

8

প্রকৃতপক্ষে, আমি নিজেই বুঝতে পেরেছিলাম যে আমি এটি করতে পারি:

while (rdr.read())
{  
  string str = rdr.GetValue().ToString().Trim();  
}

1
অন্যদের চেয়ে এই পদ্ধতিটি কীভাবে জটিল তা আমি দেখতে পাচ্ছি না। Trim()প্রশ্নে উল্লেখ করা হয়নি এবং অন্য উত্তরগুলিতেও এখানে নেই।
jwg

7

আমি জানি এটি এক প্রকারের পুরানো তবে আপনি যদি কোনও স্ক্ল্যাডেটাআরডার বিষয়বস্তুকে একটি শ্রেণিতে পড়েন তবে এটি খুব সহজ হবে। পাঠক এবং শ্রেণীর কলামের নাম একই হওয়া উচিত

public static List<T> Fill<T>(this SqlDataReader reader) where T : new()
        {
            List<T> res = new List<T>();
            while (reader.Read())
            {
                T t = new T();
                for (int inc = 0; inc < reader.FieldCount; inc++)
                {
                    Type type = t.GetType();
                    string name = reader.GetName(inc);
                    PropertyInfo prop = type.GetProperty(name);
                    if (prop != null)
                    {
                        if (name == prop.Name)
                        {
                            var value = reader.GetValue(inc);
                            if (value != DBNull.Value)
                            { 
                                prop.SetValue(t, Convert.ChangeType(value, prop.PropertyType), null);
                            }
                            //prop.SetValue(t, value, null);

                        }
                    }
                }
                res.Add(t);
            }
            reader.Close();

            return res;
        }

এটি উত্তর প্রস্তাবিত করা উচিত। টাইপ করা তালিকার ফিরে আসার খুব সাধারণ উপায়।
কোটপাল

7

আমি এখানে ব্যবহারের বিরুদ্ধে তর্ক করব SqlDataReader; ADO.NET এ প্রচুর প্রান্তের মামলা এবং জটিলতা রয়েছে এবং আমার অভিজ্ঞতায় সবচেয়ে বেশি নিজে হাতে লিখিত ADO.NET কোডটি কমপক্ষে একটি উপায়ে (সাধারণত সূক্ষ্ম এবং প্রাসঙ্গিক) ভাঙা হয় ।

এটি এড়াতে সরঞ্জামগুলি বিদ্যমান। উদাহরণস্বরূপ, এখানে ক্ষেত্রে আপনি স্ট্রিংগুলির একটি কলাম পড়তে চান। ডাপার এটি সম্পূর্ণ বেদনাদায়ক করে তোলে:

var region = ... // some filter
var vals = connection.Query<string>(
    "select Name from Table where Region=@region", // query
    new { region } // parameters
).AsList();

ডাপার এখানে সমস্ত প্যারামিটারাইজেশন, এক্সিকিউশন এবং সারি প্রক্রিয়াজাতকরণ - এবং ADO.NET এর প্রচুর অন্যান্য গ্রানির বিবরণ নিয়ে কাজ করছে। <string>সঙ্গে প্রতিস্থাপিত হতে পারে <SomeType>বস্তু মধ্যে সমগ্র সারি সত্যে পরিণত করতে।


6

সরল পদগুলিতে, যদি আপনার কোয়েরিটি কলাম_নামটি ফেরত দেয় এবং এতে একটি স্ট্রিং থাকে:

while (rdr.Read())
{
    string yourString = rdr.getString("column_name")
}

1
বর্তমানে পাঠকের উপর .getXXX পদ্ধতিগুলি কেবল একটি পূর্ণসংখ্যার অর্ডিনাল গ্রহণ করে।
কোস ক্যালিস

3

আমার মতো একটি সহায়ক ফাংশন রয়েছে:

  public static string GetString(object o)
    {
        if (o == DBNull.Value)
            return "";

        return o.ToString();
    }

তারপরে আমি স্ট্রিংটি নিষ্কাশন করতে এটি ব্যবহার করি:

 tbUserName.Text = GetString(reader["UserName"]);

1
স্ট্যান্ডার্ড কনভার্ট.টস্ট্রিং (ও) একই কাজ করে, কারণ ডিবিএনল আইকনভারটিবল, এবং ডিবিনুল.টসস্ট্রিং () স্ট্রিং.এম্পটি প্রদান করে।
nzeemin

আপনি সঠিক, তবে আমি নিশ্চিত নই যে এটি পোস্ট করার সময় এটি এটি করেছিল।
জেব্রুকস

3

আমি সাধারণত এইভাবে ডেটা রিডার দ্বারা ডেটা পড়ি। শুধু একটি ছোট উদাহরণ যুক্ত।

string connectionString = "Data Source=DESKTOP-2EV7CF4;Initial Catalog=TestDB;User ID=sa;Password=tintin11#";
string queryString = "Select * from EMP";

using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand(queryString, connection))
            {
                connection.Open();

                using (SqlDataReader reader = command.ExecuteReader())
                {
                    if (reader.HasRows)
                    {
                        while (reader.Read())
                        {
                            Console.WriteLine(String.Format("{0}, {1}", reader[0], reader[1]));
                        }
                    }
                    reader.Close();
                }
            }

1

আপনি read database columnএখানে আছে। নিম্নলিখিত কোড স্নিপেট আপনি দেখতে পারেন

                string connectionString = ConfigurationManager.ConnectionStrings["NameOfYourSqlConnectionString"].ConnectionString;
                using (var _connection = new SqlConnection(connectionString))
                {
                    _connection.Open();

                    using (SqlCommand command = new SqlCommand("SELECT SomeColumnName FROM TableName", _connection))
                    {

                        SqlDataReader sqlDataReader = command.ExecuteReader();
                        if (sqlDataReader.HasRows)
                        {
                            while (sqlDataReader.Read())
                            {
                                string YourFirstDataBaseTableColumn = sqlDataReader["SomeColumn"].ToString(); // Remember Type Casting is required here it has to be according to database column data type
                                string YourSecondDataBaseTableColumn = sqlDataReader["SomeColumn"].ToString();
                                string YourThridDataBaseTableColumn = sqlDataReader["SomeColumn"].ToString();

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