惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
CXSECURITY Database RSS Feed - CXSecurity.com
Stack Overflow Blog
Stack Overflow Blog
月光博客
月光博客
T
Threat Research - Cisco Blogs
小众软件
小众软件
有赞技术团队
有赞技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell
Apple Machine Learning Research
Apple Machine Learning Research
C
Cyber Attacks, Cyber Crime and Cyber Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Tailwind CSS Blog
Cisco Talos Blog
Cisco Talos Blog
V
V2EX
博客园 - 【当耐特】
C
Cybersecurity and Infrastructure Security Agency CISA
Hugging Face - Blog
Hugging Face - Blog
The Cloudflare Blog
The Last Watchdog
The Last Watchdog
Simon Willison's Weblog
Simon Willison's Weblog
T
Threatpost
S
Secure Thoughts
O
OpenAI News
P
Proofpoint News Feed
S
SegmentFault 最新的问题
Forbes - Security
Forbes - Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Application and Cybersecurity Blog
Application and Cybersecurity Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Last Week in AI
Last Week in AI
宝玉的分享
宝玉的分享
Scott Helme
Scott Helme
T
Tenable Blog
A
Arctic Wolf
L
LINUX DO - 热门话题
爱范儿
爱范儿
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
www.infosecurity-magazine.com
www.infosecurity-magazine.com
V
Visual Studio Blog
Hacker News: Ask HN
Hacker News: Ask HN
Hacker News - Newest:
Hacker News - Newest: "LLM"
腾讯CDC
博客园 - Franky
WordPress大学
WordPress大学
Know Your Adversary
Know Your Adversary
博客园_首页
雷峰网
雷峰网
IT之家
IT之家
PCI Perspectives
PCI Perspectives
L
LINUX DO - 最新话题
H
Heimdal Security Blog

博客园 - Daniel Pang

pcanywhere失去连接的一个解决方法 JS格式化日期字符串 - Daniel Pang - 博客园 [软件共享]将数据库中的数据导出为SQL脚本 对文件下载的补充 - Daniel Pang - 博客园 复制DataTable的一种方法 IBatisNet + Castle 开发相关文章 深圳电话订票基本步骤及所有的取票点地址电话 Automatic Transaction Management Facility 使用 - Daniel Pang IBatisnet Facility 的几种配置 - Daniel Pang IBatisNet -- 保护你的配置文件及映射文件信息 Rational Rose 加载出错的问题 修改Sql server中列的属性脚本 字符串加密方法 ERP术语 英文对照(部分)(参考) 一个关于SQL2005的问题 动态加载TreeNode -- ComponentArt TreeView - Daniel Pang 使用IBatisNet + Castle 开发DotNet软件 JS--屏蔽浏览器右键菜单 Excel的导出操作 - Daniel Pang - 博客园
[IBatisNet]关于返回DataTable的一点问题
Daniel Pang · 2007-02-05 · via 博客园 - Daniel Pang

      对于IBatisnet执行查询返回DataTable,网上有很多代码,下面简单列出一下:

private IDbCommand GetDbCommand(string statementName, object paramObject)
        
{
            IStatement statement 
= sqlMap.GetMappedStatement(statementName).Statement;

            IMappedStatement mapStatement 
= sqlMap.GetMappedStatement(statementName);

            IDalSession session 
= new SqlMapSession(sqlMap);

            
if (sqlMap.LocalSession != null)
            
{
                session 
= sqlMap.LocalSession;
            }

            
else
            
{
                session 
= sqlMap.OpenConnection();
            }


            RequestScope request 
= statement.Sql.GetRequestScope(mapStatement, paramObject, session);

            mapStatement.PreparedCommand.Create(request, session, statement, paramObject);

            
return request.IDbCommand;

        }



        
/// <summary>
        
/// 通用的以DataTable的方式得到Select的结果(xml文件中参数要使用$标记的占位参数)
        
/// </summary>
        
/// <param name="statementName">语句ID</param>
        
/// <param name="paramObject">语句所需要的参数</param>
        
/// <returns>得到的DataTable</returns>

        protected DataTable ExecuteQueryForDataTable(string statementName, object paramObject)
        
{
            DataSet ds 
= new DataSet();
            
bool isSessionLocal = false;
            IDalSession session 
= sqlMap.LocalSession;
            
if (session == null)
            
{
                session 
= new SqlMapSession(sqlMap);
                session.OpenConnection();
                isSessionLocal 
= true;
            }


            IDbCommand cmd 
= GetDbCommand(statementName, paramObject);

            
try
            
{
                cmd.Connection 
= session.Connection;
                IDbDataAdapter adapter 
= session.CreateDataAdapter(cmd);
                adapter.Fill(ds);
            }

            
finally
            
{
                
if (isSessionLocal)
                
{
                    session.CloseConnection();
                }

            }


            
return ds.Tables[0];

        }

理论上来说是没任何问题的,但前几天我做了有Output参数的存储过程来返回DataTable,如果用上面的ExecuteQueryForDataTable方法就会获得不到Output的参数,因为它在返回值的时候没有用到IBatisNet内部的方法了,所以上面的方法严谨的写法应该改成下面这样:

/// <summary>
        
/// 通用的以DataTable的方式得到Select的结果(xml文件中参数要使用$标记的占位参数)
        
/// </summary>
        
/// <param name="statementName">语句ID</param>
        
/// <param name="paramObject">语句所需要的参数</param>
    
/// <param name="htOutPutParameter)">Output参数值哈希表</param>
        
/// <returns>得到的DataTable</returns>

        protected DataTable ExecuteQueryForDataTable(string statementName, object paramObject, out Hashtable htOutPutParameter)
        
{
            DataSet ds 
= new DataSet();
            
bool isSessionLocal = false;
            IDalSession session 
= sqlMap.LocalSession;
            
if (session == null)
            
{
                session 
= new SqlMapSession(sqlMap);
                session.OpenConnection();
                isSessionLocal 
= true;
            }


            IDbCommand cmd 
= GetDbCommand(statementName, paramObject);

            
try
            
{
                cmd.Connection 
= session.Connection;
                IDbDataAdapter adapter 
= session.CreateDataAdapter(cmd);
                adapter.Fill(ds);
            }

            
finally
            
{
                
if (isSessionLocal)
                
{
                    session.CloseConnection();
                }

            }


            
foreach (IDataParameter parameter in cmd.Parameters)
            
{
                
if (parameter.Direction == ParameterDirection.Output)
                
{
                    htOutPutParameter[parameter.ParameterName] 
= parameter.Value;
                }

            }


            
return ds.Tables[0];

        }