###前提・実現したいこと
下記コードがいわゆるワンライナーで書いてあって、理解とデバッグに大変な困難を感じています。
処理ごとに、行を分けるにはどうしたらよいでしょう?
###該当のソースコード
C#
1public static List<ProductModel> GetModel(string productcode=""){ 2 List<SqlParameter> sqlParameter = new List<SqlParameter>(); 3 string sql = Properties.Resources.SelectM_ProductSKUM_Product; 4 if (!string.IsNullOrEmpty(productcode)) 5 { 6 sql += @" WHERE [productcode] = @productcode"; 7 sqlParameter.Add(new SqlParameter("@productcode", productcode)); 8 } 9 10 return DBAccess.Select<ProductModel>( 11 new SqlCommandPair(sql.ToString(), 12 sqlParameter.ToArray()), 13 reader => 14 { 15 return new ProductModel() 16 { 17 ProductCode = DBAccess.GetString(reader[0], string.Empty), 18 ProductName = DBAccess.GetString(reader[1], string.Empty) 19 }; 20 }); 21}
SQL
1SELECT [dbo].[Product].[ProductCode] 2 ,[ProductName] 3 FROM [dbo].[Product]
###試したこと
処理は内側からなので、内側のオブジェクトを取り出してみたところ、readerがない、とエラーになります。
なるほどreaderはラムダ式で渡しているので、ないですね・・・。
var workobject = new ProductModel() { ProductCode = DBAccess.GetString(reader[0], string.Empty), ProductName = DBAccess.GetString(reader[1], string.Empty) };
ない、ということはわかるのですが、具体的な対処方法で手が止まっています。
コードで教えていただきたく。
C#
1new SqlCommandPair(sql.ToString(), 2sqlParameter.ToArray()),
の部分は、SQLに値を入れている、ということは理解できています。
C#
1ProductCode = DBAccess.GetString(reader[0], string.Empty), 2ProductName = DBAccess.GetString(reader[1], string.Empty)
がデータベースから得たデータを、Modelに入れていることも理解できています。
現在、データベースからModelに入れるときに、nullになる値があるので、それをdebugするのに、どこで値を確認したらよいのかわからずに困っています。
イメージですが。
C#
1var databaseData = DBAccess.GetData(sql); 2List<ProductModel> returnmodels = new List<ProductModel> (); 3foreach (var data in databaseData){ 4 var item = new ProductModel() 5 item.ProductCode = data.GetString(reader[0], string.Empty), 6 item.ProductName = data.GetString(reader[1], string.Empty) 7 returnmodels.Add(item) 8} 9return returnmodels;
のようなコードにしたいです。
SqlCommandPairは、
public SqlCommandPair(string command, params SqlParameter[] args) { Command = command; Parameters = args; }
です。
DBAccess.Selectは、
C#
1 public static List<T> Select<T>(SqlCommandPair selectCommand, Func<SqlDataReader, T> getDatumFunc) 2 { 3 var returnlists = new List<T>(); 4 5 using (var connection = new SqlConnection(Properties.Settings.Default.DBConnectionString)) 6 { 7 try 8 { 9 using (var sqlCommand = new SqlCommand(selectCommand.Command, connection)) 10 { 11 foreach (var parameter in selectCommand.Parameters) 12 { 13 sqlCommand.Parameters.Add(parameter); 14 } 15 16 connection.Open(); 17 18 using (var reader = sqlCommand.ExecuteReader()) 19 { 20 try 21 { 22 // モデルにデータを移す 23 while (reader.Read()) 24 { 25 returnlists.Add(getDatumFunc(reader)); 26 } 27 } 28 finally 29 { 30 reader.Close(); 31 } 32 } 33 } 34 } 35 finally 36 { 37 connection.Close(); 38 } 39 } 40 41 return returnlists; 42 }
でした。
###補足情報(言語/FW/ツール等のバージョンなど)
Visual Studio 2015 Pro
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/19 08:34
2018/01/19 09:10