天天看點

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等。