SqlDataReader से डेटा पढ़ें


157

मेरे पास SQL ​​Server 2008 डेटाबेस है और मैं बैकएंड में इस पर काम कर रहा हूं। मैं 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
[] ऑपरेटर एक वस्तु लौटाता है, आपको इसे एक स्ट्रिंग के रूप में डालना होगा।
स्कॉट चैंबरलेन

यदि आप रीडर जैसे इंडेक्स का उपयोग करते हैं। गेटस्ट्रिंग (0) यह आपके क्वेरी में चुने गए पहले कॉलम या टेबल पर पहले कॉलम का उपयोग करेगा। मेरे पास क्रम में 3 कॉलम के साथ एक तालिका है: आईडी, डिर, ईमेल। मेरी कमांड डीआईआर और ईमेल का चयन करती है। क्या रीडर .GetStrting (0) डीआईआर या आईडी प्राप्त करेगा? क्या अनुक्रमणिका तालिका से स्वयं SQL सर्वर पर आधारित हैं या किसी तालिका से स्तंभों का चयन करने के लिए आपके द्वारा निष्पादित क्वेरी से दूर हैं?
५:५५ पर शेंक

1
@ शेंक अनुक्रमणिका आपके चुनिंदा मापदंडों के क्रम पर आधारित होती है। किसी भी तरह से, आप स्तंभ नाम या उपनाम (यानी rdr ["ID"] का उपयोग करने से बेहतर हैं, जैसा कि rdr [0])
के विपरीत

1
@MarkAvenius यह हुआ करता था कि संख्यात्मक अध्यादेशों के माध्यम से अनुक्रमण ने स्तंभ नामों / उपनामों पर एक प्रदर्शन सुधार प्राप्त किया - सुनिश्चित नहीं कि अगर अभी भी मामला है
BaltoStar

3
@BaltoStar दिलचस्प है; मुझे इसकी जानकारी नहीं थी। हालाँकि, प्रदर्शन में अंतर के आधार पर (विशेष रूप से तार पर डेटा को धक्का देने की तुलना में, आपके आवेदन के आधार पर) मैं आमतौर पर कहूंगा कि स्तंभ के नामों को देखने की पठनीयता और बनाए रखने से प्रदर्शन में कोई मामूली सुधार होगा। धन्यवाद!
मार्क एवेनियस

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()बस
फीकी

1
@MethodMan आपकी जानकारी के लिए धन्यवाद। मैंने आपके सुझाव के अनुसार अपना उत्तर संपादित किया।
मोहिनी म्हत्रे

नमस्ते, मैं पंक्ति को वस्तुओं के रूप में कैसे प्राप्त करूं और कॉलम द्वारा नहीं? उदाहरण के लिए {आईडी: 1, नाम: 'जॉन'}
बिनसोई

क्या होगा अगर मुझे नीचे जैसा कुछ चाहिए। if (rdr [0]) {// कुछ यहां करें} अगर (rdr [1]) {// कुछ यहां करें} मैंने इसे बूल कास्ट करने की कोशिश की थी, लेकिन इसके द्वारा इनवैलिड कास्ट एरर दिया गया
फहद एजाज बट

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"));
    }
}

सहायक विधि आपके किसी भी मान को पसंद करती है, यदि वह डाली नहीं जा सकती है या डेटाबेस मूल्य शून्य है, तो परिणाम शून्य होगा।


2
कोड का अच्छा टुकड़ा, मैंने इसे एक विस्तार विधि के रूप में संशोधित किया और बहुत अच्छी तरह से काम करता हैreader.GetColumn<int>("M_ID");
अली उमैर

8

वास्तव में, मुझे लगा कि मैं ऐसा कर सकता हूं:

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

1
मैं यह नहीं देखता कि यह दृष्टिकोण दूसरों की तुलना में अधिक जटिल कैसे है। Trim()प्रश्न में उल्लेख नहीं किया गया था और इसलिए यहाँ है लेकिन अन्य उत्तरों में नहीं।
jwg

7

मुझे पता है कि यह एक प्रकार का पुराना है लेकिन यदि आप SqlDataReader की सामग्री को एक कक्षा में पढ़ रहे हैं, तो यह बहुत काम आएगा। पाठक और वर्ग के कॉलम नाम समान होने चाहिए

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();

यहाँ Dapper सभी मापदंडों, निष्पादन और पंक्ति प्रसंस्करण के साथ काम कर रहा है - और ADO.NET के अन्य बहुत सारे बारीक विवरण। <string>साथ बदला जा सकता <SomeType>वस्तुओं में पूरे पंक्तियों अमल में लाना करने के लिए।


6

सरल शब्दों में, यदि आपकी क्वेरी कॉलम_नाम लौटाती है और यह एक स्ट्रिंग रखती है:

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

1
वर्तमान में .getXXX विधियों पर पाठक केवल पूर्णांक अध्यादेश को स्वीकार करते हैं।
Cos Callis

3

मेरे पास एक सहायक कार्य है:

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

        return o.ToString();
    }

तो मैं इसे स्ट्रिंग निकालने के लिए उपयोग करता हूं:

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

1
Standard Convert.ToString (o) यही करता है, क्योंकि DBNull IConvertible है, और DBNull.ToString () string.Empty देता है।
नजीमिन

आप सही हैं, लेकिन मुझे यकीन नहीं है कि जब मैंने यह पोस्ट किया था तो यह किया था।
JBrooks

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();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.