2013年4月15日星期一

C#操作Sybase数据库

最近做一个车辆征税系统的项目,要用到Sybase数据库,但自己又从来没有学过此数据库,要连接此数据库,真不知道怎么下手,网上高手多,但是都不是说的很清楚,我网上的资料都看遍了。也没有找到好的方法。ODBC ,OLEDB等等连接都试了。但是都出现各种问题。但是最终还是尝试成功了。现我给大家分享一下。顺便说一下此代码算是操作Sybase的最好的解决方案,最近项目多,就不多说了。大家下载源代码就看懂了。
数据库:ase1252_de_win
.NET:VS2008的源代码
bin文件夹里面有三个文件,大家COPY到自己的项目里面就可以用了
Sybase.Data.AseClient.dll
sybdrvado11.dll
sybdrvssl.dll
代码就不多分析了,大家应该都能看得懂


using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

using Sybase.Data.AseClient;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        AseConnection conn = new AseConnection("Data Source='220.202.38.100';Port='5000';UID='sa';PWD='';Database='master';");
        AseCommand cmd = null;
        AseDataReader reader = null;
        try
        {
            conn.Open();
            cmd = new AseCommand("SELECT * FROM  spt_values", conn);
            reader = cmd.ExecuteReader();
            GridView1.DataSource = reader;
            GridView1.DataBind();
            reader.Close();
            reader.Dispose();
        }
        catch
        {

        }

    }
}
查询出来的结果是:

.Net连接Sybase数据库的几种方法[转]

从这里我们可以找到诸多数据库的配置信息:http://www.connectionstrings.com/  
1、ODBC 方式
   .Net连接时使用连接串如“Driver={Sybase ODBC Driver ASE 12.0};Srvr=xqc;database=DBData;uid=DB;pwd=11;”
   配置ODBC驱动步骤:
   a、确认Sybase12.5.1客户端安装了ODBC驱动。
   b、点击ODBC数据源管理器选择系统DSN,然后添加在弹出的对话框中选择Sybase ASE ODBC Driver 驱动点击完成,弹出Sybase ODBC详细配置窗口。 
   c、在Sybase ODBC详细配置窗口中输入Data Source Name 、NetWork Address 、Database Name;其中Data Source Name这个是连接串中Srvr要用的,NetWork Address 的格式为“Sybase数据库服务器的IP,端口号”,Database Name是你要访问的数据库名称。
   d、设置好了可以先测试下是否连上点击Test Connect 然后输入用户名密码 报“连接成功!”
   2、OLEDB 方式
   .Net连接时使用连接串如“Provider=Sybase.ASEOLEDBProvider.2;Data Source=xqc;User ID=DB;Password=11;charset=eucgb; Server Name=10.195.60.143; ”
   配置OLEDB驱动步骤:
   a、确认Sybase12.5.1客户端安装了OLEDB驱动。
   b、进入Sybase Configuration Manager 中添加一个OLEDB数据源。输入Data Source Name、选择Sybase ASE OLEDB Provider 驱动。Data Source Name这个是连接串中Data Source要用的
        c、在Sybase ASE OLEDB Provider 详细设置窗口配置Server Name、Database Name;Server Name 的格式为“Sybase数据库服务器的IP,端口号”,Database Name是你要访问的数据库名称。
    d、设置好了可以先测试下是否连上点击Test Connect 然后输入用户名密码 报“连接成功!”    

 3、用 Sybase.Data.AseClient 连接
   .Net连接时使用连接串如“Data Source=10.195.49.47;charset=eucgb;Port=5100;UID=DB;PWD=11"
   下载AseClient到本地,把Sybase.Data.AseClient.dll   sybdrvado11.dll sybdrvssl.dll三个文件Copy到项目bin文件夹中,并在项目中引用Sybase.Data.AseClient.dll ,现在就可以使用了。
   例:
