programing

SqlDataReader에서 데이터 읽기

mbctv 2023. 4. 21. 21:17
반응형

SqlDataReader에서 데이터 읽기

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

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

나는 독자가 가치를 가지고 있다는 것을 안다.내 SQL 명령은 테이블에서 열을 하나만 선택하는 것입니다.열에는 문자열만 포함됩니다.나는 독자의 줄을 하나씩 읽고 싶다.이거 어떻게 해?

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);
    }
}
string col1Value = rdr["ColumnOneName"].ToString();

또는

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

이것들은objects, 그러니까 캐스팅을 하거나.ToString().

데이터베이스에서 반환된 시작 열의 이름을 입력합니다."ColumnName"스트링일 경우 를 사용할 수 있습니다..ToString()다른 타입의 경우는, 다음의 방법으로 변환할 필요가 있습니다.System.Convert.

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

효과가 있을 것이다

도우미 방법을 사용할 수 있는 사람에게 공유하려고 합니다.

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이면 결과가 NULL이 됩니다.

단일 결과:

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

오래된 내용인 것은 알지만 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;
        }

나는 그것을 사용하는 것에 반대한다.SqlDataReader여기, ADO.NET에는 많은 엣지 케이스와 복잡성이 있으며, 제 경험상 ADO는 가장 수동으로 작성되었습니다.NET 코드는 적어도1가지 방법(통상, 미묘한 문맥상)으로 분할되어 있습니다.

이를 방지하기 위한 도구가 존재합니다.예를 들어, 이 경우 문자열 열을 읽으려고 합니다.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>전체 행을 개체로 구체화합니다.

사실, 내가 이걸 할 수 있다는 걸 스스로 깨달았어

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

가장 간단한 말로, 쿼리가 column_name을 반환하고 문자열이 포함된 경우:

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

나는 보통 데이터 리더로 데이터를 읽는다. 단지 작은 예를 추가했을 뿐이다.

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

해야 한다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();

다음과 같은 도우미 기능이 있습니다.

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

        return o.ToString();
    }

문자열을 추출할 때 사용합니다.

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

언급URL : https://stackoverflow.com/questions/4018114/read-data-from-sqldatareader

반응형