香蕉视频app

Keep on going never give up.

Let's Go

C# 學習筆記(31)C#連接SQL Server數據庫增刪改查

C#Lonely2019-05-12 23:10:43347次3條

C#連接SQL Server數據庫

1、引入命名空間

using System.Data;

香蕉视频app using System.Data.SqlClient;

2、創建數據庫連接字符串

連接字符串有多種寫法,這里簡單兩種:

①、string strConn =”Server=服務器名;Database=數據庫名;uid=用戶名;pwd=密碼;”;

香蕉视频app ②、string strConn =”Data Source=服務器名;initial catalog=數據庫名; integrated security=True;Connect Timeout=30;”;

3、建立連接對象

香蕉视频app SqlConnection conn=new SqlConnection(strConn);  

4、打開數據庫連接

if (conn.State == ConnectionState.Closed) //判斷數據庫連接是否已經打開,如果沒打開則打開數據庫連接

{

    conn.Open(); //打開數據庫連接

}

5、創建SqlCommand等進行數據庫操作

增刪改查等操作...

6、關閉數據庫連接

香蕉视频app conn.Close(); //關閉數據庫連接


解釋:

香蕉视频app “uid”也可寫作“user id”:指的是連接數據庫的驗證用戶名。

“pwd”也可寫作“password”:指的是連接數據庫的驗證密碼。

注意:如果你的SQL Server設置為SQL Server 身份驗證則需要用戶名和密碼來登錄。 如果你的SQL Server設置為Windows 驗證,那么在這里就不需要使用“user id”和“password”這樣的方式來登錄,而需要使用“integrated security=True;”來進行登錄。

香蕉视频app “Database”也可寫作“initial catalog=”:指的是使用的數據源,也就是你數據庫的名稱。

“Server”也可寫作“Data Source”:指的是使用的服務器名稱。

“Connect Timeout=30”:指的是連接超時時間為30秒。


下面來看個簡單的登錄示例:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient; //引入命名空間

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("請輸入您的賬號:");
            string userName = Console.ReadLine();
            Console.WriteLine("請輸入您的密碼:");
            string userPwd = Console.ReadLine();
            
            string strConn = @"Data Source=.;Initial Catalog=Test; integrated security=True;"; //定義連接字符串
            SqlConnection conn = new SqlConnection(strConn); //定義連接對象并實例化(實例化時需要提供連接字符串作為參數)
            try
            {
                if (conn.State == ConnectionState.Closed) //判斷數據庫連接是否已經打開,如果沒打開則打開數據庫連接
                {
                    conn.Open(); //打開數據庫連接
                }
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    //SQL參數化查詢可以防止SQL注入
                    cmd.CommandText = "select * from T_User where user_name=@UserName and user_pwd=@PassWord";
                    cmd.Parameters.AddWithValue("@UserName", userName);
                    cmd.Parameters.AddWithValue("@PassWord", userPwd);
                    using (SqlDataReader reader = cmd.ExecuteReader()) //將查詢到的數據保存在reader這個變量里
                    {
                        //從reader中讀取下一行數據,如果沒有數據,reader.Read()返回flase 如果reader.Read()的結果不為空, 則說明查詢結果存在
                        if (reader.Read())
                        {
                            Console.WriteLine("登錄成功");
                        }
                        else //說明查詢結果不存在
                        {
                            Console.WriteLine("您輸入的賬號或密碼有誤!");
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                conn.Close(); //關閉數據庫連接
            }
            Console.ReadKey();
        }
    }
}


數據庫連接字符串通常寫在config配置文件中,方便修改。

香蕉视频app 1、首先先在工程里添加system.configuration.dll程序集的引用。

2、打開config配置文件,添加如下代碼:

image.png

<!-- 配置數據庫連接字符串 方式一 -->
<connectionStrings>
    <add name="strConn" connectionString="Data Source=.;Initial Catalog=Test; integrated security=True;" providerName="System.Data.SqlClient"/>