AseConnection con=new AseConnection("Data Source=10.195.49.47;charset=eucgb;Port=5100;UID=DB;PWD=11");
AseDataAdapter da=new AseDataAdapter("select id,name from Tablename",con);
DataSet ds=new DataSet();
da.Fill(ds);


用ado.net访问sybase



Sybase 12.5能够很好地支持microsoft ado.net,在Sybase12.5的安装目录下有一个ado.net的目录,该目录下有三个组件:Sybase.Data.AseClient.dllsybdrvado11.dllsybdrvssl.dllSybase.Data.AseClient.dll 提供了访问Sybase的active data object,只要将这三个组件放到应用程序目录下,在应用程序中引用Sybase.Data.AseClient.dll,就能使用ado.net访问Sybase了。Sybase在其ado.net目录下还提供了C#、VB.Net的源代码,参数这些源代码就应该可以做一些数据库的操作了,如何还不够,可以通过下面URL: http://sybooks.sybase.com/adonet.html到Sybase网站上获取Sybase ASE ADO.NET Data Provider 更多技术文档。 

企业库中 DatabaseFactory.CreateDatabase 方法创建数据库实例的 逻辑过程(转)

 Enterprise Library 的 数据访问应用块中:
  Microsoft.Practices.EnterpriseLibrary.Data.Database 抽象类派生出了以下三个数据库类
     Microsoft.Practices.EnterpriseLibrary.Data.GenericDatabase
     Microsoft.Practices.EnterpriseLibrary.Data.Oracle.OracleDatabase
     Microsoft.Practices.EnterpriseLibrary.Data.Sql.SqlDatabase
从这一点知识我们就可以知道
Database dbSvc = DatabaseFactory.CreateDatabase();
上述代码创建的 dbSvc 并不是 Microsoft.Practices.EnterpriseLibrary.Data.Database 抽象类的实例,而应该是下面这三个类的其中一个实例。
     Microsoft.Practices.EnterpriseLibrary.Data.GenericDatabase
     Microsoft.Practices.EnterpriseLibrary.Data.Oracle.OracleDatabase
     Microsoft.Practices.EnterpriseLibrary.Data.Sql.SqlDatabase
 或者是你自己新写的一个派生自 Database 抽象类的子类。
我们再通过查看企业库的源代码简单看一下  DatabaseFactory.CreateDatabase 方法 是根据啥关系,来判断应该创建的是 Database 抽象类的那个子类。
分析代码可知,这里的判断分三步:
主要代码看 DatabaseCustomFactory.cs 文件的
public object CreateObject(IBuilderContext context, string name, IConfigurationSource configurationSource, ConfigurationReflectionCache reflectionCache)方法。
第一步:
在链接字符串中,我们可以根据链接字符串的 name 获得 链接字符串的 providerName 。
第二步:
如果 我们设置了 providerName 的任何 影射关系, 则自动获得 这个映射的 DbProviderMapping ;
如果这个数据库访问者 没有被设置任何影射关系, 则 系统自动在默认提供的 SqlDatabase、 OracleDatabase 中匹配。
如果上述都没匹配出结果, 则 返回 GenericDatabase 。
上述逻辑在 DatabaseConfigurationView.cs 文件中可以看到代码:

public DbProviderMapping GetProviderMapping(string name, string dbProviderName)
{
 DatabaseSettings settings = this.DatabaseSettings;
 if (settings != null)
 {
  DbProviderMapping existingMapping = settings.ProviderMappings.Get(dbProviderName);
  if (existingMapping != null)
  {
   return existingMapping;
  }
 }
 DbProviderMapping defaultMapping = this.GetDefaultMapping(name, dbProviderName);
 if (defaultMapping != null)
 {
  return defaultMapping;
 }
 return this.GetGenericMapping();
}
第三步
根据 DbProviderMapping 生成 Database 抽象类的实例。

