SqlMappers do two tasks: building/executing dynamic sql and translating
the result set into domain objects. It might be useful to expose more
of the "building dynamic sql" code to the user:
IDictionary map = new Hashtable();
map["StartDate"] = DateTime.Now;
map["EndDate"] = endDate;
map["Users"] = new int[] {4, 7, 6, 9, 10};
IMappedStatement mappedStatement =
sqlMapper.GetMappedStatement("Calendar.Search");
// CreateIDbCommand(object parameterObject)
IDbCommand cmd = mappedStatement.CreateIDbCommand(map);
The returned IDbCommand would have its IDataParameters collection
populated and could be forwarded off to another framework (the
Microsoft Enterprise Library DAAB for example). I've haven't used the
DAAB in a very long time but from the samples on-line I'd envision it
looking something like this:
IDbCommand cmd = generateCommandFromIBatisNet();
Database db = DatabaseFactory.CreateDatabase();
IDataReader reader = db.ExecuteReader(cmd);
This might also be an entry point for generic data mapping:
// produce some sort of Ldap object that will be executed
// by another system
LdapResult result = (LdapResult)mappedStatement.Process(
ldapHandler, 5);
// hibernate will use the hqlCriteria object in one of its queries
HqlCriteria hqlCriteria = (HqlCriteria)mappedStatement.Process(
hibernateCriteriaHandler, new int[] {5, 6, 9});
// general text processing
string dynamicText = (string)mappedStatement.Process(
dynamicTextHandler, new int[] {5, 6, 9});
Getting back on track, I think this is somewhat possible (long and
ugly!) today with IBatisNet:
// untested
int parameter = 5;
IMappedStatement mappedStatement =
sqlMapper.GetMappedStatement("Calendar.Search");
RequestScope request =
mappedStatement.Statement.Sql.GetRequestScope(
parameter,
sqlMapper.LocalSession);
mappedStatement.PreparedCommand.Create(
request,
sqlMapper.LocalSession,
mappedStatement.Statement,
parameter);
IDbCommand cmd = request.IDbCommand;
Thoughts, ideas?
- Ron