新足迹

 找回密码
 注册

精华好帖回顾

· Melbourne Girls' Grammar - ELC 参观归来 (图文并茂+观后感) (2011-9-17) loushenghong · 俺是个神经病 -应大胸妹文, 我也来篇 (2008-5-31) applenet
· 无产阶级的会计找工记 (2005-3-6) 无产阶级 · 新入手的KUGA TREND Diesel 2.0 TDCi价格及驾驶分享 (2013-8-16) vlucpa
Advertisement
Advertisement
查看: 2278|回复: 39

ADO.net 高手请指教。 [复制链接]

头像被屏蔽

禁止发言

发表于 2010-12-3 09:43 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
写了一个简单的 SqlServerDataUtility 。 各位给指点一下,如何完善?
Advertisement
Advertisement
头像被屏蔽

禁止发言

发表于 2010-12-3 09:43 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
class SqlServerDataUtility
    {
        private string _connectionString;               
        private SqlConnection _connection;
        
        public SqlServerDataUtility(string connectionString)
        {
            this._connectionString = connectionString;
        }

        //to get server table schema
        internal DataTable GetDataTable(string strTableName)
        {
            DataTable aDataTable = new DataTable("Result");
            using (_connection = new SqlConnection(_connectionString))
            {
                if (_connection.State == ConnectionState.Closed)
                    _connection.Open();
                SqlDataAdapter adapter = new SqlDataAdapter();
                adapter.SelectCommand = new SqlCommand("SELECT top 1 * FROM " + strTableName, _connection);
                adapter.Fill(aDataTable);               
            }
            
            aDataTable.Clear();            
            return aDataTable;
        }

        //to repopulate a table
        internal void RefillTable(string strTableName, DataTable aDataTable)
        {
            ClearTable(strTableName);
            BulkCopyData(strTableName, aDataTable);
        }

        //clear all data in a table
        private void ClearTable(string strTableName)
        {
            using (_connection = new SqlConnection(_connectionString))
            {
                if (_connection.State == ConnectionState.Closed)
                    _connection.Open();
                SqlCommand cmd = new SqlCommand(@"DELETE FROM " + strTableName, _connection);
                cmd.ExecuteNonQuery();
            }
            
            
        }        

        private void BulkCopyData(string strTableName, DataTable aDataTable)
        {
            using (_connection = new SqlConnection(_connectionString))
            {
                if (_connection.State == ConnectionState.Closed)
                    _connection.Open();
                using (SqlBulkCopy bcp = new SqlBulkCopy(_connection))
                {
                    bcp.DestinationTableName = strTableName;
                    bcp.WriteToServer(aDataTable);
                }

            }            
        }
    }
签名被屏蔽

发表于 2010-12-3 10:14 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
1.如果connection要显示的关掉,在using block的最后if(_connection.State == ConnectionState.open) _connection.close(); 最好用try/catch的结构,把这个logic也放在catch中,如果不太计较performance,放在finally也可以。

2.避免用dataadapter/datatable

3.尽量用sp,不用dynamic sql,避免sql injection,虽然现在很少了。

4.没用过sql bulk copy,大数据量我们一般都在sql server side作,在1.0/sql server 2000的时候通过xml做过,特别麻烦,不推荐。

ado.net已经很好了,看到不少project还在外面加wrapper,我觉得benifit不多,这么做没什么必要.

在.net 1/1.1用dataset/datatable都没问题,但从2.0都不要再用了,争取用基于class的business entity(collection),这也是ms现在推荐的方式.这个方向如何用ormapping tools,又是见仁见智的问题。

评分

参与人数 1积分 +4 收起 理由
澳贼 + 4 为何你什么都知道??

查看全部评分

发表于 2010-12-3 10:31 |显示全部楼层
此文章由 pengruijun 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 pengruijun 所有!转贴必须注明作者、出处和本声明,并保持内容完整
试试 microsoft enterprise library, 比这个简单

评分

参与人数 1积分 +2 收起 理由
澳贼 + 2 我研究一下?

查看全部评分

头像被屏蔽

禁止发言

