1. 程式人生 > >ADO.NET學習(一)

ADO.NET學習(一)

一、ADO.NET簡介

ADO.NET可以看作是C#語言訪問資料庫的一種方式。程式語言編寫的程式需要資料庫的支援,那麼怎樣才能讓他們建立連線呢?當然是ADO.NET

二、ADO.NET 整體流程

1)寫連線字串

2)寫連線物件

3)寫sql語句

4)寫操作SQL語句的物件SqlCommand

5)開啟資料庫

6)最後寫執行操作物件的方法:ExecuteNonQuery(),executescalar(),ExecuteReader()

其中還有寫小步驟,具體在案例裡面顯示。(第四步和第五步可以互換)

三、連線字串

如果想了解詳細的:https://www.cnblogs.com/shuibi/p/6566127.html

SQL SEVER

標準安全連線: 

Data Source=.;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;或者

Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;Trusted_Connection=False;

可信連線:

Data Source=192.168.0.4;Initial Catalog=MyDataBase;Integrated Security=True;或者

Server=ServerAddress;Database=MyDataBase;Trusted_Connection=True;

Access連線字串

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\myDatabase.mdb;User Id=admin;Password=;

MySQL連線字串

Server=myServerAddress;Database=myDatabase;Uid=myUsername;Pwd=myPassword;

DB2連線字串

Server=myAddress:myPortNumber;Database=myDatabase;UID=myUsername;PWD=myPassword;

Oracle連線字串

Data Source=TORCL;User Id=myUsername;Password=myPassword;

注意:如果你實在不知道怎麼寫,也可以通過VS來獲取連線字串

工具 >>>連線到資料庫

 

提前準備好資料庫,後面使用:
--建立資料庫
create database ExampleInfo
--建立學生表
create table StudentTable(
Sid int not null primary key identity,
Sname varchar(50),
Sage datetime,
Ssex nvarchar(10)
)
insert into StudentTable(Sname,Sage,Ssex) values ('王昭君',18,''),('貂蟬',18,''),('韓信',18,''),
('李白',20,''),('蔡文姬',19,''),('後裔',19,''),('伽羅',19,'')

--建立課程表
create table CourseTable(
Cid int not null primary key identity,
Cname varchar(50),
Tid int
)
insert into CourseTable(Cname,Tid) values ('語文',1),('數學',3),('英語',5),
('物理',4),('化學',6),('生物',5),('地理',2)

--建立教師表
create table TeacherTable(
Tid int not null primary key identity,
Tname varchar(50)
)

insert into TeacherTable(Tname) values ('諸葛亮'),('黃總'),('老夫子'),('墨子'),('女媧'),('伏羲')

--建立一張學生課程表
create table SCTable(
Sid int,
Cid int,
Score int,
foreign Key (Sid) REFERENCES StudentTable(Sid),
foreign Key (Cid) REFERENCES CourseTable(Cid)
)

insert into SCTable (Sid,Cid,Score) values (1,1,80),(1,2,89),(1,3,88),(1,4,87),(1,5,78),
(1,6,48),(1,7,87),(2,1,55),(2,2,77),(2,4,99),(2,5,89),(2,6,15),(3,1,88),(3,2,77),(3,3,78),(3,4,75),(3,5,67),
(3,6,89),(3,7,88),(4,1,78),(4,4,98),(4,5,89),(4,6,78),(4,7,79),(5,1,77),(5,2,85),(5,3,82),(5,5,76),
(5,6,95),(6,1,94),(6,4,48),(7,1,58),(7,2,88),(7,4,75),
(7,6,84),(7,7,99)

 

 

四、連線物件Connection

主要是用於連線到資料庫的

由於後面需要

Connection常用屬性:

  屬性 說明
ConncetionString 獲取或設定用於開啟資料庫的字串
ConnectioTimeout 獲取在嘗試建立連線時終止嘗試並生成錯誤之前所等待的時間
DataBase 獲取當前資料庫,或者連線開啟後要使用的資料名稱
DataSource 獲取喲啊連線的資料庫伺服器的名稱
State 資料庫連線狀態

 

 

 

 

 

 

 

