ado.net学习笔记

1.使用这段代码保证能连接到数据库。           

 string dataDir = AppDomain.CurrentDomain.BaseDirectory;

            if (dataDir.EndsWith(@"\bin\Debug\")

            || dataDir.EndsWith(@"\bin\Release\"))

            {

                dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;

                AppDomain.CurrentDomain.SetData("DateDirectory", dataDir);

            }

对这段代码的解释:http://blog.csdn.net/cai115/article/details/8630068

2.一个连接数据库的实例

            using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True"))

            {

                conn.Open();

                Console.WriteLine("打开数据库成功");

                Console.ReadKey();

                

            }

         

            Console.WriteLine("请输入你的用户名");

            string username = Console.ReadLine();

            Console.WriteLine("请输入你的密码");

            string password = Console.ReadLine();

            string connstr = @"Data Source=.\SQLExpress;Integrated Security=true;AttachDBFilename=|DataDirectory|Database1.mdf;Initial Catalog=Database1.mdf2";

            SqlConnection conn = new SqlConnection(connstr);

            conn.Open();

            SqlCommand cmd = new SqlCommand();

            cmd.Connection = conn; //这里要把connection对象链接到command

            cmd.CommandText = "Insert into Table1 (UserName,PassWord) values ('" + username + "','" + password + "')";//这种情况下要用拼接字符串。

            cmd.ExecuteNonQuery(); //执行非select语句

            cmd.CommandText = "select count(*) from Table1";

            Console.WriteLine(cmd.ExecuteScalar()); //返回第一行第一列的数据。

            cmd.Dispose();

            conn.Close();

            Console.WriteLine("关闭成功");

相关的ado.net的知识参考http://www.cnblogs.com/liuhaorain/archive/2012/02/06/2340409.html 

3.

executereader()返回一个sqldatareader对象,这个对象有read()这个方法来历遍记录。read()方法将行游标移动到下一个记录,如果是第一次调用,将移动到第一条记录。每循环一次时,read()方法将返回一个布尔值,当还有其他行时,read()方法返回true,如果已经是最后一行,则返回false,并结束循环。所以要结合while{reader.read()}来使用。可以理解为read()方法是一行一行地读取。

调用sqldatareader对象的read()方法来遍历记录之后,就可以通过如下两种方法来获取datareader对象的值了

1.使用dr.GetString(index)或者dr[index].ToString()的方式。

2.使用dr["字段名"].ToString()的方式。

3.使用dr.GetOrdinal("字段名")来获取字段名所在的列,然后用dr.GetString()来获取记录。合并起来可以为dr.GerString(dr.GetOrdinal("字段名"))

read()方法只能一行一行往下读,不能返回也不能跳进。

GetString相同的原理有GetDateTimeGetDoubleGetGuidGetInt32 等方法。

4.连接池:

可以将连接池看成是已打开的及可重用的数据库所连接的一个容器,也可看成是程序与数据库之间的一个连接。程序与连接池之间是一个逻辑连接,连接池与数据库之间是一个物理连接。当连接字符串传递到连接池里面是,连接池创建一个物理连接,然后调用conn.open()可以建立一个逻辑连接。当用close()时候,实际上是断开与连接池的连接,再使用conn.open()可以继续连接上连接池。当用dispose()的时候,实际上是断开物理连接还有逻辑连接,这时候用conn.open()是不能重新连接的。  这也是close()dispose()的区别。 如果不想使用连接池,则必须在连接字符串中指定“pooling=false. using在出了作用域以后调用Dispose(),SqlConnection,FileStream等的Dispose内部都会中这样的判断:判断有没有close(),如果没有Close就先Close后在Dispose

5.参数化查询,sqlcommand.parameterscommand语句中参数(command中的参数是用@name形式来表示)的一个集合,对参数的赋值可以避免sql攻击。

有三种形式:cmd.parameters.addwithvalue(“@name”,name);

或者是另外一种形式:cmd.parrmeters.add(new parameter(“@name”,name))

或者是cmd.parameters.add(“@name”,sqltype.int);  cmd.parameters[“@name”].value=name;

6.获取datareader中行的数据有下面三种方法:

一.使用列名索引器。 如myDr[“NewsID”],访问NewsID

二.使用序数索引器。假如程序中查询了两个列NewsIDNewsContent,按照列索引顺序,myDr[0]访问NewsID,myDr[1]访问NewsContent

三.使用类型访问器。类型访问器方法都以Get开始,后面跟各种数据类型,参数为列的序数索引号。如访问字符串类型的NewsContent列,语法如下:myDr.GetString(1)

3种访问列的方法中,以类型访问器速度最快,序数访问器其次,列名访问法最慢,但列名访问法在编程中灵活性最高,直观的列名很容易记住,便于维护。

一个使用datareader的例子:

                    using (SqlDataReader reader = cmd.ExecuteReader())

                    {

                        while (reader.Read())

                        {

                      String cityName=reader.GetString(reader.GetOrdinal("cityName"));

                            cmb.Items.Add(cityName);

                        }

7.DataSet相当于内存中的一个小型的关系型数据库,一个DataSet对象包括一组DataTable对象集合,这些对象可以与DataRelation对象相关联,其中,每个DataTable对象是由DataColumnDataRow对象组成的。创建DataSet的代码:

         stringconnStr=ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString;

            using (SqlConnection conn = new SqlConnection(connStr))

            {

                conn.Open();

                    string cmdtxt= "select * from Person";

                    DataSet dt = new DataSet();

                    SqlDataAdapter sa = new SqlDataAdapter(cmdtxt,conn);

                    sa.Fill(dt,"person");//创建一张新表用来储存返回的数据。

                    DataTable Dtable=dt.Tables["person"];

                    for (int i = 0; i < Dtable.Rows.Count; i++)

                    {

                        DataRow dr = Dtable.Rows[i];

                        string name = dr["Name"].ToString();

                        MessageBox.Show(name);

                    }

                }

            }

使用dataset中的数据更新数据库

使用sqlcommandbuilder类将dataset的更新与sql server数据库相协调,dataset被更改后,sqlcommandbuilder会自动生成更新用的sql语句。例如:

SqlConnection myConn=GetConnection();

myConn.Open();

String sqlStr=”select * from tb_News”;

SqlDataAdapter myDa=new SqlDataAdapter(sqlStr,myConn);

//创建DataSet对象

DataSet myDs=new DataSet();

//创建sqlcommandbuilder对象,并和SqlDataAdapter关联

SqlCommandBuilder builder=new SqlCommandBuilder(myDa);

myDa.Fill(myDs,”News”);

for(int i=0;i<=myDs.Tables[“News”].Rows.Count-1;i++)

{

myDs.Tables[“News”].Rows[i][“NewsContent”]=SubStr(Convert.ToString(myDs.Tables[“News”].Rows[i][“NewContent”]),5);

}

myDa.Update(myDs,”News”);//通过DataAdapter对象的Update()方法实现更新。

8.关于数据库连接字符串的问题。

连接字符串中,有些字符串是相同的作用但是有不同的写法。像

服务器声明initial catalogdatabase是相同的,还有AddressAddrNetwork Address,五个词都是相同的。

数据库声明Datasourceserver也是相同的,不过推荐datasource,是标准写法。

集成Windows账号的安全性声明 Integrated SecurityTrusted_Connection

使用数据库账号的安全性声明 User IDPassword等。

锐捷交换机支持LACP(Link Aggregation Control Protocol,链路聚合控制协议)用于实现链路聚合,提高网络带宽和可靠性。 配置LACP链路聚合的步骤如下: 1. 首先,确保交换机上的所有端口均处于相同的VLAN中,并且链路聚合的成员端口上没有任何配置。 2. 登录到交换机的管理界面,在端口聚合配置界面找到需要进行链路聚合端口组。 3. 选择要进行链路聚合端口组,点击添加按钮,选择需要加入链路聚合组的端口。 4. 在链路聚合配置界面的链路聚合配置项中,选择使用LACP作为链路聚合控制协议。 5.配置LACP的模式,可以选择主动模式、被动模式或者静态模式。 6. 配置链路聚合的方式,可以选择使用链路聚合组的MAC地址和IP地址进行负载均衡,也可以选择使用源目地址、源目端口或者协议类型进行负载均衡。 7. 配置链路聚合组的优先级,可以根据实际情况设定。 8. 配置链路聚合组的其他参数,如链路状态、链路监测时间间隔等。 9. 确认配置的正确性并保存设置。 完成以上步骤后,交换机将根据LACP协议进行链路聚合,将多个物理链路组合成一个逻辑链路,提高了带宽和可靠性。在链路聚合组中,其中一个端口将被选为主端口,负责发送和接收数据,其他端口为备用端口,在主端口发生故障时切换到备用端口。 请注意,配置LACP链路聚合前,确保网络设备和服务器也支持LACP协议,并按照相应的步骤进行配置,以保证链路聚合的正常工作和互相兼容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值