发表于 2010-12-3 10:40 |显示全部楼层

请教乱码

此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
1.如果connection要显示的关掉,在using block的最后if(_connection.State == ConnectionState.open) _connection.close(); 最好用try/catch的结构,把这个logic也放在catch中,如果不太计较performance,放在finally也可以。

class 内部有必要用try/catch的结构? 我是说,是否应该在business level用?

2.避免用dataadapter/datatable

为什么?

3.尽量用sp,不用dynamic sql,避免sql injection,虽然现在很少了。
好的好的。安全第一。

4.没用过sql bulk copy,大数据量我们一般都在sql server side作,在1.0/sql server 2000的时候通过xml做过,特别麻烦,不推荐。
sql bulk copy 速度很快。 sql server side如何作?SSIS?


ado.net已经很好了,看到不少project还在外面加wrapper,我觉得benifit不多,这么做没什么必要.

在.net 1/1.1用dataset/datatable都没问题,但从2.0都不要再用了,争取用基于class的business entity(collection),这也是ms现在推荐的方式.这个方向如何用ormapping tools,又是见仁见智的问题。

你能否给几个references我看看?非常谢谢
签名被屏蔽
头像被屏蔽

禁止发言

发表于 2010-12-3 10:43 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 pengruijun 于 2010-12-3 11:31 发表
试试 microsoft enterprise library, 比这个简单


这个东西,是不是很popular?
签名被屏蔽
Advertisement
Advertisement

发表于 2010-12-3 10:55 |显示全部楼层
此文章由 pengruijun 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 pengruijun 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 澳贼 于 2010-12-3 11:43 发表


这个东西,是不是很popular?

应该还可以, microsoft enterprise library 包括好多东西。 其中有一块是操作数据库的。 说白了 就是把ADO.net 又包裹了一下,
不过用起来确实简单。

发表于 2010-12-3 10:58 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 pengruijun 于 2010-12-3 11:31 发表
试试 microsoft enterprise library, 比这个简单


我用过它2.0的logging和configuration,后来觉得很麻烦而且有性能问题,就都换掉了(log4net和vs自己的configuration).

后来发现他的unity作ioc container还不错,但也没真正用过。

至于data access,我个人觉得ado.net还不错,不过不用这个,市面上大把ormapping tool可以选,它的这部分我没看过,可能也不错吧。

发表于 2010-12-3 11:05 |显示全部楼层
此文章由 cdfei 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 cdfei 所有!转贴必须注明作者、出处和本声明,并保持内容完整
实在没有必要自己写了,microsoft enterprise library里面好像有个SqlHelper,完全就是这个东西。
新项目就直接用entity吧

发表于 2010-12-3 11:16 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 澳贼 于 2010-12-3 11:40 发表
1.如果connection要显示的关掉,在using block的最后if(_connection.State == ConnectionState.open) _connection.close(); 最好用try/catch的结构,把这个logic也放在catch中,如果不太计较performance,放在finally也可以 ...


1.class 内部有必要用try/catch的结构? 我是说,是否应该在business level用?
--没懂你的问题,try/catch在这个地方应该是很标准的应用.

2.避免用dataadapter/datatable
为什么?
--performance issue,太重,datatable还好,毕竟这也是当年Duwamish推荐的核心概念,不过dataadapter就差不多应该是给大学生应付作业用的 

4.可能我们说的bcp都是一个概念,我说的是在server side直接用,你是通过.net给server 发指令.我原来说的是将大量的数据从客户端上传到server,当时用的是openxml.

5.关于ormapping /datatable,ms力荐linq to sql /entity framework和几乎不提datatable的应用,应该就是这个意思.你参考一下这篇文章:
http://stackoverflow.com/questio ... n-orm-vs-datatables

个人意见,看看就算了,别当真 
头像被屏蔽

禁止发言

发表于 2010-12-3 11:26 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 cdfei 于 2010-12-3 12:05 发表
实在没有必要自己写了,microsoft enterprise library里面好像有个SqlHelper,完全就是这个东西。
新项目就直接用entity吧