Connection常用方法:

方法 說明
Open 開啟資料庫連線
Close 關閉資料庫連線
Dispose 釋放Connection使用的所有資源

 

 

 

 

 

 

 

這是一個使用模板
//編寫連線字串
String constr = "Data Source = .;Initial Catalog = ExampleInfo;Integrated Security = True"
//建立連線物件
using(SqlConnection conn = new Sqlnnection(Constr)){ // 當在某個程式碼段中使用了類的例項,而希望無論因為什麼原因,只要離開了這個程式碼段就自動呼叫這個類例項的Dispose
//要達到這樣的目的,用try...catch來捕捉異常也是可以的,但用using也很方便。
   
//寫Sql語句 //建立command物件 //開啟資料 //執行 }

五、Command

Command有四種:SqlCommand,OleDbCommand,OdbcCommand,OracleComman

具體看使用的是什麼資料庫。

Command物件常用的屬性

屬性 說明
CommandType 獲取要執行命令的型別
CommandText 獲取或者設定要對資料來源執行的SQL語句或儲存過程或表名
Conncetion 獲取或設定這個Command使用的Connection物件的名稱
Parameters 獲取Command物件需要使用的引數集合
Transaction 獲取或設定將在其中執行的SqlTransaction

 

 

 

 

 

 

 

 

 

 

 

 
 
這是一個使用模板
//
編寫連線字串 String constr = "Data Source = .;Initial Catalog = ExampleInfo;Integrated Security = True" //建立連線物件 using(SqlConnection conn = new Sqlnnection(Constr)){ //寫Sql語句 string sql = "select * from StudentTable"; using(SqlCommand cmd = new Command(sql,conn)){ //開啟資料 conn.Open(); //執行
        ....
} }

 Command物件常用的方法:

(一)ExecuteNonQuery

用於執行非select語句,比如增刪改,它會返回影響的行數

