私はSQL Server 2008データベースを持っており、バックエンドでそれに取り組んでいます。私はasp.net/C#に取り組んでいます
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
//how do I read strings here????
}
読者には価値があることを私は知っています。私のSQLコマンドは、テーブルから1列だけを選択することです。列には文字列のみが含まれています。リーダーの文字列(行)を一つずつ読みたい。どうやってこれをするの?
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
sなので、それらをキャストするか.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();
}
それが動作します
単一の結果の場合:
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());
}
それを使うことができる人のために私のヘルパーメソッドを共有することを考えました:
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になります。
実際、私は自分でこれができると考えました。
while (rdr.read())
{
string str = rdr.GetValue().ToString().Trim();
}
最も簡単に言えば、クエリがcolumn_nameを返し、それが文字列を保持している場合:
while (rdr.Read())
{
string yourString = rdr.getString("column_name")
}
ここではに対してに対してSqlDataReader
を使用して議論します。 ADO.NETにはlotsのEdgeのケースと合併症があり、私の経験ではほとんどの手動で書かれた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>
に置き換えて、行全体をオブジェクトにすることができます。
これはちょっと古いと思いますが、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;
}
私はのようなヘルパー機能を持っています:
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();
}
}