好的,我看看
签名被屏蔽
Advertisement
Advertisement
头像被屏蔽

禁止发言

发表于 2010-12-3 11:27 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 乱码 于 2010-12-3 12:16 发表


1.class 内部有必要用try/catch的结构? 我是说,是否应该在business level用?
--没懂你的问题,try/catch在这个地方应该是很标准的应用.

2.避免用dataadapter/datatable
为什么?
--performance issue,太重,datatable还好,毕 ...


别当真是啥意思?
签名被屏蔽

发表于 2010-12-3 11:31 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 澳贼 于 2010-12-3 12:27 发表


别当真是啥意思?


别当真的意思是:如果你有反对意见,keep your mouth shut

just kidding ~~

发表于 2010-12-3 11:40 |显示全部楼层
此文章由 starchu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 starchu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
"1.如果connection要显示的关掉,在using block的最后if(_connection.State == ConnectionState.open) _connection.close(); 最好用try/catch的结构,把这个logic也放在catch中,如果不太计较performance,放在finally也可以。"

这一点是不对的,如果使用 using statement, connection不需要自己控制,更不需要加try, catch block, .NET自己会自动处理,在using block结束的时候关闭connection. 任何实现了IDisposable interface的类,都可以用using statement来简化异常处理和资源释放,这是using statement的一般用法。 如果你想自己控制异常处理,那又是另外一回事了,但是关闭连接这种操作是可以被自动处理掉的。

[ 本帖最后由 starchu 于 2010-12-3 12:44 编辑 ]

发表于 2010-12-3 11:51 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 starchu 于 2010-12-3 12:40 发表
1.如果connection要显示的关掉,在using block的最后if(_connection.State == ConnectionState.open) _connection.close(); 最好用try/catch的结构,把这个logic也放在catch中,如果不太计较performance,放在finally也可以 ...


using block都会被.net转化为try/finally block,但在finally中close connection很expensive,不推荐。

最好自己写try/catch,手动explicitly close connection.

发表于 2010-12-3 11:56 |显示全部楼层
此文章由 starchu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 starchu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 乱码 于 2010-12-3 12:51 发表


using block都会被.net转化为try/finally block,但在finally中close connection很expensive,不推荐。

最好自己写try/catch,手动explicitly close connection.


如果需要自己管理的话,根本就不需要用using keyword。 在finally中close connection是比较好的,因为在你关闭connection代码之前的异常都将越过你的close invocation, 这样很多时候造成connection没有关闭的情况,所以最安全的方法是在finally block中关闭连接。

[ 本帖最后由 starchu 于 2010-12-3 13:00 编辑 ]
Advertisement
Advertisement

发表于 2010-12-3 11:58 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 starchu 于 2010-12-3 12:56 发表


如果需要自己管理的话,根本就不需要用using keyword


我个人从来不用using,我喜欢自己管理object,不喜欢给别人去做。 

发表于 2010-12-3 12:10 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 starchu 于 2010-12-3 12:56 发表


如果需要自己管理的话,根本就不需要用using keyword。 在finally中close connection是比较好的,因为在你关闭connection代码之前的异常都将越过你的close invocation, 这样很多时候造成connection没有关闭的情况,所以 ...


finally的好处即使throw exception,它也能正常close connection.
但在正常情况下99.9 out of 100,程序是正常run的,这种情况下它也要进finally中的logic去close connection,很有性能问题。

这种情况下到不如在try/catch中都用explicit close connection的logic来的性能好。
头像被屏蔽

禁止发言

发表于 2010-12-3 12:13 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 starchu 于 2010-12-3 12:40 发表
"1.如果connection要显示的关掉,在using block的最后if(_connection.State == ConnectionState.open) _connection.close(); 最好用try/catch的结构,把这个logic也放在catch中,如果不太计较performance,放在finally也可 ...


MSDN是这么说的。

另外,SqlDataAdapter 也是MSDN常用的,为何说是只为学生做作业?
签名被屏蔽

发表于 2010-12-3 13:37 |显示全部楼层
此文章由 pengruijun 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 pengruijun 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 乱码 于 2010-12-3 12:58 发表


