10 列のデータを返すストアド プロシージャがあります。を使用cmd.ExecuteScalar()
すると、1 番目のレコードから 1 列目の値が返されます。
エイリアス/データ項目名を指定して、別の列を返すことができるようにするにはどうすればよいですか?
私は次のようなことができるようにしたい:
Dim FirstName as String = cmd.ExecuteScalar("FirstName")
10 列のデータを返すストアド プロシージャがあります。を使用cmd.ExecuteScalar()
すると、1 番目のレコードから 1 列目の値が返されます。
エイリアス/データ項目名を指定して、別の列を返すことができるようにするにはどうすればよいですか?
私は次のようなことができるようにしたい:
Dim FirstName as String = cmd.ExecuteScalar("FirstName")
ExecuteReaderを呼び出すメソッドを作成し、列名とともにGetOrdinalを使用して、GetStringを呼び出すことができます。
私のVBは存在しませんが、これは拡張メソッドのC#です。
public static class SqlCommandExt
{
public static string ExecuteScalar(this SqlCommand cmd, string columnName)
{
using (var reader = cmd.ExecuteReader())
{
if (!reader.Read())
return null;
var index = reader.GetOrdinal(columnName);
return reader.GetString(index);
}
}
}
それはいけません。Command.ExecuteScalar
パラメータを取らない..
できることは、テキスト コマンドを使用し、そのCommandText
プロパティ値を変更して、取得する必要がある列を含めることです。
command.CommandText = "SELECT " + columnName + " FROM Table WHERE Key = " + ...
これを行う拡張メソッドを作成できます。C# に相当するもの ( VB.NET 拡張機能に簡単に変換できると思います):
public static T ExecuteScalar<T>(this SqlCommand cmd, String columnName)
{
using(var reader = cmd.ExecuteReader())
{
var item = default(T);
if(reader.Read())
{
item = (T)dataReader.GetValue(dataReader.GetOrdinal(columnName))
}
return item;
}
}
...そして次のように呼び出します:
var firstName = cmd.ExecuteScalar<String>("FirstName");