อ่านข้อมูลจาก SqlDataReader


157

ฉันมีฐานข้อมูล SQL Server 2008 และฉันกำลังทำงานอยู่ในส่วนแบ็คเอนด์ ฉันกำลังทำงานกับ asp.net/C#

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

ฉันรู้ว่าผู้อ่านมีค่า คำสั่ง SQL ของฉันคือการเลือกเพียง 1 คอลัมน์จากตาราง คอลัมน์มีสตริงเท่านั้น ฉันต้องการอ่านสตริง (แถว) ในเครื่องอ่านทีละตัว ฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:



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

หรือ

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

เหล่านี้เป็นobjects .ToString()ดังนั้นคุณต้องทั้งโยนพวกเขาหรือ


3
โอเปอเรเตอร์ [] ส่งคืนออบเจ็กต์คุณจะต้องส่งมันเป็นสตริง
Scott Chamberlain

หากคุณใช้ดัชนีเช่น reader.GetString (0) มันจะใช้คอลัมน์แรกที่คุณเลือกในแบบสอบถามหรือคอลัมน์แรกของคุณในตาราง ฉันมีตารางที่มี 3 คอลัมน์ตามลำดับ: ID, Dir, Email คำสั่งของฉันเลือก dir และอีเมล reader.GetStrting (0) จะดึง dir หรือ ID หรือไม่ ดัชนีอิงตามตารางตัวเองบน SQL Server หรือไม่จากแบบสอบถามที่คุณดำเนินการเพื่อเลือกคอลัมน์จากตารางหรือไม่?
shenk

1
@shenk ดัชนีอิงตามลำดับพารามิเตอร์ที่คุณเลือก ไม่ว่าจะด้วยวิธีใดคุณควรใช้ชื่อคอลัมน์หรือชื่อแทน (เช่น rdr ["ID"] แทนที่จะเป็น rdr [0])
ทำเครื่องหมาย Avenius

1
@ MarkAvenius มันเคยเป็นดัชนีที่ผ่านตัวเลขที่ได้รับการปรับปรุงประสิทธิภาพการทำงานมากกว่าชื่อคอลัมน์ / นามแฝง - ไม่แน่ใจว่ายังคงเป็นกรณี
BaltoStar

3
@BaltoStar ที่น่าสนใจ; ฉันไม่ทราบว่า อย่างไรก็ตามขึ้นอยู่กับความแตกต่างของประสิทธิภาพ (โดยเฉพาะอย่างยิ่งเมื่อเทียบกับการผลักข้อมูลผ่านสายสัญญาณตามแอปพลิเคชันของคุณ) โดยทั่วไปแล้วฉันจะบอกว่าความสามารถในการอ่านและการบำรุงรักษาของการดูชื่อคอลัมน์ ขอบคุณ!
Mark Avenius

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
MethodMan

1
@MethodMan ขอบคุณสำหรับข้อมูลของคุณ ฉันแก้ไขคำตอบของฉันตามคำแนะนำของคุณ
Mohini Mhetre

สวัสดี, ฉันจะทำให้แถวเป็นวัตถุได้อย่างไรและไม่ใช่คอลัมน์? ตัวอย่างเช่น {id: 1 ชื่อ: 'John'}
Binsoi

ถ้าฉันต้องการบางสิ่งเช่นด้านล่าง ถ้า (rdr [0]) {// ทำอะไรที่นี่} อื่นถ้า (rdr [1]) {// ทำอะไรที่นี่} ฉันได้ลองโยนมันบูล แต่มันให้ข้อผิดพลาดในการร่าย Invaild
Fahad Ejaz Butt

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");
Ali Umair

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

คำตอบนี้ควรจะแนะนำ วิธีทั่วไปมากในการส่งคืนรายการที่พิมพ์
kotpal

7

ฉันจะโต้แย้งกับการใช้SqlDataReaderที่นี่; ADO.NET มีจำนวนมากของกรณีขอบและภาวะแทรกซ้อนและในประสบการณ์ของผมมากที่สุดรหัส ADO.NET เขียนด้วยตนเองเสียในอย่างน้อยหนึ่งวิธีที่ (มักจะละเอียดและบริบท)

มีเครื่องมือเพื่อหลีกเลี่ยงปัญหานี้ ตัวอย่างเช่นในกรณีที่นี่คุณต้องการอ่านคอลัมน์ของสตริง Dapperทำให้เจ็บปวดอย่างสมบูรณ์:

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

ในเงื่อนไขที่ง่ายที่สุดถ้าแบบสอบถามของคุณส่งคืน column_name และมีสตริงอยู่:

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
ตัวแปลงมาตรฐาน ToString (o) ทำเช่นเดียวกันเนื่องจาก DBNull เป็น IConvertible และ DBNull.ToString () จะส่งคืนสตริง
nzeemin

คุณถูกต้อง แต่ฉันไม่แน่ใจว่ามันทำอย่างนั้นเมื่อฉันโพสต์สิ่งนี้
JBrooks

3

ฉันมักจะอ่านข้อมูลโดย data reader ด้วยวิธีนี้ เพิ่งเพิ่มตัวอย่างเล็ก ๆ

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.