</connectionStrings>

<!-- 配置數據庫連接字符串 方式二 -->
<appSettings>
    <add key="strConn" value="Data Source=.;Initial Catalog=Test; integrated security=True;" />
</appSettings>

3、寫代碼讀取配置文件的參數

//以下兩種方式,二選一即可
string strConn = ConfigurationManager.ConnectionStrings["strConn"].ToString(); //方式一
string strConn = ConfigurationSettings.AppSettings["strConn"].ToString(); //方式二


香蕉视频app 代碼示例(方式一):

using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient; //引入命名空間

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            //讀取出config文件中定義參數的值
            string strConn = ConfigurationManager.ConnectionStrings["strConn"].ToString();
            DataTable dt = null;
            try
            {
                //這里使用了using,會自動釋放資源,所以不需要手動關閉數據庫連接
                using (SqlConnection conn = new SqlConnection(strConn)) //定義連接對象并實例化(實例化時需要提供連接字符串作為參數)
                {
                    if (conn.State == ConnectionState.Closed) //判斷數據庫連接是否已經打開,如果沒打開則打開數據庫連接
                    {
                        conn.Open(); //打開數據庫連接
                    }
                    using (SqlCommand cmd = new SqlCommand("select * from T_Student", conn))
                    {
                        using (SqlDataReader dr = cmd.ExecuteReader())
                        {
                            dt = new DataTable();
                            dt.Load(dr);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            if (dt != null)
            {
                Console.WriteLine("學號\t\t姓名\t\t性別\t年齡\t班別\r\n");
                //讀出DataTable中的數據
                for (int i = 0; i < dt.Rows.Count; i++) //行
                {
                    for (int j = 0; j < dt.Columns.Count; j++) //列
                    {
                        Console.Write(dt.Rows[i][j]);
                        Console.Write("\t");
                    }
                    Console.WriteLine();
                }
            }
            Console.ReadKey();
        }
    }
}

香蕉视频app 代碼示例(方式二):

using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient; //引入命名空間

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            //讀取出config文件中定義參數的值
            string strConn = ConfigurationManager.ConnectionStrings["strConn"].ToString();
            DataSet ds = null;
            try
            {
                //這里使用了using,會自動釋放資源,所以不需要手動關閉數據庫連接
                using (SqlConnection conn = new SqlConnection(strConn)) //定義連接對象并實例化(實例化時需要提供連接字符串作為參數)
                {
                    if (conn.State == ConnectionState.Closed) //判斷數據庫連接是否已經打開,如果沒打開則打開數據庫連接
                    {
                        conn.Open(); //打開數據庫連接
                    }                    
                    //實例化適配器,在實例化時需要提供查詢語句和連接對象作為參數
                    using (SqlDataAdapter da = new SqlDataAdapter("select * from T_Student", conn))
                    {
                        ds = new DataSet(); //實例化記錄集
                        da.Fill(ds, "myTable"); //通過適配器的Fill方法,把數據填充到記錄集中,這時候需要提供記錄集對象和一個表名作為參數  
                    }                                       
                }
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            if (ds != null)
            {
                Console.WriteLine("學號\t\t姓名\t\t性別\t年齡\t班別\r\n");
                //讀出ds.Tables["myTable"]中的數據
                for (int i = 0; i < ds.Tables["myTable"].Rows.Count; i++) //行
                {
                    for (int j = 0; j < ds.Tables["myTable"].Columns.Count; j++) //列
                    {
                        Console.Write(ds.Tables["myTable"].Rows[i][j]);
                        Console.Write("\t");
                    }
                    Console.WriteLine();
                }             
            }                      
            Console.ReadKey();
        }
    }
}

運行結果:

image.png


增刪改

代碼示例:

