亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

ADO.NET基礎02

2019-11-14 16:17:15
字體:
來源:轉載
供稿:網友

查詢和操作數據庫

  要想從數據庫中讀取多條記錄就必須用到Command對象的ExecuteReader()方法,該方法返回一個DataReader對象,通過其對象的程序就可以訪問數據庫。

基礎知識

conn.close();   //關閉之后還能打開;

conn.dispose();  //直接銷毀不能再次利用,dispose內部有close方法;

 

    

認識DataReader對象

        使用其DataReader對象可以從數據庫中檢索只讀數據,且每次只能從查詢結果中讀取一行到內存中,非常的快,使用其時不能對其進行修改,只能讀取。而且在讀取是一定要與數據庫連接,不能斷開連接。

要創建一個DataReader對象需要調用Command對象的ExecuteRead()方法,此方法返回值就是一個DataReader對象,之后調用其對象的Reader()方法來讀取一行數據,{將其放在一個while循環中,這樣就可以將所有的值全部都顯示出來}

步驟:

1:創建Command對象

     string connSting=”Data Source=zhanghui; Initial Catalog=Ahui; User ID=sa; Pwd=111”

     sqlconnection  conn=new sqlconnection(connString);

     conn.open();

     string  sql=”saelect  count(*) from Student”;

     sqlCommand md=new sqlCommand(sql,conn);

2:調用Command的ExecuteReader()方法創建DataReader對象。

     sqlDataReader  dataReader=md.ExecuteReader();

3:使用其的Read()方法按行去讀取數據,此方法返回一個布爾類型,若讀到數據則返回true,否則返回false,此時用到了while循環。

   while(dataReader.read())

  {

      獲取數據集中的值;

  }

4:

  4.1讀取當前行的某列數據,可以像數組一樣進行索引,按下標進行查詢顯示。

        (string)dataReader[0];

  4.2還有一種方法也可以獲取當前行的某列數據。

       string name=dataReader.GetString(0);                //獲取其第一行的值。

5:關閉其DataReader對象,調用其Close()方法。

eg one : 在前臺輸入用戶,看是否為數據庫表中的數據,若是則顯示成功,不是報錯。

Console.WriteLine("請輸入用戶名");
           string username = Console.ReadLine();
           //數據庫連接字符串
           string connString = "Data Source=zhanghui;Initial Catalog=Ahui;User ID=sa;Pwd=111";
           //創建數據庫的連接
           SqlConnection conn = new SqlConnection(connString);
           conn.Open();  //打開數據庫
           using (SqlCommand kfc = conn.CreateCommand())                                           //創建Command對象。
           {
               kfc.CommandText = "select * from Student where Name=  '"+username +"'  ";   //SQL語句
               using (SqlDataReader read = kfc.ExecuteReader())
               {
                   if (read.Read())
                   {
                       Console.WriteLine("用戶存在");
                   }
                   else
                   {
                       Console.WriteLine("用戶錯誤");
                   }

               }
           }
           Console.WriteLine("打開數據庫連接成功");
           conn.Close();        //關閉數據庫,切記每次用完之后一定要關閉數據庫。
           Console.ReadKey();

wps5C9F.tmp

 

eg two :從數據庫中讀取數據,顯示在窗口中。

一般的注意事項

           User是關鍵字,一般情況下表名以T_開頭,字段以F_開頭;,這樣做的好處是防止表名與字段和系統的關鍵字重復,報錯。

           reader的GenString,GetInt32等方法只能接受整數參數,也就是序號用GetOrdinal方法根據列名動態得到序號。

特殊:  eg three :

   改變上一個登錄程序,使用其count(*)來進行比較,來查看是否登錄成功;