根据上述逻辑描述,我们就可以理解如下一个数据库的配置文件了。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />
  </configSections>
  <dataConfiguration defaultDatabase="MyTestConnectionString">
    <providerMappings>
      <add databaseType="Microsoft.Practices.EnterpriseLibrary.Data.GenericDatabase, Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
        name="GenericDatabase" />
      <add databaseType="Microsoft.Practices.EnterpriseLibrary.Data.Sql.SqlDatabase, Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
        name="System.Data.SqlClient" />
    </providerMappings>
  </dataConfiguration>
  <connectionStrings>
    <add name="MyTestConnectionString" connectionString="server=(local)\SQLEXPRESS;database=EntLibQuickStarts;Integrated Security=true;"
      providerName="GenericDatabase" />
  </connectionStrings>
  <system.data>
    <DbProviderFactories>
      <add name="my Generic Database" invariant="GenericDatabase" description="An alias for the SqlProvider" type="System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    </DbProviderFactories>
  </system.data>
</configuration>
这个数据库配置文件生成的  Database dbSvc = DatabaseFactory.CreateDatabase();
dbSvc 必然是 Microsoft.Practices.EnterpriseLibrary.Data.GenericDatabase 类型的。
注意:
system.data 数据节 的 DbProviderFactories 配置节 是给配置文件中 connectionStrings 节的 providerName 对应用的。
而 dataConfiguration 配置节的 providerMappings 是给 生成 的 是那一个 Database 抽象类的那一个实例用的。
参考资料:

SqlBulkCopy

在做大批量数据插入的时候,如果用Insert into ... values (...)这种方式的话效率极低,这里介绍两种性能比较好的批量插入方法。
1. 使用SqlBulkCopy
private static long SqlBulkCopyInsert()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
DataTable dataTable = GetTableSchema();
string passportKey;
for (int i = 0; i < count; i++)
{
passportKey = Guid.NewGuid().ToString();
DataRow dataRow = dataTable.NewRow();
dataRow[0] = passportKey;
dataTable.Rows.Add(dataRow);
}
SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(connectionString);
sqlBulkCopy.DestinationTableName = "Passport";
sqlBulkCopy.BatchSize = dataTable.Rows.Count;
SqlConnection sqlConnection = new SqlConnection(connectionString);
sqlConnection.Open();
if (dataTable!=null && dataTable.Rows.Count!=0)
{
sqlBulkCopy.WriteToServer(dataTable);
}
sqlBulkCopy.Close();
sqlConnection.Close();
stopwatch.Stop();
return stopwatch.ElapsedMilliseconds;
}  

  使用SqlBulkCopy类进行数据插入其原理是采用了SQL Server的BCP协议进行数据的批量复制。这里我们先要建好一个DataTable(最好是通过DataAdapter来灌数据得到,因为这样出来的DataTable就已经有跟数据表相同的列定义,可以免去之后Mapping Column的步骤),把要插入的数据加进这个DataTable中,然后用SqlBulkCopy的实例来插入到数据库中。经过测试,SqlBulkCopy方法比直接用Sql语句插入数据的效率高出将近25倍。

  另外批量导入SQL、MYSQL等数据是同样的for循环,使用拼出来的sql或者使用参数的方式传递或者使用事务等不同方式的传递效率都不同。如果不使用SqlBulkCopy的方式的话,我测试下来做快递是用一次事务来操作为最快。因为10000次的循环如果是每次提交,那么都有链接和停止数据库的操作,或者说他包含了1000次的小事务处理。如果外面就一个事务的话效率肯定会高。

原人大校长:市长市委书记孩子几乎不上职业院校