1.向資料庫中的StudentTable表中插入資料
using
System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; namespace commandExecuteNonQuery { class Program { static void Main(string[] args) { //建立連線字串 string constr = "Data Source =.;Initial Catalog = ExampleInfo;Integrated Security = True"; //建立連線物件 using(SqlConnection conn = new SqlConnection(constr)){ //床架sql語句 string sql = "insert into StudentTable (Sname,Sage,Ssex) values ('露娜',16,'女')"; //建立command物件 using (SqlCommand cmd = new SqlCommand(sql, conn)) { //開啟資料庫 conn.Open(); //執行資料語句的command方法 int x = cmd.ExecuteNonQuery(); //返回的是受影響的行數 if (x > 0) { Console.WriteLine("插入成功"); }else{ Console.WriteLine("插入失敗"); } } } } } }

(二)ExecuteScalar

通常用來執行SELECT查詢命令,返回第一行第一列值,所以都是用來執行帶有Count() 或者是Sum()函式的資料庫SQL語句

1.返回資料庫表StudentTable的記錄條數
using
System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; namespace commandExecuteNonQuery { class Program { static void Main(string[] args) { //建立連線字串 string constr = "Data Source =.;Initial Catalog = ExampleInfo;Integrated Security = True"; //建立連線物件 using (SqlConnection conn = new SqlConnection(constr)) { //床架sql語句 string sql = "select Count(*) from StudentTable"; //建立command物件 using (SqlCommand cmd = new SqlCommand(sql, conn)) { //開啟資料庫 conn.Open(); //執行資料語句的command方法 object x = cmd.ExecuteScalar(); Console.WriteLine(x); } } } } }

(三)ExecuteReader

由於ExecuteReader通常是和DataReader一起使用的,所以我就放到DataReader一起說

五、DataReader

是一個簡單的資料集

DataReader物件的常用屬性:

屬性 說明
Connection 獲取與DataReader關聯的Conncetion物件
HasRows 判斷資料庫中是否有資料
FieldCount   獲取當前行的列數
IsClosed 是否已關閉DataReader例項,是一個bool值
Item 獲取指定列的以本機的格式表示的值

 

 

 

 

 

 

 

 

 

 

DataReader物件的常用方法:

方法 說明
ISDBNull 獲取一個值,判斷是否是空值
Read 使DataReader物件指向下一條記錄
NextResult 使資料讀取器前進到下一個結果
Close 關閉DataReader
Get 用來讀取資料集的當前行的某一列的資料

 

 

 

 

 

 

 

 

 

這是一個使用模板
//
連線字串 string constr = "data source =.;Initial catalog = StudentInfo;Integrated Security = True"; //建立連線物件 using (SqlConnection conn = new SqlConnection(str2)) { //sql語句 string sql = "select * from StudentTable"; //建立Command物件 using (SqlCommand comm = new SqlCommand(sql, conn)) {//開啟資料庫 conn.Open(); //建立DataReader物件 using (SqlDataReader reader = comm.ExecuteReader()) { if (reader.HasRows) //如果有資料,一條一條去讀資料 { //reader.Read() 向後移動一條資料(因為預設指向-1,就是開始時候不指向任何資料),有資料就會返回true while (reader.Read()) { .......... } } } } }

 

//小案例:查詢返回表StudentTable

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
namespace commandExecuteNonQuery
{
    class Program
    {
        static void Main(string[] args)
        {
            //建立連線字串
            string constr = "Data Source =.;Initial Catalog = ExampleInfo;Integrated Security = True";
            //建立連線物件
            using (SqlConnection conn = new SqlConnection(constr))
            {
                //床架sql語句
                string sql = "select * from StudentTable";
                //建立command物件
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    //開啟資料庫
                    conn.Open();
                    //執行資料語句ExecuteReader()的方法
                    SqlDataReader reader = cmd.ExecuteReader();
                    if (reader.HasRows) {
                       while (reader.Read()) {
                            Console.Write(reader.GetInt32(0)  +  "             ");
                            Console.Write(reader.GetString(1) + "             ");
                            Console.Write(reader.GetInt32(2) + "             ");
                            Console.Write(reader.GetString(3) + "             ");
                            Console.WriteLine();
                        } } } } } } }

 

六、DataAdapter

 DataAdapter表示一組 SQL 命令和一個數據庫連線,它們用於填充 DataSet和更新資料來源

DataAdapter的屬性:

屬性 說明
SelectCommand 引用從資料來源中檢索行的Command物件
InsertCommand 引用將插入的行從DataSet寫入資料來源的Command物件
UpdateCommand 引用將修改的行從DataSet寫入資料來源的Command物件
DeleteCommand 引用從資料來源中刪除行的Command物件

 

 

 

 

 

 

 

 

 

DataAdapter的方法:

方法 說明
Fill 使用SqlDataAdapter(或OleDbDataAdapter)的這個方法,從資料來源增加或重新整理行,並將這些行放到DataSet表中。Fill方法呼叫SelectCommand屬性所指定的SELECT語句
Update 使用DataAdapter物件的這個方法,將DataSet表的更改傳送到相應的資料來源中。該方法為DataSet的DataTable中每一指定的行呼叫相應的INSERT、UPDATE或DELETE命令

 

 

 

 

 

 

案例、編寫一個小程式,建立一個窗體應用程式,然後在窗體應用程式中建立拖“DataGridView”和‘Button’控制元件。實現點選‘button’控制元件就會在“DataGridView”中顯示

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace DataAdpter
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //建立連線字串
            string constr = "Data Source =.;Initial Catalog = ExampleInfo;Integrated Security = True";
            //建立連線物件
            using (SqlConnection conn = new SqlConnection(constr))
            {
                //床架sql語句
                string sql = "select * from StudentTable";
                //建立command物件
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
            //建立一個DataTable物件 DataTable ds
= new DataTable(); using (SqlDataAdapter adapter = new SqlDataAdapter(sql, constr)) { //開啟資料庫 conn.Open(); adapter.Fill(ds); }  
             //繫結dataGridView控制元件
this.dataGridView1.DataSource = ds; } } } } }
//上述的程式碼中Datable可以改成DataSet  
private void button1_Click_1(object sender, EventArgs e) { //建立連線字串 string constr = "Data Source =.;Initial Catalog = ExampleInfo;Integrated Security = True"; //建立連線物件 using (SqlConnection conn = new SqlConnection(constr)) { //床架sql語句 string sql = "select * from StudentTable"; //建立command物件 using (SqlCommand cmd = new SqlCommand(sql, conn)) { DataSet ds = new DataSet(); using (SqlDataAdapter adapter = new SqlDataAdapter(sql, constr)) { //開啟資料庫 conn.Open(); adapter.Fill(ds); } this.dataGridView1.DataSource = ds.Tables[0]; } } }

六、封裝SqlHelper

 為什麼要封裝成SqlHelper?

 如果不封裝的話,我們每寫一次查詢就要寫一次連線字串,連線物件等等,如果一個程式當中有n個,就要寫n此。那麼不如將其封裝起來,可以直接呼叫。我們只用提供sql語句和引數就可以了

封裝第一步:建立一個專案:窗體應用程式(由於我會直接在這裡寫案例,所以就直接建立窗體),名稱:LoginInfo
封裝第二步:如下圖
封裝第二步驟,在App.config中新增如下程式碼


懶人這裡複製(還是要多多手打哦):
<configuration>
  <connectionStrings>
    <add name="mssqlsrever" connectionString="Data Source =.;Initial Catalog =ExampleInfo;Integrated Security = True"  />
  </connectionStrings>
封裝第三步:建立SqlHelper類

封裝第五步:上程式碼
 
  
  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;

namespace LoginInfo
{
   public class SqlHelper
    {//定義一個連結字串
        //readOnly 修飾的變數,只能在初始話的時候賦值,以及在建構函式中賦值
        //讀取配置檔案中的連結字串
        private static readonly string constr = ConfigurationManager.ConnectionStrings["mssqlsrever"].ConnectionString;


        //執行增刪改的方法   ExecuteNonQuery   params SqlParameter[] paras 可能存在sql語句中帶有引數,那麼需要把引數給加進去
        public static int ExecuteNonQuery(string sql, params SqlParameter[] paras)
        {
            using (SqlConnection conn = new SqlConnection(constr))
            {
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    if (paras != null)
                    {
                        cmd.Parameters.AddRange(paras);
                    }
                    conn.Open();
                    return cmd.ExecuteNonQuery();

                }
            }
        }


        //執行查詢,返回單個值方法   ExecuteScalar
        public static object ExecuteScalar(string sql, params SqlParameter[] paras)
        {
            using (SqlConnection conn = new SqlConnection(constr))
            {
                using (SqlCommand comm = new SqlCommand(sql, conn))
                {
                    if (paras != null)
                    {
                        comm.Parameters.AddRange(paras);
                    }
                    conn.Open();
                    return comm.ExecuteScalar();
                }

            }

        }

        //執行查詢 返回多行多列的方法  ExecuteReader
        public static SqlDataReader ExecuteReader(string sql, params SqlParameter[] paras)
        {
            using (SqlConnection conn = new SqlConnection(constr))
            {
                using (SqlCommand comm = new SqlCommand(sql, conn))
                {
                    if (paras != null)
                    {
                        comm.Parameters.AddRange(paras);
                    }
                    try
                    {
                        conn.Open();
                        return comm.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
                    }
                    catch
                    {
                        conn.Close();
                        conn.Dispose();
                        throw;
                    }
                }
            }
        }

        //執行查詢 返回DataTable  ExecuteDataTable
        public static DataTable ExecuteDataTable(string sql, params SqlParameter[] paras)
        {
            DataTable dt = new DataTable();
            using (SqlDataAdapter adapter = new SqlDataAdapter(sql, constr))
            {
                if (paras != null)
                {

                    adapter.SelectCommand.Parameters.AddRange(paras);
                }
                adapter.Fill(dt);
            }
            return dt;
        }

    }
}
到這裡這個封裝的SqlHelper類就好了。然後我會在這裡寫一個簡單的小案例。

七、綜合小案例

將第六步做完之後,我們直接使用這個封裝好的SqlHelper

(一)在form1 中拖拉控制元件,達到以下效果

(二)編寫程式,就是增刪改查,這裡我直接放程式碼

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace LoginInfo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //進入窗體之後就載入資料
            LoadDate();
        }

        private void LoadDate()
        {
            String sql = "select * from StudentTable";
           this.dataGridView1.DataSource= SqlHelper.ExecuteDataTable(sql);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string Sname = textBox1.Text.Trim();         //Trim() 移除多餘的空格
            string Sage = textBox2.Text.Trim();
            string Ssex = textBox3.Text.Trim();
            string sql = "insert into StudentTable(Sname,Sage,Ssex) values (@Sname,@Sage,@Ssex)";
            //這裡是建立引數,更加的安全,防止不法人員注入sql語句,造成錯誤
            SqlParameter[] paras = new SqlParameter[] { 
                    new SqlParameter("@Sname",SqlDbType.NVarChar,50){Value = Sname},
                    new SqlParameter("@Sage",SqlDbType.NVarChar,50){Value = Sage},
                    new SqlParameter("@Ssex",SqlDbType.NVarChar,50){Value = Ssex}
            };
            //因為執行的是插入操作,所以呼叫ExecuteNonQuery
            int x = SqlHelper.ExecuteNonQuery(sql,paras);
            if (x > 0)
            {
                MessageBox.Show("新增成功");
                //成功的同時,重新載入表格中的資料
                LoadDate();
            }
            else {
                MessageBox.Show("新增失敗");
            
            }
        }

        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            //行點選事件,點選之後,行會吧資料給修改那一欄
            DataGridViewRow current = dataGridView1.CurrentRow;
            textBox6.Text = current.Cells["Sname"].Value.ToString();
            textBox5.Text = current.Cells["Sage"].Value.ToString();
            textBox4.Text = current.Cells["Ssex"].Value.ToString();
            label8.Text = current.Cells["Sid"].Value.ToString();
        }

        private void button2_Click(object sender, EventArgs e)
        {
              string Sname = textBox6.Text;
              string Sage = textBox5.Text;
              string Ssex = textBox4.Text;
              string Sid = label8.Text;
              string sql = "update StudentTable set Sname [email protected] ,Sage = @Sage,Ssex = @Ssex where Sid = @Sid";
              SqlParameter[] paras = new SqlParameter[]{
                    new SqlParameter("@Sname",SqlDbType.NVarChar,50){Value = Sname},
                    new SqlParameter("@Sage",SqlDbType.NVarChar,50){Value = Sage},
                    new SqlParameter("@Ssex",SqlDbType.NVarChar,50){Value = Ssex},
                    new SqlParameter("@Sid",SqlDbType.Int){Value = Sid}

              };
              int x = SqlHelper.ExecuteNonQuery(sql,paras);
              if (x > 0)
              {
                  MessageBox.Show("修改成功");
                  LoadDate();
              }
              else
              {
                  MessageBox.Show("修改失敗");

              }

        }

        private void button3_Click(object sender, EventArgs e)
        {
            string Sid = label8.Text;
            string sql = "delete from StudentTable where Sid = @Sid";
            SqlParameter[] paras = new SqlParameter[]{
                    new SqlParameter("@Sid",SqlDbType.Int){Value = Sid}

              };
            int x = SqlHelper.ExecuteNonQuery(sql, paras);
            if (x > 0)
            {
                MessageBox.Show("刪除成功");
                LoadDate();
            }
            else
            {
                MessageBox.Show("刪除失敗");

            }

        }
       
    }
}
注意:
由於DataGridView還需要設定一些東西:



後續可能還會有補充,由於我是初學,所以有很多東西,不夠詳細,希望諒解