using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient; //引入命名空間

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            //讀取出config文件中定義參數的值
            string strConn = ConfigurationManager.ConnectionStrings["strConn"].ToString();
            try
            {
                //這里使用了using,會自動釋放資源,所以不需要手動關閉數據庫連接
                using (SqlConnection conn = new SqlConnection(strConn)) //定義連接對象并實例化(實例化時需要提供連接字符串作為參數)
                {
                    if (conn.State == ConnectionState.Closed) //判斷數據庫連接是否已經打開,如果沒打開則打開數據庫連接
                    {
                        conn.Open(); //打開數據庫連接
                    }
                    string strIns = "insert into T_Student (stu_id,stu_name,stu_gender,stu_age,stu_class) values('7','張麗麗','女','20','163班')"; //增
                    //string strUp = "update T_Student set stu_name='張小麗' where stu_id='7'"; //改
                    //string strDel = "delete T_Student where stu_id='7'"; //刪
                    using (SqlCommand cmd = new SqlCommand(strIns, conn))
                    {
                        //增刪改等操作都是使用cmd.ExecuteNonQuery(); 
                        int result = cmd.ExecuteNonQuery(); //返回受影響的行數
                        Console.WriteLine("受影響的行數:"+ result);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }     
            Console.ReadKey();
        }
    }
}


