답변:
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();
이것들은 object
이므로 캐스트하거나 캐스트해야합니다 .ToString()
.
while(rdr.Read())
{
string col=rdr["colName"].ToString();
}
그것은 일할 것이다
toString()
유효하지 않습니다 .ToString()
fyi
그것을 사용할 수있는 사람들을 위해 도우미 방법을 공유한다고 생각했습니다.
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이면 결과는 널입니다.
reader.GetColumn<int>("M_ID");
나는 이것이 오래된 종류라는 것을 알고 있지만 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 코드는 최소한 한 가지 방식 (보통 미묘하고 상황에 따라)으로 손상되었습니다 .
이를 피하기위한 도구가 있습니다. 예를 들어 여기서는 문자열 열을 읽으려고합니다. 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>
개체로 전체 행을 구체화 할 수 있습니다.
가장 간단한 용어로, 쿼리에서 column_name을 반환하고 문자열을 보유한 경우 :
while (rdr.Read())
{
string yourString = rdr.getString("column_name")
}
다음과 같은 도우미 기능이 있습니다.
public static string GetString(object o)
{
if (o == DBNull.Value)
return "";
return o.ToString();
}
그런 다음 문자열을 추출하는 데 사용합니다.
tbUserName.Text = GetString(reader["UserName"]);
나는 보통 이런 식으로 데이터 리더로 데이터를 읽습니다. 작은 예제를 추가했습니다.
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();