我个人从来不用using,我喜欢自己管理object,不喜欢给别人去做。 

有些是自己做不了的, 比如 局部变量,

发表于 2010-12-3 13:38 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 澳贼 于 2010-12-3 13:13 发表


MSDN是这么说的。

另外,SqlDataAdapter 也是MSDN常用的,为何说是只为学生做作业?


msdn只查不懂得class和他的forum,前几年还有几个best pratice可以看看,现在也没什么了.

它有得很多东西都是误导,别全信。
Advertisement
Advertisement

发表于 2010-12-3 13:42 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 pengruijun 于 2010-12-3 14:37 发表

有些是自己做不了的, 比如 局部变量,


你说的对,但我一个method顶多20几行,基本上不用using来给我做scoping.

发表于 2010-12-3 13:51 |显示全部楼层
此文章由 starchu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 starchu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 乱码 于 2010-12-3 14:42 发表


你说的对,但我一个method顶多20几行,基本上不用using来给我做scoping.


那你估计肯定不会习惯 IoC framework 和DI, 因为所有的object的scope都是由它们来管理和动态inject的。。。

发表于 2010-12-3 14:04 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 starchu 于 2010-12-3 14:51 发表


那你估计肯定不会习惯 IoC framework 和DI, 因为所有的object的scope都是由它们来管理和动态inject的。。。


如果project不会大量用DI,只有关键的几个地方,那我就自己做了DI了,不会用任何framework,如果大量用,就是object的scoping就真不算啥,比这个值得注意的要很多,比如reflection,而且绝大多数framework都还是要改动source code,以至于重新编译。
头像被屏蔽

禁止发言

发表于 2010-12-3 14:13 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
msdn只查不懂得class和他的forum,前几年还有几个best pratice可以看看,现在也没什么了.

它有得很多东西都是误导,别全信。

msdn不能用了。哪里找best practises?
签名被屏蔽

发表于 2010-12-3 14:27 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 澳贼 于 2010-12-3 15:13 发表
msdn只查不懂得class和他的forum,前几年还有几个best pratice可以看看,现在也没什么了.

它有得很多东西都是误导,别全信。

msdn不能用了。哪里找best practises? ...


看书,论坛和blog吧,最近.net 4.0的很多东西我也不太懂了,你看看有些推荐的coding standard吧

http://amazedsaint.blogspot.com/ ... azedsaint/articles+(.NET+Journal+|+C%23,+Silverlight,+ASP.NET,+WPF,+Windows+Phone+7,+VSX,+Design+Patterns,+Neural+Networks)
Advertisement
Advertisement

发表于 2010-12-3 15:33 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
有时候想想这些边边角角的东西扣得这么细也没什么意思,做data centric web site还有很多东西需要注意,front end一个不经意的postback或者database side的long query,我们在.net这边做的performance tuning的结果可能全部被抹杀,scalibility就是另外一个话题了,先不说这个。

我经历的好点的project,.net的比重占所有技术比重的50%,front end和database那边是很大的两块,需要特别注意的。
头像被屏蔽

禁止发言

发表于 2010-12-7 09:22 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 乱码 于 2010-12-3 16:33 发表
有时候想想这些边边角角的东西扣得这么细也没什么意思,做data centric web site还有很多东西需要注意,front end一个不经意的postback或者database side的long query,我们在.net这边做的performance tuning的结果可能全 ...


从前到后,都我一个人做,奈何?
签名被屏蔽

2010年度奖章获得者

发表于 2010-12-7 09:31 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
有一点比较误导啊, 我要纠正一下, using 跟什么connection 没有直接关系。

using 是配 IDisposable 用的。

本人推荐用 using.
头像被屏蔽

禁止发言

发表于 2010-12-7 09:34 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 dalaohu 于 2010-12-7 10:31 发表
有一点比较误导啊, 我要纠正一下, using 跟什么connection 没有直接关系。

using 是配 IDisposable 用的。

本人推荐用 using.


记得看过一本书也是推荐using.所以我后来一直都用。
签名被屏蔽

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部