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

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

C#連接使用數據庫的方法

2019-11-14 13:50:55
字體:
來源:轉載
供稿:網友

     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)的對象SqlCommand

using(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)的對象SqlCommand

using(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)的對象SqlCommand

using(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中,實現可空數據的輸入輸出。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本午夜在线亚洲.国产| 欧美亚洲国产日本| 深夜成人在线观看| 国产精品jizz在线观看麻豆| 欧美性videos高清精品| 欧美日韩另类视频| 亚洲激情自拍图| 一区二区三区在线播放欧美| xvideos成人免费中文版| 92裸体在线视频网站| 岛国av一区二区三区| 日韩在线观看免费av| 欧美性xxxx极品高清hd直播| 亚洲欧洲免费视频| 国语自产精品视频在线看抢先版图片| 91精品久久久久久久久| 91精品国产自产在线观看永久| 2019中文字幕全在线观看| 亚洲一二三在线| 精品久久久久久久久久久久久久| 日韩精品中文字幕在线播放| 亚洲第一免费播放区| 日韩成人xxxx| 欧美日韩一区二区免费在线观看| 久久久久久久999精品视频| 黄色91在线观看| 欧美激情网站在线观看| 亚洲第一视频在线观看| 欧美午夜www高清视频| 日韩欧美在线视频日韩欧美在线视频| 国产色婷婷国产综合在线理论片a| 久久精品欧美视频| 9.1国产丝袜在线观看| 亚洲天堂av女优| 一个人www欧美| 欧美影院成年免费版| 亚洲国产私拍精品国模在线观看| 欧美天堂在线观看| 亚洲视频欧洲视频| 色av吧综合网| 黑人巨大精品欧美一区二区免费| 亚洲午夜久久久久久久| 97国产精品免费视频| 色av中文字幕一区| 亚洲最大福利网| 亚洲免费人成在线视频观看| 岛国av一区二区在线在线观看| 久久亚洲综合国产精品99麻豆精品福利| 日韩av网址在线观看| 欧美高清在线观看| 久久久国产精品x99av| 国产精品第1页| 美女福利精品视频| 欧洲美女免费图片一区| 亚洲第一精品夜夜躁人人躁| 国产精品丝袜白浆摸在线| 欧美精品九九久久| 欧美中文字幕在线观看| 中文字幕欧美亚洲| zzijzzij亚洲日本成熟少妇| 亚洲另类xxxx| 国产精品va在线播放我和闺蜜| 91在线|亚洲| 亚洲在线一区二区| 久久九九精品99国产精品| 黑人巨大精品欧美一区二区三区| 亚洲在线免费视频| 人妖精品videosex性欧美| 日韩高清av一区二区三区| www.久久久久久.com| 国产精品爽黄69天堂a| 日韩高清av在线| 91精品国产高清久久久久久| 精品免费在线视频| 国产视频丨精品|在线观看| 国自产精品手机在线观看视频| 国产精品久久久久久久久男| 亚洲精品美女在线观看播放| 日日狠狠久久偷偷四色综合免费| 精品爽片免费看久久| 国产精品露脸av在线| 国产丝袜一区二区三区免费视频| 久久精品国产欧美亚洲人人爽| 亚洲精品按摩视频| 91亚洲精华国产精华| 中文字幕av日韩| 亚洲自拍偷拍色片视频| 97精品一区二区视频在线观看| 国产精品18久久久久久麻辣| 国产综合福利在线| 午夜精品久久久久久久99热浪潮| 欧美另类老女人| 成人性生交大片免费看小说| 亚洲精品国产精品国自产观看浪潮| 国产精品美女在线| 在线性视频日韩欧美| 日韩在线观看高清| 亚洲欧洲一区二区三区在线观看| 亚洲a区在线视频| 亚洲国产精品人人爽夜夜爽| 国产日韩一区在线| 欧美性色视频在线| 欧美日韩xxxxx| 国产精品精品视频| www.日韩视频| 91九色国产社区在线观看| 在线国产精品视频| 伊人久久免费视频| 国模叶桐国产精品一区| 中文字幕日韩免费视频| 欧洲中文字幕国产精品| 欧美黄色片免费观看| 最近2019中文字幕在线高清| 日韩av免费在线观看| 欧美成年人视频| 午夜精品一区二区三区在线视| 在线亚洲午夜片av大片| 中文字幕日韩在线观看| 久久不射热爱视频精品| 精品国产成人av| 国产精品视频男人的天堂| 亚洲人成在线免费观看| 精品视频久久久久久| 7777精品久久久久久| 日韩女优人人人人射在线视频| 91免费在线视频网站| 亚洲xxxxx性| 亚洲第一视频网| 久久精品久久精品亚洲人| 亚洲一级一级97网| 日韩美女在线播放| 精品精品国产国产自在线| 国产日韩欧美在线视频观看| 另类专区欧美制服同性| xxxxx成人.com| 欧美成人免费一级人片100| 欧美超级免费视 在线| 亚洲欧美日韩视频一区| 中文字幕亚洲一区在线观看| 日韩国产激情在线| 国产精品露脸自拍| 国产精品久久久久久久久久99| 亚洲国产精品va在线看黑人| 欧美最猛性xxxxx亚洲精品| 国产一区二中文字幕在线看| 久久久久久久久久久成人| 日韩亚洲精品电影| 亚洲一区免费网站| 91九色国产视频| 亚洲第一精品久久忘忧草社区| 久久久精品一区| 国产精品一区二区久久精品| 国产欧美韩国高清| 久久久国产91| 国产精品久久久久久av| 欧美成人亚洲成人| 日韩成人中文字幕| 国产成人激情小视频| 亚洲free性xxxx护士白浆| 亚洲福利在线视频| 亚洲第一男人天堂| 亚洲人成在线观看网站高清| 亚洲黄色免费三级| 自拍偷拍亚洲一区|