天天看点

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相同的原理有GetDateTime、GetDouble、GetGuid、GetInt32 等方法。

4.连接池:

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

5.参数化查询,sqlcommand.parameters是command语句中参数(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列

二.使用序数索引器。假如程序中查询了两个列NewsID和NewsContent,按照列索引顺序,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对象是由DataColumn和DataRow对象组成的。创建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 catalog和database是相同的,还有Address、Addr和Network Address,五个词都是相同的。

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

集成Windows账号的安全性声明 Integrated Security和Trusted_Connection等

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