SqlDataReader'dan veri okuma


157

Bir SQL Server 2008 veritabanım var ve arka uç üzerinde çalışıyorum. Asp.net/C# üzerinde çalışıyorum

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

Okuyucunun değerleri olduğunu biliyorum. SQL komutum bir tablodan yalnızca 1 sütun seçmektir. Sütun SADECE dizeler içeriyor. Okuyucudaki dizeleri (satırları) tek tek okumak istiyorum. Bunu nasıl yaparım?

Yanıtlar:


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

veya

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

Bunlar objects, bu yüzden onları ya atmanız gerekiyor .ToString().


3
[] operatörü bir nesneyi döndürürse onu bir dize olarak yayınlamanız gerekir.
Scott Chamberlain

Reader.GetString (0) gibi dizinler kullanırsanız, sorgunuzda seçtiğiniz ilk sütunu veya tablodaki firstt sütununu kullanır. Sırayla 3 sütun içeren bir tablo var: ID, Dir, Email. Komutum dir ve email'i seçiyor. Reader.GetStrting (0) dizini veya kimliğini alacak mı? Dizinler SQL Server'da tablonun kendisini mi yoksa tablodan sütun seçmek için yürüttüğünüz sorguyu temel alıyor mu?
shenk

1
@shenk Dizinler, seçtiğiniz parametrelerin sırasını temel alır. Her iki durumda da, sütun adlarını veya takma adlarını (rdr [0] yerine rdr ["ID"]) kullanmanız daha iyi olur
Mark Avenius

1
@MarkAvenius eskiden sayısal sıralamalar yoluyla endekslemenin sütun adları / takma adları üzerinde bir performans artışı sağladığını düşünüyordum - durumun bu olup olmadığından emin değilim
BaltoStar

3
@BaltoStar ilginç; Bunun farkında değildim. Bununla birlikte, performans farkına bağlı olarak (özellikle uygulamanıza bağlı olarak verilerin kablo üzerinden itilmesine kıyasla) genellikle sütun adlarını görmenin okunabilirliğinin ve sürdürülebilirliğinin performansta herhangi bir marjinal iyileşmeyi engelleyeceğini söyleyebilirim. Teşekkürler!
Mark Avenius

36

Kolonun adını koyduğunuz veritabanından başlayacaktır "ColumnName". Bir dize ise kullanabilirsiniz .ToString(). Başka bir türse, kullanarak dönüştürmeniz gerekir 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();
}

işe yarayacak


3
toString()geçerli değil .ToString()sadece
fyi

1
@MethodMan bilgi için teşekkürler. Cevabınızı önerilerinize göre düzenledim.
Mohini Mhetre

HI, Satırı sütun olarak değil, nesne olarak nasıl alabilirim? Örneğin, {id: 1, ad: 'John'}
Binsoi

aşağıdaki gibi bir şey istiyorum. if (rdr [0]) {// burada bir şey yap} else eğer (rdr [1]) {// burada bir şey yap} Bool'u atmaya çalışmıştım ama bu invaild döküm hatası veriyor
Fahad Ejaz Butt

16

Tek bir sonuç için:

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

Birden çok sonuç için:

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

15

Bunu kullanabilenler için yardımcı yöntemimi paylaşmayı düşündüm:

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

Kullanımı:

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

Yardımcı yöntem istediğiniz herhangi bir değere yayın yapar, yayınlanamazsa veya veritabanı değeri NULL ise sonuç null olur.


2
Güzel kod parçası, ben bir uzatma yöntemi olarak değiştirilmiş ve çok iyi çalışıyorreader.GetColumn<int>("M_ID");
Ali Umair

8

Aslında bunu yapabileceğimi kendim anladım:

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

1
Bu yaklaşımın diğerlerinden daha karmaşık olduğunu görmüyorum. Trim()soruda bahsedilmedi ve burada da var ama diğer cevaplarda değil.
jwg

7

Bu tür eski biliyorum ama bir SqlDataReader içeriğini bir sınıfa okuyorsanız, o zaman bu çok kullanışlı olacaktır. okuyucu ve sınıfın sütun adları aynı olmalıdır

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

Bu cevap tavsiye edilmelidir. Yazılan bir liste döndürmek için çok genel bir yol.
kotpal

7

Burada kullanmaya karşı çıkarım SqlDataReader; ADO.NET'in birçok uç vakası ve komplikasyonu vardır ve deneyimlerime göre en elle yazılmış ADO.NET kodu en az bir şekilde (genellikle ince ve bağlamsal) bozulur .

Bundan kaçınmak için araçlar mevcuttur. Örneğin, burada, bir dize sütunu okumak istersiniz. Dapper bunu tamamen ağrısız hale getirir:

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

Dapper burada tüm parametrelendirme, yürütme ve satır işleme ile ve ADO.NET'in diğer birçok grungy ayrıntısıyla ilgileniyor. <string>İle değiştirilebilir <SomeType>nesneler içine tüm satırları hayata geçirilmesi.


6

En basit terimlerle, sorgunuz sütun_adı döndürürse ve bir dize tutarsa:

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

1
Şu anda okuyucudaki .getXXX yöntemleri yalnızca tamsayı sıralamasını kabul etmektedir.
Cos Callis

3

Ben gibi bir yardımcı işlevi var:

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

        return o.ToString();
    }

sonra dize ayıklamak için kullanın:

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

1
DBNull IConvertible olduğundan ve DBNull.ToString () string.Empty döndürdüğünden, standart Convert.ToString (o) aynı şeyi yapar.
nzeemin

Haklısın, ama bunu gönderdiğimde bunu yaptığından emin değilim.
JBrooks

3

Genellikle veri okuyucu tarafından bu şekilde veri okurum. küçük bir örnek ekledim.

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

Buraya read database columngelmelisin. Aşağıdaki kod snippet'ine bir göz atabilirsiniz

                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();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.