【asp源码栏目提醒】:本文主要为网学会员提供“ASP NET_C#连接数据库_ADO NET - 编程语言”,希望对需要ASP NET_C#连接数据库_ADO NET - 编程语言网友有所帮助,学习一下!
C.NET 怎样连接数据库 用C.net可以连接的数据库有AccessSQL ServerOracle还有excel等很多 C.net连接不同的数据库有不同的方法不一样的地方就是导入的命名空间不同和连接数据库的字符串不同 首先说下命名空间的导入大部分数据库在导入了下面的命名空间后就可以了包括下面提到的SQL Server数据库 using System.Data.OleDb 要是使用SQL Server的数据库C.net提供了单独的连接方法使其能够更加快的与数据库进行连接 导入方法如下 using System.Data.SqlClientSQL Server 再就是连接数据库所需要的连接字符串就是变量strConnection它指定了要使用的数据提供者和要使用的数据源. C连接连接Access string strConnectionquotProviderMicrosoft.Jet.OleDb.4.0quot strConnectionquotData SourceC:Northwind.mdbquot OleDbConnection objConnectionnew OleDbConnectionstrConnection ... objConnection.Open .. objConnection.Close quot ProviderMicrosoft.Jet.OleDb.4.0quot是指数据提供者这里使用的是Microsoft Jet引擎也就是Access中的数据引擎
asp.net就是靠这个和Access的数据库连接的. quotData SourceC: Northwind.mdbquot是指明数据源的位置他的标准形式是quotData SourceMyDrive:MyPathMyFile.MDBquot. quot OleDbConnection objConnectionnew OleDbConnectionstrConnectionquot这一句是利用定义好的连接字符串来建立了一个链接对象以后对数据库的操作我们都要和这个对象打交道. quotobjConnection.Openquot这用来打开连接.至此与Access数据库的连接完成. quot objConnection.Closequot得到数据或是修改数据后一定要关闭数据库连接 PS: 1.要注意连接字符串中的参数之间要用分号来分隔. 2.如果要连接的数据库文件和当前文件在同一个目录下还可以使用如下的方法连接: strConnectionquotData Sourcequot strConnectionMapPathquotNorthwind.mdbquot 3. quotquot后面的quotquot符号是防止将后面字符串中的quotquot解析为转义字符. -------------------------------------------------------------------------------- C连接SQL Server string strConnectionquotuidsa password quot strConnectionquotinitial catalogNorthwindServerYourSQLServerquot strConnectionquotConnect Timeout30quot SqlConnection objConnectionnew SqlConnectionstrConnection .. objConnection.Open objConnection.Close quotuidsaquot:连接数据库的用户名为sa. quotpasswordquot:连接数据库的验证密码为空.他的别名为quotpwdquot所以我们可以写为quotpwdquot. quotinitial catalogNorthwindquot:使用的数据源为quotNorthwindquot这个数据库.他的别名为quotDatabasequot本句可以写成quotDatabaseNorthwindquot. quotServerYourSQLServerquot:使用名为quotYourSQLServerquot的服务器.他的别名为quotData SourcequotquotAddressquotquotAddrquot. quot Connect Timeout30quot:连接超时时间为30秒.根据情况添加 PS: 1.你的SQL Server必须已经设置了需要用户名和密码来登录否则不能用这样的方式来登录.如果你的SQL Server设置为Windows登录那么在这里就不需要使用quotuidquot和quotpasswordquot这样的方式来登录而需要使用quotTrusted_ConnectionSSPIquot来进行登录. 2. 如果使用的是本地数据库且定义了实例名则可以写为quotServerlocal实例名quot如果是远程服务器则将quotlocalquot替换为远程服务器的名称或IP地址. -------------------------------------------------------------------------------- C连接连接excel string path quotc:book1.xlsquot string strConnection quotprovidermicrosoft.jet.oledb.4.0data sourcequot path quotextended propertiesexcel 8.0quot string sql quotselect from sheet1quot OleDbConnection objConnection new OleDbConnectionstrConnection quotc:book1.xls quot文件的路径 quotprovidermicrosoft.jet.oledb.4.0quot是指数据提供者这里使用的是Microsoft Jet引擎也就是excel中的数据引擎
asp.net就是靠这个和excel的数据库连接的. quotdata sourcequot是指明数据源的位置 quotsheet1quot sheet1为excel里标的名称用法name ADO.NET的记忆碎片一 Connection类 Connection 对象主要是开启程序和数据库之间的连结。
没有利用连结对象将数据库打开是无法从数据库中取得数据的。
这个物件在ADO.NET 的最底层我们可以自己产生这个对象或是由其它的对象自动产生。
Connection类的构造有两种方式 string strConn quot...quot//连接字符串 1、SqlConnection cn new SqlConnectionstrConn 2、SqlConnection cn new SqlConnection cn.ConnectionString strConn 其中连接字符串里面有一些信息要记住主要包含服务器实类、数据库、登录服务器的用户名和密码等等还有其他就不一一列出。
那么我们就简单的写一个连接字符串 string strConn quotData Source.Initial CatalogNorthwindUser IDlmfPassword123456quot 这是一个最简单的连接字符串了是基于这种形式的编排的 keyvalue 不过说长不长说短不短的要是记不住里面的key怎么办呢可以下面这个办法解决 SqlConnectionStringBuilder bldr new SqlConnectionStringBuilder bldr.DataSourcequot.quot bldr.InitialCatalogquotNorthwindquot bldr.UserIdquotlmfquot bldr.Passwordquot123456quot SqlConnectionStringBuilder类是net类库的一个内置类ConnectionString中的key的name都在SqlConnectionStringBuilder类实现了属性可以对应对这些属性赋值最后调用bldr.ConnectionString属性就可以得到想要的连接字符串了。
Command类 Command 对象主要可以用来对数据库发出一些指令例如可以对数据库下达查询、新增、修改、删除数据等指令以及呼叫存在数据库中的预存程序等。
这个对象是架构在Connection 对象上也就是Command 对象是透过连结到数据源。
Command类的构造有三种方式 string strConn quot...quot//连接字符串 string strSql quotselect from tableNamequot SqlConnection cn new SqlConnectionstrConn cn.Open 1、SqlCommand cmd new SqlCommand cmd.Connection cn cmd.CommandText strSql 2、SqlCommand cmd new SqlCommandstrSqlcn 3、SqlCommand cmd cn.CreateCommand cmd.CommandText strSql 在对于Command类进行构造完成之后就是相当于我们在数据库的客户端连接了服务器并且写下了需要的SQL语句不过还没有运行SQL语句。
接下来就是应该执行SQL语句了。
使用SqlCommand执行查询ExecuteReader方法 SqlDataReader rdr cmd.ExecuteReader 从代码看出ExecuteReader方法返回一个SqlDataReader对象就是这个对象来检查查询的结果。
SqlDataReader是基于流的方式查询结果。
在同一时间可以查看结果中的一行在移到下一行时上一行就不能再次访问。
有多种方式访问特定的列基于字段名称或基于序号的查询。
遍历查询的结果 whilerdr.Read Console.WriteLinequot0--1quotrdr0rdrquotCustomerNamequot rdr.Close 以上的代码中Read方法的调用同时完成了两项任务第一将SqlDataReader放置在结果集的下一行。
第二方法返回一个boolean值其指示是否存在可运行行。
另外要说明一点在Command类执行ExecuteReader方法返回的rdr的时候不能直接访问结果集的第一行数据要在rdr运行Read方法之后才能访问结果集的第一行。
有时候一个结果集是一个一行一列的用这个方法的可以实现不过成本太大可以用这样的方式解决调用ExecuteScalar方法 object obj new cmd.ExecuteScalar ExecuteScalar方法是返回一个object类型的值。
执行不返回结果集的查询调用ExecuteNonQuery方法 cmd.ExecuteNonQuery 但是这不能看出SQL语句是否成功执行其实ExecuteNonQuery返回int数值。
执行不返回结果集的查询一般有两种情况 1、数据操作语言查询DMLinsert、 update、 delete 这三种操作是不返回结果集的。
2、数据定义语言查询DDLcreate table 、 alter view 、drop proc 如果是DML语句返回的int数值是改变数据库表的多少行数 如果是DDl语句返回的int是-1 ADO.NET的记忆碎片二 接着ADO.NET的记忆碎片一继续 Command类在执行SQL的时候可能会遇到一次执行多条SQL的情况就像这样 string strConn quot...quot//连接字符串 string strSql quotupdate tableName1 set...quotquotupdate tableName2 set...quot SqlConnection cn new SqlConnectionstrConn cn.Open SqlCommand cmd new SqlCommandstrSqlcn int intTotalRowsAffected cmd.ExecuteNonQuery//返回的是多条SQl语句影响的总行数 可以看到返回的是影响数据库表的总行数这并不是我们想要的结果解决的方法是在每次执行一条SQL语句完成的时候就能返回一个数据给我这才是我想的。
好在ADO.NET2.0提供了我们这样的获取机会在Command中公开了一个StatementCompleted事件这个事件是在每一条SQL语句执行完成后促发的并且事件的主要参数中提供了RecordCount属性就是表示这次SQL语句的执行对数据库表所产生的行数的影响。
实现该功能如下 string strConn quot...quot//连接字符串 string strSql quotupdate tableName1 set...quotquotupdate tableName2 set...quot SqlConnection cn new SqlConnectionstrConn cn.Open SqlCommand cmd new SqlCommandstrSqlcn cmd.StatementCompleted new StatementCompletedEventHandlerHandleStatementCompleted int intTotalRowsAffected cmd.ExecuteNonQuery//返回的是多条SQl语句影响的总行数 cn.Close ... static void HandleStatementCompletedobject senderStatementCompletedEventArgs e Console.WriteLinee.RecordCount DataReader类 前面其实已经多次使用了DataReader在此做一回顾 当一个Command对象执行ExecuteReader方法返回值就是一个DataReader类型的实例保存着查询的结果集。
代码如下 SqlDataReader rdr cmd.ExecuteReader 对查询的结果集遍历 whilerdr.Read Console.WriteLinequot0--1quotrdr0rdrquotCustomerNamequot rdr.Close 好了下面对DataReader类进行进一步的研究很多时候我们得到结果集但是想看看里面的字段的数目、字段名称、字段的Net类型、字段的数据库数据类型等这一些架构信息可以帮助我们更好的扩展应用程序ADO.NET也帮助我们实现了方法我们可以自由的调用 forint intField0intFieldltrdr.FieldCountintField//FieldCount是读取字段数量的属性 Console.WriteLineintField Console.WriteLinerdr.GetNameintField//获取字段名称参数是该字段的索引 Console.WriteLinerdr.GetFieldTypeintField.Name//获取net数据类型参数是该字段的索引 Console.WriteLinerdr.GetDataTypeNameintField//获取数据库数据类型参数是该字段的索引 Console.WriteLine rdr.Close 知道了字段名称怎么确定字段的索引可以使用GetOrdinal方法 int fieldInt rdr.GetOrdinalquotCustomerNamequot//返回CustomerName这个字段的索引 用基于序号的查阅字段内容比基于字段名称查阅性能好所有就是因为这个原因有时候GetOrdinal是非常受欢迎的。
原来是 whilerdr.Read Console.WriteLinequot0--1quotrdr0rdrquotCustomerNamequot rdr.Close 可以改成 int fieldInt rdr.GetOrdinalquotCustomerNamequot whilerdr.Read Console.WriteLinequot0quotrdrfieldInt rdr.Close 这样性能就可以得到提升其实这段代码的性能还可以进一步的提升。
强类型的getter 其实目前我们使用的rdr0基于索引的取值其实是返回一个object类型的数值但是我们本来的字段的类型是多样的有intstringdatetime等这样其实里面会有一个类型转换的问题术语是会“装箱”和“拆箱”这是很影响性能的解决的办法就是使用强类型的getter里面定义了许多net数据类型的公开Get如GetStringGetInt32 GetDateTime.代码可以改变如下 int fieldInt rdr.GetOrdinalquotCustomerNamequot whilerdr.Read Console.WriteLinequot0quotrdr.GetStringfieldInt rdr.Close 在开发过程中如果不能确定字段的类型请尝试调用GetFieldType. 处理来自查询的多个结果集 很多时候我们一次查询会返回多个select结果但是用DataRead实例中的Read方法只能访问第一个结果集要访问其他的结果集要调用NextResult方法。
代码 do whilerdr.Read Console.WriteLinequot0quotrdr.GetStringfieldInt whilerdr.NextResult ADO.NET的记忆碎片三 接着ADO.NET的记忆碎片二继续 DataAdapter类 主要是在数据源以及DataSet 之间执行数据传输的工作它可以透过Command 对象下达命令后并将取得的数据放入DataSet 对象中。
这个对象是架构在Command对象上并提供了许多配合DataSet 使用的功能。
构造一个DataAdapter对象有三方法 string strConn quot...quot//连接字符串 string strSql quotselect from MytableName1quot SqlConnection cn new SqlConnectionstrConn SqlCommand cmd new SqlCommandstrSqlcn 1、SqlDataAdapter da1 new SqlDataAdapterstrSqlstrConn 2、SqlDataAdapter da2 new SqlDataAdapterstrSqlcn 3、SqlDataAdapter da3 new SqlDataAdaptercmd 其实这三种方法很多时候可以互换使用不过第一种有一些美中不足当需要多次实例化的时候并且这个strConn链接字符串也是一样的时候会带来一个小问题假设DataAdapter实例化了N次那么也会实例化N个不同Connection的链接其实我们只要一个这样的Connection的链接就好了明显这是没有必要的性能损耗2、3这两种方法可以显示的指定Connection实例可以避免这样的问题。
看看构造好了的SqlDataAdapter怎样将查询的结果存储在DataSet实例中呢可是使用Fill方法 DataSet ds new DataSet da.Fillds foreachDataRow row in ds.Tables0.Rows Console.WriteLinequot0--1quotrow0rowquotCustomerNamequot 关于Fill方法的一个小说明其实当程序进入Fill方法后会先检查Connection是否打开要是打开就可以继续数据的处理最后推出Fill方法要是没有打开就会先打开Connection链接然后处理数据在退出方法之前关闭Connection链接在Fill方法的前后Connection状态是没有改变的Fill的聚合性很强的用起来很简单。
看看下面的代码 cn.Close DataSet ds1 new DataSet DataSet ds2 new DataSet da.Fillds1 da.Fillds2 可以看到Connection是关闭着的不过Fill还是很好的完成了数据的处理但是我们知道其实上面的代码性能是可以进一步提升的因为在调用Fill方法两次中对Connection实例进行了OpenCloseOpenClose的两次调用可以把代码改进 cn.Close DataSet ds1 new DataSet DataSet ds2 new DataSet cn.Open da.Fillds1 da.Fillds2 cn.Close 我们看看存储在DataSet中的DataTable的名称是什么 Console.WriteLinequot0quotds.Tables0.TableName 会看到是“Table”。
这个结果并不能让我们兴奋为什么是这个名称因为SqlDataAdapter在背后是隐式创建了一个SqlDataReader以获得查询的结果。
在SqlDataAdapter查第一行数据之前它会收集SqlDataReader的架构的信息已确定列名称和类型但是在默认的情况下查询引用的表名称不能通过SqlDataReader来获得。
所以在SqlDataReader中就会赋予了“Table”作为查询结果的表名称最后导致了上面的这个结果。
我们可以使用TableMappings这个属性改变这个纠结的现象 DataSet ds new DataSet da.TableMappings.AddquotTablequotquotMyTableNamequot da.Fillds Console.WriteLinequot0quotds.Tables0.TableName//会输出MyTableName Add方法中两个参数第一个参数是表示数据库中的表名称第二个参数是表示DataSet中的表名称。
因为SqlDataReader不能获得真的表名所以赋予了“Table”作为查询结果的表名称为了性能更好这也是没有办法的事情。
Fill方法的重载 DataSet ds new DataSet DataTable table new DataTable 1、da.Fillds 2、da.FilldsquotMyTableNamequot//表示存储在DataSet中的表名称是MyTableName是da.TableMappings.AddquotTablequotquotMyTableNamequotda.Fillds的语法唐 3、da.Filltable 希望将查询的结果映到自己设置的DataSet里使用TableMappings和ColumnMappings的设置完成自己想要的 DataTableMapping tableMap tableMapda.TableMappings.AddquotTablequotquotMyTableNamequot tableMap.ColumnMappings.AddquotEmpIDquotquotMyEmpIDquot tableMap.ColumnMappings.AddquotEmpNamequotquotMyEmpNamequot Add方法中两个参数第一个参数是表示数据库中的表名称第二个参数是表示DataSet中的表名称。
SqlDataReader可以获得列名称和类型不过不能获得表名称。
然后只要执行Fill方法就可以在DataSet中看到查询的结果并且是自己设置的表名和列名 da.Fillds Console.WriteLinequot0quotds.Tables0.TableName foreachDataColumn col in ds.Tables0.Columns Console.WriteLinequot0quotcol.Name 使用批量查询 有时候我们在一次查询中返回多个表结果 string strConn quot...quot//连接字符串 string strSql quotselect from MytableName1quotquotselect from MytableName2quot SqlDataAdapter da new SqlDataAdapterstrSqlstrConn da.TableMappings.AddquotTablequotquotMyTableName1quot da.TableMappings.AddquotTable1quotquotMyTableName2quot DataSet ds new DataSet da.Fillds foreachDataTable table in ds.Tables Console.WriteLinequot0quottable.TableName 从中可以看出来MyTableName1、MyTableName1是我们为结果中的两个表命名而Table和Table1是SqlDataReader不能获得数据库的表名自己给添加的。
最后说一句DataAdapter背后是隐式的创建了DataReader来获取结果集的。
ADO.NET的记忆碎片四 DataSet类 DataSet 这个对象可以视为一个暂存区Cache可以把从数据库中所查询到的数据保留起来甚至可以将整个数据库显示出来。
DataSet 的能力不只是可以储存多个Table 而已还可以透过DataAdapter 对象取得一些例如主键等的数据表结构并可以记录数据表间的关联。
DataSet 对象可以说是ADO.NET 中重量级的对象这个对象架构在DataAdapter 对象上本身不具备和数据源沟通的能力也就是说我们是将DataAdapter 对象当做DataSet 对象以及数据源间传输数据的桥梁。
创建DataSet对象有两种方式 1、DataSet ds new DataSet 2、DataSet ds new DataSetquotMyDataSetquot 第二种方法是加了一个string参数目的是为新生成的DataSet对象的名称初始化。
而第一种生成的DataSet对象是没有名称的。
用前面提到的DataAdapter的Fill方法为ds创建存储结果的结构 string strConn quot...quot//连接字符串 string strSql quotselect from MytableName1quot SqlDataAdapter da new SqlDataAdapterstrSqlstrConn DataSet ds new DataSet da.FilldsquotMyTableNamequot 这个就会让查询结果保存在DataSet对象中的一个名为MyTableName的DataTable对象中。
四个类之间关系 这边先讲一下DataSet、DataTable、DataColumn、DataRow这四个类之间关系。
首先DataSet就是像是一个数据库DataTable就像是数据库中的一张表DataColumn就好像是表中的字段的一些信息如字段名称、类型DataRow就像是表中的一条记录而且DataSet数据的访问只可以通过这个row索引或者row字段名称或者rowDataColumn对象来获取。
那么这几者的关系是DataSet包含着多个DataTableDataTable包含着多个DataColumn和多个DataRow用c描述是 DataSet ds new DataSetquotMyDataS.