為了避免寫過多重復的代碼造成冗余,我們可以簡單的把這些增刪改查的操作封裝成一個數據庫幫助類,代碼如下:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp
{
    public class SqlHelper
    {
        /// <summary>
        /// 連接字符串
        /// </summary>
        private string StrConn { get; set; }

        #region 定義變量

        //表示 SQL Server 數據庫的一個打開的連接,若要確保連接始終關閉,請在 using 塊內部打開連接。這樣可確保在代碼退出代碼塊時自動關閉連接。 
        private SqlConnection conn = null;

        //表示要對 SQL Server 數據庫執行的一個 Transact-SQL 語句或存儲過程。
        private SqlCommand cmd = null;

        //可以用SqlDataReader類對象從SQL Server數據庫中讀取行,DataReader對象允許你以向前的,只讀的方式讀取數據
        private SqlDataReader dr = null;

        //DataTable 是一個臨時保存數據的網格虛擬表(表示內存中數據的一個表)。
        private DataTable dt = null;

        //SqlDataAdapter是 DataSet和 SQL Server之間的橋接器。SqlDataAdapter通過對數據源使用適當的Transact-SQL語句映射 Fill(它可填充DataSet中的數據以匹配數據源中的數據)和 Update(它可更改數據源中的數據以匹配 DataSet中的數據)來提供這一橋接。當SqlDataAdapter填充 DataSet時,它為返回的數據創建必需的表和列(如果這些表和列尚不存在)。
        //private SqlDataAdapter da = null;

        //因為DataSet可以看做是內存中的數據庫,也因此可以說DataSet是數據表的集合,它可以包含任意多個數據表(DataTable),而且每一 DataSet中的數據表(DataTable)對應一個數據源中的數據表(Table)或是數據視圖(View)。
        //private DataSet ds = null;

        #endregion

        public SqlHelper()
        {
            //讀取出config文件中定義參數的值
            StrConn = ConfigurationManager.ConnectionStrings["strConn"].ToString();
            conn = new SqlConnection(StrConn); //定義連接對象并實例化(實例化時需要提供連接字符串作為參數)
        }

        public SqlHelper( string strConn)
        {
            StrConn = strConn;
            conn = new SqlConnection(StrConn); //定義連接對象并實例化(實例化時需要提供連接字符串作為參數)
        }

        #region 判斷數據庫連接是否已經打開,如果沒打開則打開數據庫連接,并返回該連接對象。

        /// <summary>
        /// 判斷數據庫連接是否已經打開,如果沒打開則打開數據庫連接,并返回該連接對象。
        /// </summary>
        /// <returns>返回該連接對象</returns>
        private SqlConnection OpenDatabase()
        {            
            try
            {                
                if (conn.State == ConnectionState.Closed) //判斷數據庫連接是否已經打開,如果沒打開則打開數據庫連接
                {
                    conn.Open(); //打開數據庫連接
                }
                return conn;
            }
            catch(Exception ex)
            {
                throw ex;
            }
        }

        #endregion

        #region 執行查詢的sql語句

        /// <summary>
        /// 執行查詢sql語句并返回一個DataTable表
        /// </summary>
        /// <param name="strSelect">查詢sql語句</param>
        /// <returns>返回一個DataTable表</returns>
        public DataTable Select(string strSelect)
        {
            try
            {
                using (cmd = new SqlCommand(strSelect, OpenDatabase()))
                {
                    using (dr = cmd.ExecuteReader())
                    {
                        dt = new DataTable();
                        dt.Load(dr);
                    }
                }                
                return dt;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conn.Close();//關閉數據庫連接
            }
        }

        /// <summary>
        /// 執行查詢帶參的sql語句并返回一個DataTable表
        /// </summary>
        /// <param name="strSelect">查詢sql語句</param>
        /// <param name="par">sql語句中的參數</param>
        /// <returns>返回一個DataTable表</returns>
        public DataTable Select(string strSelect, SqlParameter par)
        {
            try
            {                
                using (cmd = new SqlCommand(strSelect, OpenDatabase()))
                {
                    cmd.Parameters.Add(par);
                    using (dr = cmd.ExecuteReader())
                    {
                        dt = new DataTable();
                        dt.Load(dr);
                    }
                }
                return dt;
            }
            catch(Exception ex)
            {
                throw ex;
            }
            finally
            {
                conn.Close();//關閉數據庫連接
            }
        }

        public DataTable Select(string strSelect, SqlParameter[] par)
        {
            try
            {               
                using (cmd = new SqlCommand(strSelect, OpenDatabase()))
                {
                    cmd.Parameters.AddRange(par);
                    using (dr = cmd.ExecuteReader())
                    {
                        dt = new DataTable();
                        dt.Load(dr);
                    }
                }
                return dt;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conn.Close();//關閉數據庫連接
            }           
        }

        #endregion

        #region 執行增、刪、改sql語句

        /// <summary>
        /// 執行無參的增、刪、改sql語句,并返回受影響的行數
        /// </summary>
        /// <param name="strSql">增、刪、改的sql語句</param>
        /// <returns>返回受影響的行數</returns>
        public int ExecuteNonQuery(string strSql)
        {
            try
            {
                int result = 0;//結果
                using (cmd = new SqlCommand(strSql, OpenDatabase()))
                {
                    result = cmd.ExecuteNonQuery();
                }
                return result;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conn.Close();//關閉數據庫連接
            }            
        }

        /// <summary>
        /// 執行帶參的增、刪、改sql語句,并返回受影響的行數
        /// </summary>
        /// <param name="strSql">增、刪、改的sql語句</param>
        /// <param name="par">sql語句中的參數</param>
        /// <returns>返回受影響的行數</returns>        
        public int ExecuteNonQuery(string strSql, SqlParameter par)
        {
            try
            {
                int result = 0;
                using (cmd = new SqlCommand(strSql, OpenDatabase()))
                {
                    cmd.Parameters.Add(par);
                    result = cmd.ExecuteNonQuery();
                }
                return result;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conn.Close();//關閉數據庫連接
            }           
        }

        public int ExecuteNonQuery(string strSql, SqlParameter[] par)
        {
            try
            {
                int result = 0;
                using (cmd = new SqlCommand(strSql, OpenDatabase()))
                {
                    cmd.Parameters.AddRange(par);
                    result = cmd.ExecuteNonQuery();
                }
                return result;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conn.Close();//關閉數據庫連接
            }           
        }

        #endregion






    }

}


暗錨,解決錨點偏移

文章評論

    嘿,來試試登錄吧!