“关于职业技术教育,大家谈起来都认为很重要,现实生活中又离不开,打心眼里却瞧不上。”纪宝成,这位中国教育界富有个性、敢于直言的代表人物说起职业技术教育(以下简称“职教”),又情不自禁地展现了以往“纪大炮”的本色。
在卸任中国人民大学校长职务11年之后,纪宝成今年2月又担当了一个新的社会职务——中国职业技术教育学会第四届理事会会长。
从国内一流大学校长到任管理职教的社会机构,纪宝成谈起职教来,并非“愤青”放炮图个响,以他担任过原商业部国内贸易部教育司司长,原国家教委高教司司长、计划建设司司长,教育部发展规划司司长等履历,其对职教的观察与建议当会具有建设性。由此,中国青年报记者日前对他进行了专访。
说职教重要的人的孩子一般没有上职业院校
谈起职教的重要性,这位人大前校长用“三个离不开”总结了各级官员的讲话:建设人力资源强国离不开职教;走中国特色新型工业化、信息化、城镇化、农业现代化道路离不开职教;增加居民收入,缩小收入分配差距,建设和谐社会离不开职教。“可是,一个最大的反差就是老百姓不认可、不愿意送孩子上职业院校。”纪宝成说。
然而,1950~1980年代,我国曾用有关制度较好地解决了这种现象,不少地委书记、行署专员及县委书记、县长的孩子都上中专。同时,普通百姓的孩子想早点参加工作缓解家庭经济压力的话可以报考中专,将来想报考大学的话就去读普通高中。
“现在几乎没有市委书记、市长与县委书记、县长的孩子上职业院校,就连说职教重要的人的孩子一般都没有上职业院校。”纪宝成说,“职教简直成了‘平民教育’的代名词。很多老百姓的孩子上职业院校是无奈之举。”
来自上海市教育科学研究院与麦可思研究院的调查数据也印证他了这个观察。据统计,近3年,88%的高等职业学校毕业生为家庭第一代大学生。2012年,全国中等职业学校农村户籍学生占到在校生总数的82%,中西部地区的学生占在校生总数的70%。父亲、母亲为农民、工人的学生人数占调查总人数的80%。
“这种现象是怎么造成的,全社会都应加以反思。”纪宝成说。
现有制度让年轻人“拥抱资本,远离劳动”
过去,一个八级工可以享受大学教授的待遇,工人、农民与解放军战士是令人崇敬与向往的职业。然而,在计划经济向市场经济体制转变过程中,由于其他制度没有及时改革与跟上,以至于现在年轻人越来越重金钱,乐意当白领,而不愿意当工农兵。
纪宝成把这种社会风气归结为“拥抱资本、疏远劳动、轻视劳动者”。
三百六十行,行行出状元,是千百年来劳动人民对各种人才的科学评价,其跨越时空的价值不亚于《论语》的一些重要论断。到当下社会,能有一百行出状元就不错了,其他行业似乎都出不了状元。纪宝成说:“不能就教育来谈职教的问题,而是要从改变不合时宜的思想,从制度设计、改革政策做起。”
首先,在传统观念的影响下,社会不断地在强化脑力劳动与体力劳动的差异。这可以从领导讲话,到新闻媒体,再到社会公众,经常在说拔尖创新人才的培养问题,鲜有提及劳动最光荣的价值导向。
其次,国家考试录取制度“一棍子”把职教打入底层。中考时,重点高中、普通高中优先录取,剩下的去读中等职业学校;高考时,一本、二本、三本批次录取结束后,才轮到高等职业学校录取。久而久之,职教在社会上是一个什么印象呢。
第三,是职教毕业生就业的歧视性政策。比如,国家机关公务员考试录取制度不准职业院校毕业生参加,户籍制度不让职业院校毕业生在大城市落户。
第四,是人为隔断的职业晋升制度。比如,职业院校毕业生到企业工作以后,从初级工、到高级工,最高只能升到高级技师。可高级技师享受什么待遇与地位没有下文或执行不到位;从工人技师职称序列向技术员、工程师职称序列转,外语考试卡死你;企业技术岗位能手聘任到职业院校培养高技能人才,人事编制制度不允许。
第五,是职教投入缺乏制度保障。过去,我国对职教的历史欠债比较多,近几年投入加大有所改善,但也是建立在领导重视了就钱多,领导提得少了投入就马上减下来。
“各种不合理的政策与制度交织在一起,一个工人几乎难以从最低层通达职业的光辉顶点,谁愿意去当工农兵?”纪宝成说:“这些‘莫明其妙’的政策制度为什么总是改革不到位、解决不好?到底是在坚持原则与制度,还是部门利益与垄断思想在作祟,处处刁难人!”
盲目追求升格与高学历将把职教带入歧途
“我们在梳理国家财政、人社与户籍等对职教不公的政策制度过程中,更要深刻检讨职教一些自轻自贱的地方。”纪宝成如是说。
比如,国内高等职业学校普遍存在“招不到学生,国家就不给钱”,招生服务于计划而非服务于质量的现象令人堪忧。有的高等职业学校降到总分100分、80分录满为止,这意味着,高考5门课程平均每门成绩20~30分的学生都可以上大专。一大批低线录取的学生进入高等职业学校后,跟不上学习进度,3年之后又不得不降低人才培养标准给予毕业。
国际上任何一种教育模式要么是“严进宽出”,要么是“宽进严出”,从来没有中国高等职业学校这种招生不设门槛,毕业不讲标准的“宽进宽出”现象。这种人才培养方式只会让社会越来越看低职教。
在这种情况下,只有把职教“突围”的出路寄托在升格与学历上升方面,且升格动力越来越强劲。纪宝成表示:“把加快发展现代职业教育理解为一场职校升格运动的话,将把职教带入歧途。世界上没有哪所小学办得好就办初中,哪所高中办得好就办大学的。”
况且,国内法律界定高等职业教育为大专层次,大部分高等职业学校是在高等教育大众化初期由中专升格为大专的,现在不可能像1999年开始的大学扩招10年那样,平均每3天诞生一所高等学校。至于职业院校是三年制、四年制或五年制,社会并不怎么关心,而是关心职教培养的人才质量。
职教就是就业教育,要升学去接受普通教育,职业院校要各安其位,各尽其责,学生个体的学历上升通道保持畅通,前提是需要付出努力与代价。比如,高等职业学校毕业生可以进入本科院校就读,前提是必须通过语文、数学、外语等基础课的考试。
“现在诱导职教升格的动力一方面是社会评价机制不公平,另一方面是官本位的非教育政策因素在推动。中职变高职,行政级别由正处级变副厅级;高职升本科,行政级别由副厅级变正厅级,地方可以安排不少领导干部。”说起这些,纪宝成痛心疾首。
不解决政策制度层面问题,光喊职教多么重要没有用
“在深化改革与加快发展现代职教的时代潮流中,应摒弃官僚主义,深入基层,从思想、政策、制度、操作各个层面逐一梳理涉及职教的主要问题,哪些问题是省市一级政府可以解决,哪些问题需要中央政府层面统一协调解决。”纪宝成说,“不解决这些政策制度层面上的问题,光空喊职教多么重要没有用。”
同时,政府在政策制度设计上要作表率,创造有利于职教良性发展的制度与政策环境,发挥广大职业院校校长与教职工的智慧与创造能力;而不是去职业院校指手画脚,越位关注微观操作技术层面的问题。
“思想上的改变需要一个过程,但是政策制度的改革应该来得更快一些。”纪宝成说,当前,深化改革首先要表现在政策制度上,比如推进普通高等学校招生与高等职业学校招生分类考试制度等;其次是加大对职教的投入,扩大优质职教资源,表明这类人才培养是重要的与高质量的;第三,运用群众喜闻乐见的方式宣传职教对经济社会发展的重要性,进一步在社会上树立和形成“崇尚劳动,尊重劳动者”的氛围。
(原标题:纪宝成:市长市委书记孩子几乎不上职业院校)

