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

首頁 > 編程 > C# > 正文

C#連接數據庫的方法

2020-01-24 01:24:22
字體:
來源:轉載
供稿:網友

以下內容給大家c#連接數據庫的方法的相關介紹,本文非常具有參考借鑒價值,具體詳情如下所示。

ASP.NET連接數據庫的技術叫ADO.NET,它是用來向數據庫提交sql語句的一堆類。這里連接的是Sql Server 2008數據庫,其他數據庫用法差不多,就是調用的類名不一樣。

    首先在Web.config(本地的添加應用程序配置文件App.config,本地還要添加System.Configuration.dll程序集)上配置數據庫連接字符串,添加如下節點代碼:

<connectionStrings> <add name="connstr" connectionString="Data Source=.;Initial Catalog=Milk ;User Id=sa;Password=521521521;"></add> </connectionStrings>

    name是鏈接字符串名稱,可以隨便取。connectionString是鏈接字符串。Data Source數據庫所在服務器IP地址,這里是本地寫“.”。 Initial Catalog是數據庫名稱。User Id是數據庫用戶,其中sa是最高權限管理員賬戶,需要謹慎使用,而是針對數據庫建立數據庫的專用受限賬戶。Password是密碼。

    程序使用數據庫時,先提取配置文件的連接字符串賦值給一個變量。代碼如下:

public static readonly string connstr =ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;

ConfigurationManager是靜態類,提供對客戶端應用程序配置文件的訪問。

    接著打開數據庫連接,使用完畢后用using自動釋放連接:

SqlConnection是個密封類,表示 SQL Server 數據庫的一個打開的連接。接著是執行SQL語句,先定義向數據庫發送指令用到的SqlCommand類,定義之后確定語句執行的連接對象是conn,再確定要執行的SQL語句,用法舉例如下:

//SqlConnection為建立和數據庫連接的對象using(SqlConnection conn = new SqlConnection(connstr)){conn.Open();//打開連接//通過連接創建一個向數據庫發命令(Command)的對象SqlCommandusing(SqlCommand cmd = conn.CreateCommand()){cmd.CommandText =”Insert into T_Student*(Name,Age) values(‘XXX',18)”;// CommandText要執行的SQL語句cmd.ExecuteNonQuery();//執行}}

ExecuteNonQuery()一般用來執行Update、Delete、Insert語句

對于一種一行、一列返回值的結果執行用ExecuteScalar(),它返回object類型。舉例如下:

using(SqlConnection conn = new SqlConnection(connstr)){conn.Open();//打開連接//通過連接創建一個向數據庫發命令(Command)的對象SqlCommandusing(SqlCommand cmd = conn.CreateCommand()){cmd.CommandText =”select Name from T_Student where Name=”XXX””;// CommandText要執行的SQL語句cmd.ExecuteScalar();//執行}}

返回值有多行結果時要用ExecuteReader(),返回類型SqlDataReader,需要釋放,用法舉例:

using(SqlConnection conn = new SqlConnection(connstr)){conn.Open();//打開連接//通過連接創建一個向數據庫發命令(Command)的對象SqlCommandusing(SqlCommand cmd = conn.CreateCommand()){cmd.CommandText =”select * from T_Student where Age<18”;using(SqlDataReader reader=cmd.ExecuteReader(){  while(reader.Read()){ string name=reader.GetString(1);//獲得第一列列的值 int age=reader.GetIn32(2); //獲得第2列列的值 Console.WriteLine(name); Console.WriteLine(age.ToString());}}}}

  其中Read方法返回bool類型,查詢結果是放到數據庫中,沒有放到客戶端。初始指針指向第一條數據之前,每調用一次Reader指針下移一條,只要沒有移到最后一條之后,就直接返回true。reader的GetString/GetInt32等方法只接受整數參數,也就是序號,用GetOrdinal方法根據列名動態得到序號。

0列

第一列

第二列

第三列

Id

Name

Age

Hobby

1

XXX

18

勾搭妹子

2

王旭

30

勾搭妹子

圖 1   數據庫T_Student表

為了避免數據庫注入漏洞,微軟設置有查詢參數,舉例如下:

cmd.CommandText =”select * from T_Student where Age<@Age”;

cmd.Parameters.Add(new SqlParameter(“@Age”,19));

這里把@Age設置為查詢參數,但是@參數不能用了替換表名、字段名、select之類的關鍵字等。

    SqlDataReader是和連接相關的,SqlDataReader中的查詢結果并不是放在程序中的,而是放在數據庫服務器中,SqlDataReader只是相當于一個游標,指到哪里讀到哪里。

    ADO.NET提供了數據集機制,DataSet,存在本地內存,其包含若干DataTable,DataTable包含若干行DataRow。使用方法:

DataSet dataset=new DataSet();SqlDataAdapter adapter=new SqlDataAdapter(cmd);adapter.Fill(dataset);

SqlDataAdapter是一個幫我們把SqlCommand查詢結果填充到DataSet中的類,DataSet相當于本地的list集合(小數據庫)。遍歷方法如下:

DataTable table=dataset.Tables[0];//一般情況下只有一個Tables,當同時執行多個select語句時有多個Tables。DataRowCollection rows=table.Rows;for(int i=0;i<rows.Count;i++){  DataRow row=rows[i];int age=(int)row[“Age”];//遍歷年齡}

基本上所有的步驟都是:打開鏈接--創建命令--執行--處理執行結果。所以可以寫個公共類自己用,避免重復代碼,詳細代碼如下:

public static class SqlHelper  {    public static readonly string connstr =      ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;    public static SqlConnection OpenConnection()//建立連接    {      SqlConnection conn = new SqlConnection(connstr);      conn.Open();      return conn;    }    public static int ExecuteNonQuery(string cmdText,      params SqlParameter[] parameters)//注意看有使用長度可變參數進行了簡化    {      using (SqlConnection conn = new SqlConnection(connstr))      {        conn.Open();        return ExecuteNonQuery(conn, cmdText, parameters);      }    }    public static object ExecuteScalar(string cmdText,      params SqlParameter[] parameters)    {      using (SqlConnection conn = new SqlConnection(connstr))      {        conn.Open();        return ExecuteScalar(conn, cmdText, parameters);      }    }    public static DataTable ExecuteDataTable(string cmdText,      params SqlParameter[] parameters)    {      using (SqlConnection conn = new SqlConnection(connstr))      {        conn.Open();        return ExecuteDataTable(conn, cmdText, parameters);      }    }    public static int ExecuteNonQuery(SqlConnection conn,string cmdText,      params SqlParameter[] parameters)    {      using (SqlCommand cmd = conn.CreateCommand())      {        cmd.CommandText = cmdText;        cmd.Parameters.AddRange(parameters);        return cmd.ExecuteNonQuery();//返回執行了多少行      }    }    public static object ExecuteScalar(SqlConnection conn, string cmdText,      params SqlParameter[] parameters)    {      using (SqlCommand cmd = conn.CreateCommand())      {        cmd.CommandText = cmdText;        cmd.Parameters.AddRange(parameters);        return cmd.ExecuteScalar();      }    }    public static DataTable ExecuteDataTable(SqlConnection conn, string cmdText,      params SqlParameter[] parameters)    {      using (SqlCommand cmd = conn.CreateCommand())      {        cmd.CommandText = cmdText;        cmd.Parameters.AddRange(parameters);        using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))        {          DataTable dt = new DataTable();          adapter.Fill(dt);          return dt;        }      }    }    public static object ToDBValue(this object value)    {      return value == null ? DBNull.Value : value;    }    public static object FromDBValue(this object dbValue)    {      return dbValue == DBNull.Value ? null : dbValue;    }  }

封裝方法的原則:把不變的放到方法里,把變化的放到參數里,SqlHelper類里返回值是一行一列的用ExecuteScaler,ExecuteNonQuery一般用來執行Update/Delete/Insert語句,ExecuteDataTable只用來執行查詢結果比較少的sql,返回值是DataTable。

在數據庫中NULL和“”不一樣,NULL和0也不一樣。數據庫中NULL表示不“知道”。假如一個表中有個可空字段Name,如果有幾個實例Name為NULL,

select * from T_Student where Name=NULL是查不到任何數據的。
select * from T_Student where Name is NULL可以查到所有Name填NULL的數據。

需求:如果沒輸入姓名,則姓名應該為NULL,如果沒輸入年齡,則年齡應該為NULL。

問題:在SqlParameter如果參數值為null,則表示沒有提供參數的值,會報錯。

解決方法:.NET提供DBNull.Value用來表示數據庫中的NULL。以為DBNull.Value是object類型。所以需要這樣用:

object objName;string name=tbName.Text;if(name.Length<0){  objName=DBNull.Value;}else{  objName=name;}

接著SqlParameter參數改為objName。

同時讀取數據庫時,存在Null,返回給.NET的值也是DBNull.Value。所以讀取后還要判斷后賦值,用法如下:

if(row[“Name”]==DBNull.Value){ name=null;}else{ name=(string)row[“Name”];}

但是也有個問題,如果是int類型,則不能為null,就該定義的時候用int? age。

必須嚴格區分0,NULL和“”,否則出現問題很難查到。

附帶上次講的SqlHelper里的兩個函數,就是對上面兩個用法的封裝,可以直接用在SqlParameter參數中。

可空數據輸入數據庫時用

public static object ToDBValue(this object value)    {      return value == null ? DBNull.Value : value;    }

輸出時用

    public static object FromDBValue(this object dbValue)    {      return dbValue == DBNull.Value ? null : dbValue;    }

這個主要是用在SqlParameter中,實現可空數據的輸入輸出。

以上內容是關于本文給大家介紹的C#連接數據庫的方法,希望大家喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品日韩视频在线观看| 九色精品美女在线| 久久久久999| 日本a级片电影一区二区| 国产成人精品综合久久久| 免费av在线一区| 91久久久久久久久久久久久| 91国产美女在线观看| 国产精品视频地址| 亚洲精品大尺度| 国产精品免费一区豆花| 欧美高清在线播放| 国产精品av在线播放| 午夜精品一区二区三区在线视| 国产99久久精品一区二区| 亚洲jizzjizz日本少妇| 456亚洲影院| 久久免费视频这里只有精品| 欧美又大又粗又长| 国产精品欧美一区二区| 色香阁99久久精品久久久| 在线亚洲午夜片av大片| 日韩成人中文字幕| 成人自拍性视频| 高潮白浆女日韩av免费看| 亚洲成人免费网站| 欧美裸体xxxxx| 亚洲精品丝袜日韩| 亚洲xxxx做受欧美| 欧美高跟鞋交xxxxhd| 色婷婷av一区二区三区久久| 一区二区三区视频免费| 欧美激情a∨在线视频播放| 精品久久久久久久久国产字幕| 久久精视频免费在线久久完整在线看| 欧美野外猛男的大粗鳮| 国产偷亚洲偷欧美偷精品| 亚洲色图日韩av| 日本免费一区二区三区视频观看| 懂色av中文一区二区三区天美| 精品无人区太爽高潮在线播放| 亚洲男人天堂2024| 亚洲国产精品va在线看黑人动漫| 色午夜这里只有精品| 色与欲影视天天看综合网| 国产亚洲精品久久久| 欧美夜福利tv在线| 欧美日韩免费看| 国产精品91久久久久久| 日韩免费高清在线观看| 亚洲人成免费电影| 久久影院在线观看| 日韩高清av一区二区三区| 亚洲欧洲国产伦综合| 色偷偷av一区二区三区乱| 国产日韩精品入口| 欧美日韩免费在线观看| 久久视频在线观看免费| 欧美日韩在线视频首页| 久久婷婷国产麻豆91天堂| 亚洲欧美国内爽妇网| 日韩精品亚洲精品| 久久亚洲私人国产精品va| 欧美高清视频在线| 日韩亚洲一区二区| 欧美精品精品精品精品免费| 国产精品免费一区二区三区都可以| 国产一区视频在线| 国产69精品久久久久9| 91免费在线视频网站| 国产成人一区三区| 久久精品国产亚洲| 欧美噜噜久久久xxx| 欧美成人免费在线观看| 久久影视电视剧凤归四时歌| 国产日韩在线精品av| 亚洲第一精品久久忘忧草社区| 色先锋资源久久综合5566| 亚洲最大福利视频网站| 欧美床上激情在线观看| 国产精品对白刺激| 亚洲国产成人精品女人久久久| 亚洲欧美国产制服动漫| 911国产网站尤物在线观看| 亚州国产精品久久久| 欧美精品18videos性欧美| 国产精品亚洲综合天堂夜夜| 欧美韩日一区二区| 色偷偷噜噜噜亚洲男人| 91中文字幕在线观看| 欧美成人激情视频| 精品视频在线播放免| 国产成人一区二区三区电影| 97视频国产在线| 国产va免费精品高清在线观看| 国产成人精彩在线视频九色| 777午夜精品福利在线观看| 欧美黄网免费在线观看| 欧美日韩高清区| 一区二区三区亚洲| 国自在线精品视频| 91探花福利精品国产自产在线| 国产美女91呻吟求| 最好看的2019的中文字幕视频| 久久夜色撩人精品| 日韩福利在线播放| 91国自产精品中文字幕亚洲| 68精品国产免费久久久久久婷婷| 国产成人精品久久亚洲高清不卡| 欧美一区第一页| 国产成人一区二| 精品免费在线观看| 亚洲成人av片| 亚洲最大的成人网| 91豆花精品一区| 97视频免费观看| 亚洲国产日韩欧美综合久久| 亚洲精品国产精品乱码不99按摩| 久久精品99国产精品酒店日本| 精品偷拍一区二区三区在线看| 九九久久久久久久久激情| 欧美在线观看视频| 国产精品精品久久久| 日韩免费av一区二区| 国产精品高清免费在线观看| 欧美一级大片视频| 亚洲欧美www| 久久人91精品久久久久久不卡| 日韩av成人在线观看| 91国在线精品国内播放| 日韩综合中文字幕| 国产精品欧美久久久| 国产亚洲免费的视频看| 久久久久成人精品| 按摩亚洲人久久| 久久噜噜噜精品国产亚洲综合| 久久不射热爱视频精品| 亚洲国产精品女人久久久| 92福利视频午夜1000合集在线观看| 久久91亚洲人成电影网站| 亚洲欧美国产精品va在线观看| 日韩久久免费视频| 精品福利在线视频| 一区二区三区高清国产| 欧洲成人在线视频| 久久久久久综合网天天| 日本精品久久久| 欧美在线视频观看| 欧美成人精品在线播放| 欧美性猛交xxxx偷拍洗澡| 国产91亚洲精品| 亚洲自拍欧美另类| 日韩精品免费一线在线观看| 国产精品国产亚洲伊人久久| 色综合久久中文字幕综合网小说| 92版电视剧仙鹤神针在线观看| 亚洲成人三级在线| 国产精品久久久久久超碰| 51精品国产黑色丝袜高跟鞋| 亚洲天天在线日亚洲洲精| 日韩成人黄色av| 91精品国产色综合久久不卡98口| 欧美精品在线视频观看| 97精品视频在线播放|