static void Main(string[] args)
        {
            Console.WriteLine("請輸入用戶名");
            string username = Console.ReadLine();
            Console.WriteLine("請輸入密碼");
            string passWord = Console.ReadLine();
            //數據庫連接字符串
            string connString = "Data Source=zhanghui; Initial Catalog=Ahui; User ID=sa; Pwd=111";
            //創建數據庫連接
            SqlConnection conn=new SqlConnection(connString);
            //打開數據庫
            conn.Open();
            using (SqlCommand  ka=conn.CreateCommand())
            {
                ka.CommandText = "select count(*) from login where UserName='"+username+"' and  Password='"+password+"' ";

                //當時在做的時候,不知道在UserName和Password之間加and,花費了很多的時間,最后才知道了,這是SQL語法里面的知識。   
                int i = Convert.ToInt32(ka.ExecuteScalar());

               //在這里的ka.ExecuteScalar()代表的就是ka.Command里面傳出來的值。         

                if (i>0)
                {
                    Console.WriteLine("登錄成功");   
                }
                else
                {
                    Console.WriteLine("用戶名或密碼錯誤?");
                }

            }
            Console.WriteLine("OK");
            Console.ReadKey();

wpsDE7B.tmp

但是為什么我這樣子輸入的話,也會出現登錄成功。

wps1499.tmp

老師說這是一種注入漏洞,只要是登錄名和數據庫中的登錄名一樣,就可以顯示登錄成功。

但是如果想避免情況的發生,就必須使用參數化查詢。

eg:

static void Main(string[] args)
{
    Console.WriteLine("請輸入用戶名");
    string username = Console.ReadLine();
    Console.WriteLine("請輸入密碼");
    string password = Console.ReadLine();
    //數據庫連接字符串
    string connString = "Data Source=zhanghui; Initial Catalog=Ahui; User ID=sa; Pwd=111";
    //創建數據庫連接
    SqlConnection conn=new SqlConnection(connString);
    //打開數據庫
    conn.Open();
    using (SqlCommand  ka=conn.CreateCommand())
    {
        ka.CommandText = "select count(*) from login where UserName=@UserName and  Password=@Password";
       
//上面的可以先看成占位符,通過下面的語句在給其賦值,。

        ka.Parameters.Add(new SqlParameter("UserName",username));

       //Parameters是其ka的一個屬性,是一個集合,通過調用Add來為其上面的占位符來賦值。
        ka.Parameters.Add(new SqlParameter("Password",password));
        int i = Convert.ToInt32(ka.ExecuteScalar());
        if (i>0)
        {
            Console.WriteLine("登錄成功");   
        }
        else
        {
            Console.WriteLine("用戶名或密碼錯誤?");
        }

    }
    Console.WriteLine("OK");
    Console.ReadKey();

wps476D.tmp

上面的修改,是用了其試占位符的字段,來賦值,不是用參數的形式來設值,這樣子就堵注了SQL漏洞攻擊;

在其占位符下面在為其占位符賦值,是將拿輸入的東西當成字符串的值,在數據庫中進行比較,如果有則登陸成功,否則登錄失敗。

***在同一個連接中如果sqlDataReader沒有關閉,那么是不能執行update之類的語句;

下面是一個登錄的實例,但是出現不了自己想要的結果,總是說出錯,有誰做過可以幫我看看,謝謝。

代碼:

/*將第二個要用的數據庫連接必須重新寫在一個類中,進行調用,如果在一個數據庫連接字符串中
        同時進行兩個sql語句的操作就會出現錯誤。
        這樣就相當于將其封裝起來,如果后面要用到,直接調用就行。
        */
       PRivate void hui()
       {
           string connSting = "Data Source=zhanghui; Initial Catalog=Ahui; User ID=sa; Pwd=111;";
           SqlConnection conn = new SqlConnection(connSting);
           conn.Open();
           using (SqlCommand updata = conn.CreateCommand())
           {
               updata.CommandText = "update login Set errorTimes=errorTimes+1 where UserName=@UserName ";
               updata.Parameters.Add(new SqlParameter("UserName", txtUserName.Text));
               updata.ExecuteNonQuery();
           }
       }

       private void btnLand_Click(object sender, EventArgs e)
       {
           string connString = "Data Source=zhanghui; Initial Catalog=Ahui; User ID=sa; Pwd=111;";
           SqlConnection conn=new SqlConnection(connString);
           conn.Open();
           using (SqlCommand lg=conn.CreateCommand())
           {
               lg.CommandText = "select * from login where UserName=@UserName";
               lg.Parameters.Add(new SqlParameter("UserName",txtUserName.Text));
               using (SqlDataReader reader=lg.ExecuteReader())
               {
                   if (reader.Read())
                   {
                       int errorTime = reader.GetInt32(reader.GetOrdinal("errorTimes"));
                       if (errorTime > 3)
                       {
                           MessageBox.Show("登陸次數過多,禁止登錄!");
                           return;
                       }
                       string Ahuipassword = reader.GetString(reader.GetOrdinal("Password"));
                       if (AhuiPassword==txtPassword.Text)
                       {
                           MessageBox.Show("登陸成功");
                       }
                       else
                       {
                           hui();  //調用了本類中上面的一個類。
                           MessageBox.Show("登錄失敗");
                       }
                   }
                   else
                   {
                       MessageBox.Show("用戶名不存在");
                   }
                  
               }
           
           }

}

下面為數據庫截圖和登錄窗口截圖

wps984B.tmp

wpsB731.tmp

運行結果如下,剛開始還可以運行3次,說是登錄失敗,現在只要是輸入就說登錄此數過多,求大神支招

wpsE219.tmp

這個問題我自己一直解決不了,困擾我了很久,希望遇到大神,幫幫我。謝了。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品久久7777777| 国产精品久久久久久久久久| 欧美日韩激情视频8区| 国产成人综合一区二区三区| 亚洲精品98久久久久久中文字幕| 国产亚洲视频中文字幕视频| 日韩在线一区二区三区免费视频| 日韩精品免费视频| 久久777国产线看观看精品| 久久久国产精品x99av| 亚洲第一精品夜夜躁人人躁| 国产精品爱久久久久久久| 国产精品极品在线| 国产视频丨精品|在线观看| 日韩免费av片在线观看| 欧美成人剧情片在线观看| 国产精品久久久久av| 国产一级揄自揄精品视频| 久久大大胆人体| 91大神福利视频在线| 欧美成人免费在线视频| 亚洲精品资源美女情侣酒店| 久久久亚洲影院| 亚洲欧美第一页| 狠狠躁18三区二区一区| 国产精品网站视频| 中文字幕在线亚洲| 久久中文字幕国产| 日韩精品一二三四区| 日本欧美黄网站| 欧美日韩视频在线| 亚洲精品永久免费| 亚洲综合第一页| 91美女片黄在线观| 国产欧美精品在线| 久久久久日韩精品久久久男男| 国语自产偷拍精品视频偷| 久久精品国产久精国产思思| 欧美韩日一区二区| 亚洲人成电影在线观看天堂色| 日韩中文综合网| 日韩精品视频在线播放| 国产小视频国产精品| 亚洲跨种族黑人xxx| 1769国内精品视频在线播放| 久久人人爽人人爽人人片av高请| 日韩av在线天堂网| 久久综合久久八八| 91国内在线视频| 国产色综合天天综合网| 日韩电视剧在线观看免费网站| 最新国产精品亚洲| 国产日韩一区在线| 最新91在线视频| 欧美激情乱人伦一区| 中文字幕av日韩| 日本免费一区二区三区视频观看| 久久综合免费视频影院| 国产精品久久久亚洲| 成人精品福利视频| 国产精品美女免费| 色老头一区二区三区在线观看| 色老头一区二区三区| 亚洲精品午夜精品| 亚洲欧美激情另类校园| 最近2019中文字幕mv免费看| 色播久久人人爽人人爽人人片视av| 欧美专区国产专区| 姬川优奈aav一区二区| 国产一区二区三区视频| www.欧美精品一二三区| 精品久久久久久国产| 国产视频精品xxxx| 在线观看视频99| 91在线免费看网站| 在线电影欧美日韩一区二区私密| 成人激情视频在线观看| 成人免费黄色网| 中文字幕成人在线| 日韩一区二区av| 在线精品国产成人综合| 欧美日韩亚洲一区二区三区| 亚洲日本中文字幕| 国产一区二区三区18| 97精品国产91久久久久久| 尤物九九久久国产精品的分类| 欧美亚洲国产日韩2020| 一区二区三区视频免费| 在线激情影院一区| 亚洲美女福利视频网站| 国产有码在线一区二区视频| 国模gogo一区二区大胆私拍| 国产98色在线| 91精品国产色综合久久不卡98口| 亚洲精品白浆高清久久久久久| 亚洲аv电影天堂网| 欧美黑人国产人伦爽爽爽| 欧美亚洲成人精品| 欧美在线中文字幕| 国产精品免费看久久久香蕉| 久久久久久69| 91国产在线精品| 国产精品中文在线| 成人美女免费网站视频| 91国产精品电影| 久久亚洲影音av资源网| 一区二区av在线| 日本欧美一二三区| 国产情人节一区| 亚洲成人在线视频播放| 欧美另类99xxxxx| 九九热r在线视频精品| 日韩高清免费观看| 国产亚洲欧洲高清| 中文字幕日韩精品在线观看| 国产精品久久久久7777婷婷| 欧美中文字幕精品| 日韩在线观看电影| 国产精品99久久99久久久二8| 亚洲精品国产精品乱码不99按摩| 亚洲黄色在线看| 国产视频999| 国产精品第七十二页| 欧美在线视频一区二区| 7m第一福利500精品视频| 欧美在线视频播放| 亚洲精品综合精品自拍| 亚洲午夜精品久久久久久久久久久久| 色综合色综合久久综合频道88| 日韩中文字幕网站| 日韩精品亚洲元码| 成人欧美一区二区三区黑人| 日韩二区三区在线| 欧美中在线观看| 日韩国产精品亚洲а∨天堂免| 成人精品久久一区二区三区| 亚洲国产精品国自产拍av秋霞| 午夜精品视频在线| 久久免费少妇高潮久久精品99| 国语自产精品视频在线看抢先版图片| 91爱视频在线| 91精品国产综合久久久久久久久| 日本国产欧美一区二区三区| 另类专区欧美制服同性| 91av视频在线免费观看| 国产精品久久中文| 亚洲a一级视频| 成人免费视频在线观看超级碰| 久久成年人免费电影| 亚洲午夜av电影| 岛国精品视频在线播放| 欧美夜福利tv在线| 国产精品视频久久久久| 最新国产成人av网站网址麻豆| 欧美裸体xxxx极品少妇| 精品亚洲一区二区三区| www.日韩不卡电影av| 中文字幕久久久| 96pao国产成视频永久免费| 日韩精品免费综合视频在线播放| 久久综合国产精品台湾中文娱乐网| 久久国产精品久久久久久久久久| 91久久精品久久国产性色也91| 精品国产91久久久久久|