解密百度硅谷人工智能实验室;欲模拟人脑算法

百度在硅谷成立人工智能实验室;欲模拟人脑算法
百度语音图像识别搜索团队主管Kai Yu在硅谷办事处介绍“深层学习”
网易科技讯 4月13日消息,据《连线》杂志网站报道,百度已经在硅谷成立人工智能实验室。
在加州库比蒂诺沿公路商业区旁边有一座办公大楼,距离南部的旧金山大约有1小时车程。走进去,会发现一面加州州旗,机器人R2-D2纸板,以及不少圣诞节装饰品——即便现在已经进入4月。
不过,该大楼有着宏大的计划,它是百度希望创造未来的地方。
早在2月末就有消息称,该中国搜索巨头将为“深层学习”专门设立一个研究实验室。“深层学习”是一个正在兴起的有关用软硬件模拟大脑的计算机科学领域。该实验室在硅谷(距离苹果总部不远)有一个运营中心,在中国也有一个办事处。百度刚刚在库比蒂诺招到了首位研究人员,计划年底之前再多招几位。
百度将该实验室称作“深层学习研究所”(IDL)。就像谷歌、苹果等公司所做的,该公司正在探索与人类学习方式相类似的计算机系统。“我们拥有一个很大的梦想,即利用深层学习模拟人脑的功能、力量和智能。”百度语音和图像识别搜索团队负责人Kai Yu表示,“我们每天都在取得进展。”他最近亲自前往库比蒂诺招揽了首位研究人员。
要想与谷歌竞争,那在谷歌的后花园成立实验室确实是明智之举。Kai Yu说道,“在硅谷,可以接触到庞大的人才库,有大量非常顶尖的工程师和科学家人才,谷歌正享有这种优势。”百度先是在一年前成立了库比蒂诺办事处,之后才大举涉足深层学习。
深层学习
在1990年代和2000年代,深层学习研究陷入低潮。当时,人工智能群体转而研究海量数据挖掘分析系统,而非试图建立模拟人脑各种微妙因素的“神经网络”系统。谷歌的搜索引擎就是绕过深层学习走捷径系统的典型例子,该美国搜索巨头也在采用类似的做法研发无人驾驶车项目。但如今,深层学习研究再度兴起,谷歌是驱动该领域向前发展的公司之一。
在受到行业权威、斯坦福的Andrew Ng和很多其它公司也在探索相同领域的刺激之后,谷歌最近聘用了深层学习“教父”杰弗里·辛顿(Geoffrey Hinton)。IBM长期以来一直在研发人脑计算机模型。苹果现在将深层学习技术应用于iPhone语音助手Siri 当中。谷歌在其自家语音识别系统和谷歌街景当中也采用类似的做法。
然而,行业先驱、纽约大学的扬恩·莱昆(Yann LeCun)认为,百度专门设立深层学习研究实验室的举动“有点大胆。”他指出,该技术仍有很长一段路要走。不过他还称,该实验室会有助于百度吸引顶级人才,让极具创造力的工程师探索各种各样的创新——类似于谷歌眼镜、谷歌神秘实验室X Lab其它项目的产品。
探索相关算法
事实上,Kai Yu手下的其中一位研究人员正在研发穿戴式设备“Baidu Eye”,该产品被很多人称作是谷歌眼镜的翻版。但据Kai Yu称,目前该实验室的主要优先事项就是探索深层学习算法。“我们想要保持专注。”
去年11月,百度推出了其首款基于深层学习的语音搜索服务,声称该工具可将错误率降低30%左右。正如谷歌和苹果所做的,这些改进能够改变人们与技术交互的方式和使用频率。当语音和图像搜索服务走向成熟完善的时候,人们就不需要频繁摆弄移动设备上的小键盘和小型屏幕。
Kai Yu说道,现在搜索产品或者服务返回给用户的只是一长串的链接,而“用户需要浏览所有的那些网页来逐个理解它们的意思。”不过他想要很不一样的搜索系统。
“我们需要根本性地改变整个系统的架构。”他解释道。这意味着所建立的算法要能够识别图像,理解自然语言,然后解析网络各种各样的信息与用户实际寻找的特定内容之间的关系。换言之,该系统需要像人脑那样运作的算法,而且要更加快速地运行。(乐邦)