snippetcsharpMinor
How can I convert this to a generic method?
Viewed 0 times
thisgenericcanmethodconverthow
Problem
I have this code I used to to pull data from our IBM i into .NET into an object so it is easy to work with (avoiding DataTables).
Here is an example of a method I have written:
```
public Customer GetUtilityBillCustomer(int id)
{
#region SQL Statement
StringBuilder sb = new StringBuilder();
sb.Append("SELECT ACUSTN, AWEBPN, ANAME, AADD1, AADD2, ACITY, ASTATE, AZIP5, AZIP4, AEMADR, ALOCAT, ");
sb.Append("(TRIM(WTMETER.MADRSN) || ' ' || TRIM(WTMETER.MADRSA) || ' ' || TRIM(WTMETER.MADRSX)) AS SERVICEADDR, ");
sb.Append("(AARR1 + AARR2 + AARR3) AS BALANCE ");
sb.Append("FROM WTCUST, WTMETER ");
sb.Append("WHERE ALOCAT = MLOCAT AND ACUSTN = @custnumber1 ");
sb.Append("UNION ");
sb.Append("SELECT FCUSTN, FWEBPN, FNAME, FADD1, FADD2, FCITY, FSTATE, FZIP5, FZIP4, FEMADR, FLOCAT, ");
sb.Append("(TRIM(WTMETER.MADRSN) || ' ' || TRIM(WTMETER.MADRSA) || ' ' || TRIM(WTMETER.MADRSX)) AS SERVICEADDR, WTFINAL.FAMTDU AS BALANCE ");
sb.Append("FROM WTFINAL, WTMETER ");
sb.Append("WHERE FLOCAT = MLOCAT AND FCUSTN = @custnumber2");
#endregion
DataTable dt = new DataTable();
using (iDB2Connection conn = new iDB2Connection(_connString))
{
using (iDB2Command cmd = new iDB2Command(sb.ToString(), conn))
{
conn.Open();
cmd.Parameters.Add("@custnumber1", iDB2DbType.iDB2Decimal).Value = id;
cmd.Parameters.Add("@custnumber2", iDB2DbType.iDB2Decimal).Value = id;
using (iDB2DataAdapter da = new iDB2DataAdapter(cmd)) { da.Fill(dt); }
conn.Close();
}
}
#region Fill object from DataTable
var customer = (from i in dt.AsEnumerable()
select new Customer
{
Id = i.Field("ACUSTN"),
Pin = i.Field("AWEBPN"),
Name = i.Field("ANAME").Trim(),
- How can I make it better?
- How can I convert all/most of this into a generic reusable method?
Here is an example of a method I have written:
```
public Customer GetUtilityBillCustomer(int id)
{
#region SQL Statement
StringBuilder sb = new StringBuilder();
sb.Append("SELECT ACUSTN, AWEBPN, ANAME, AADD1, AADD2, ACITY, ASTATE, AZIP5, AZIP4, AEMADR, ALOCAT, ");
sb.Append("(TRIM(WTMETER.MADRSN) || ' ' || TRIM(WTMETER.MADRSA) || ' ' || TRIM(WTMETER.MADRSX)) AS SERVICEADDR, ");
sb.Append("(AARR1 + AARR2 + AARR3) AS BALANCE ");
sb.Append("FROM WTCUST, WTMETER ");
sb.Append("WHERE ALOCAT = MLOCAT AND ACUSTN = @custnumber1 ");
sb.Append("UNION ");
sb.Append("SELECT FCUSTN, FWEBPN, FNAME, FADD1, FADD2, FCITY, FSTATE, FZIP5, FZIP4, FEMADR, FLOCAT, ");
sb.Append("(TRIM(WTMETER.MADRSN) || ' ' || TRIM(WTMETER.MADRSA) || ' ' || TRIM(WTMETER.MADRSX)) AS SERVICEADDR, WTFINAL.FAMTDU AS BALANCE ");
sb.Append("FROM WTFINAL, WTMETER ");
sb.Append("WHERE FLOCAT = MLOCAT AND FCUSTN = @custnumber2");
#endregion
DataTable dt = new DataTable();
using (iDB2Connection conn = new iDB2Connection(_connString))
{
using (iDB2Command cmd = new iDB2Command(sb.ToString(), conn))
{
conn.Open();
cmd.Parameters.Add("@custnumber1", iDB2DbType.iDB2Decimal).Value = id;
cmd.Parameters.Add("@custnumber2", iDB2DbType.iDB2Decimal).Value = id;
using (iDB2DataAdapter da = new iDB2DataAdapter(cmd)) { da.Fill(dt); }
conn.Close();
}
}
#region Fill object from DataTable
var customer = (from i in dt.AsEnumerable()
select new Customer
{
Id = i.Field("ACUSTN"),
Pin = i.Field("AWEBPN"),
Name = i.Field("ANAME").Trim(),
Solution
You could receive a lambda that adds parameters.
Edit: I suggest reading about the different delegates:
https://stackoverflow.com/questions/566860/delegates-predicate-action-func
In a nutshell:
public static DataTable GetData(string connString, string sqlStatement, Action addParameters)
{
DataTable dt = new DataTable();
using (iDB2Connection conn = new iDB2Connection(connString))
{
using (iDB2Command cmd = new iDB2Command(sqlStatement, conn))
{
conn.Open();
if(addParameters != null) {
addParameters(cmd.Parameters);
}
using (iDB2DataAdapter da = new iDB2DataAdapter(cmd)) { da.Fill(dt); }
conn.Close();
}
}
return dt;
}
//...
GetData(connStr, sqlStatement, parameters => {
parameters.Add("@custnumber1", iDB2DbType.iDB2Decimal).Value = id;
parameters.Add("@custnumber2", iDB2DbType.iDB2Decimal).Value = id;
});Edit: I suggest reading about the different delegates:
Action; Func; Predicate.https://stackoverflow.com/questions/566860/delegates-predicate-action-func
In a nutshell:
Actiondoes something;
Funcis the same as anAction, but with a return value;
Predicateis the same asFuncbut a bit more semantically significant.
Code Snippets
public static DataTable GetData(string connString, string sqlStatement, Action<iDB2ParameterCollection> addParameters)
{
DataTable dt = new DataTable();
using (iDB2Connection conn = new iDB2Connection(connString))
{
using (iDB2Command cmd = new iDB2Command(sqlStatement, conn))
{
conn.Open();
if(addParameters != null) {
addParameters(cmd.Parameters);
}
using (iDB2DataAdapter da = new iDB2DataAdapter(cmd)) { da.Fill(dt); }
conn.Close();
}
}
return dt;
}
//...
GetData(connStr, sqlStatement, parameters => {
parameters.Add("@custnumber1", iDB2DbType.iDB2Decimal).Value = id;
parameters.Add("@custnumber2", iDB2DbType.iDB2Decimal).Value = id;
});Context
StackExchange Code Review Q#6640, answer score: 3
Revisions (0)
No revisions yet.