SqlDataReader에서 데이터 읽기


157

SQL Server 2008 데이터베이스가 있고 백엔드에서 작업 중입니다. asp.net/C#에서 일하고 있습니다.

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

독자에게는 가치가 있다는 것을 알고 있습니다. 내 SQL 명령은 테이블에서 하나의 열만 선택하는 것입니다. 열에는 문자열 만 포함됩니다. 독자의 문자열 (행)을 하나씩 읽고 싶습니다. 어떻게해야합니까?

답변:


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
[] 연산자는 객체를 반환하므로 문자열로 캐스팅해야합니다.
Scott Chamberlain

reader.GetString (0)과 같은 인덱스를 사용하면 쿼리에서 선택한 첫 번째 열이나 테이블의 첫 번째 열을 사용합니다. ID, Dir, Email의 3 개의 열이있는 테이블이 있습니다. 내 명령은 dir과 email을 선택합니다. reader.GetStrting (0)이 dir 또는 ID를 검색합니까? 인덱스는 SQL Server의 테이블 자체 또는 테이블에서 열을 선택하기 위해 실행 한 쿼리를 기반으로합니까?
shenk

1
@shenk 색인은 선택 매개 변수의 순서를 기반으로합니다. 어느 쪽이든, 열 이름 또는 별명 (예 : rdr [0]이 아닌 rdr [ "ID"])을 사용하는 것이 좋습니다.
Mark Avenius

1
@MarkAvenius 이전에는 숫자 서수를 통한 인덱싱이 열 이름 / 별칭보다 성능이 향상되었다는 사실이
밝혀졌습니다.

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, name : 'John'}
Binsoi

아래와 같은 것을 원하면 어떻게해야합니까? 경우 (RDR [0]) {// 여기에 뭔가를 할} 다른 경우 (RDR [1]) {// 여기에 뭔가를 할} 나는 bool에 캐스팅하려고했지만, 그는 invaild 캐스트 오류를 제공
파하드 Ejaz 엉덩이

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
DBNull이 IConvertible이고 DBNull.ToString ()이 string.Empty를 반환하므로 표준 Convert.ToString (o)도 동일하게 수행됩니다.
nzeemin

당신은 정확하지만 이것을 게시했을 때 그렇게했는지 확실하지 않습니다.
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();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.