欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#連接數(shù)據(jù)庫(kù)的方法

 更新時(shí)間:2015年11月01日 14:22:23   投稿:mrr  
ASP.NET連接數(shù)據(jù)庫(kù)的技術(shù)叫ADO.NET,它是用來(lái)向數(shù)據(jù)庫(kù)提交sql語(yǔ)句的一堆類。這里連接的是Sql Server 2008數(shù)據(jù)庫(kù),其他數(shù)據(jù)庫(kù)用法差不多,就是調(diào)用的類名不一樣

以下內(nèi)容給大家c#連接數(shù)據(jù)庫(kù)的方法的相關(guān)介紹,本文非常具有參考借鑒價(jià)值,具體詳情如下所示。

ASP.NET連接數(shù)據(jù)庫(kù)的技術(shù)叫ADO.NET,它是用來(lái)向數(shù)據(jù)庫(kù)提交sql語(yǔ)句的一堆類。這里連接的是Sql Server 2008數(shù)據(jù)庫(kù),其他數(shù)據(jù)庫(kù)用法差不多,就是調(diào)用的類名不一樣。

    首先在Web.config(本地的添加應(yīng)用程序配置文件App.config,本地還要添加System.Configuration.dll程序集)上配置數(shù)據(jù)庫(kù)連接字符串,添加如下節(jié)點(diǎn)代碼:

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

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

    程序使用數(shù)據(jù)庫(kù)時(shí),先提取配置文件的連接字符串賦值給一個(gè)變量。代碼如下:

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

ConfigurationManager是靜態(tài)類,提供對(duì)客戶端應(yīng)用程序配置文件的訪問(wèn)。

    接著打開數(shù)據(jù)庫(kù)連接,使用完畢后用using自動(dòng)釋放連接:

SqlConnection是個(gè)密封類,表示 SQL Server 數(shù)據(jù)庫(kù)的一個(gè)打開的連接。接著是執(zhí)行SQL語(yǔ)句,先定義向數(shù)據(jù)庫(kù)發(fā)送指令用到的SqlCommand類,定義之后確定語(yǔ)句執(zhí)行的連接對(duì)象是conn,再確定要執(zhí)行的SQL語(yǔ)句,用法舉例如下:

//SqlConnection為建立和數(shù)據(jù)庫(kù)連接的對(duì)象
using(SqlConnection conn = new SqlConnection(connstr))
{
conn.Open();//打開連接
//通過(guò)連接創(chuàng)建一個(gè)向數(shù)據(jù)庫(kù)發(fā)命令(Command)的對(duì)象SqlCommand
using(SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText =”Insert into T_Student*(Name,Age) values(‘XXX',18)”;// CommandText要執(zhí)行的SQL語(yǔ)句
cmd.ExecuteNonQuery();//執(zhí)行
}
}

ExecuteNonQuery()一般用來(lái)執(zhí)行Update、Delete、Insert語(yǔ)句

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

using(SqlConnection conn = new SqlConnection(connstr))
{
conn.Open();//打開連接
//通過(guò)連接創(chuàng)建一個(gè)向數(shù)據(jù)庫(kù)發(fā)命令(Command)的對(duì)象SqlCommand
using(SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText =”select Name from T_Student where Name=”XXX””;// CommandText要執(zhí)行的SQL語(yǔ)句
cmd.ExecuteScalar();//執(zhí)行
}
}

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

using(SqlConnection conn = new SqlConnection(connstr))
{
conn.Open();//打開連接
//通過(guò)連接創(chuàng)建一個(gè)向數(shù)據(jù)庫(kù)發(fā)命令(Command)的對(duì)象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類型,查詢結(jié)果是放到數(shù)據(jù)庫(kù)中,沒有放到客戶端。初始指針指向第一條數(shù)據(jù)之前,每調(diào)用一次Reader指針下移一條,只要沒有移到最后一條之后,就直接返回true。reader的GetString\GetInt32等方法只接受整數(shù)參數(shù),也就是序號(hào),用GetOrdinal方法根據(jù)列名動(dòng)態(tài)得到序號(hào)。

0列

第一列

第二列

第三列

Id

Name

Age

Hobby

1

XXX

18

勾搭妹子

2

王旭

30

勾搭妹子

圖 1   數(shù)據(jù)庫(kù)T_Student表

為了避免數(shù)據(jù)庫(kù)注入漏洞,微軟設(shè)置有查詢參數(shù),舉例如下:

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

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

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

    SqlDataReader是和連接相關(guān)的,SqlDataReader中的查詢結(jié)果并不是放在程序中的,而是放在數(shù)據(jù)庫(kù)服務(wù)器中,SqlDataReader只是相當(dāng)于一個(gè)游標(biāo),指到哪里讀到哪里。

    ADO.NET提供了數(shù)據(jù)集機(jī)制,DataSet,存在本地內(nèi)存,其包含若干DataTable,DataTable包含若干行DataRow。使用方法:

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

SqlDataAdapter是一個(gè)幫我們把SqlCommand查詢結(jié)果填充到DataSet中的類,DataSet相當(dāng)于本地的list集合(小數(shù)據(jù)庫(kù))。遍歷方法如下:

DataTable table=dataset.Tables[0];//一般情況下只有一個(gè)Tables,當(dāng)同時(shí)執(zhí)行多個(gè)select語(yǔ)句時(shí)有多個(gè)Tables。

DataRowCollection rows=table.Rows;
for(int i=0;i<rows.Count;i++)
{
  DataRow row=rows[i];
int age=(int)row[“Age”];//遍歷年齡
}

基本上所有的步驟都是:打開鏈接--創(chuàng)建命令--執(zhí)行--處理執(zhí)行結(jié)果。所以可以寫個(gè)公共類自己用,避免重復(fù)代碼,詳細(xì)代碼如下:

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)//注意看有使用長(zhǎng)度可變參數(shù)進(jìn)行了簡(jiǎn)化
    {
      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();//返回執(zhí)行了多少行
      }
    }
    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;
    }
  }

封裝方法的原則:把不變的放到方法里,把變化的放到參數(shù)里,SqlHelper類里返回值是一行一列的用ExecuteScaler,ExecuteNonQuery一般用來(lái)執(zhí)行Update\Delete\Insert語(yǔ)句,ExecuteDataTable只用來(lái)執(zhí)行查詢結(jié)果比較少的sql,返回值是DataTable。

在數(shù)據(jù)庫(kù)中NULL和“”不一樣,NULL和0也不一樣。數(shù)據(jù)庫(kù)中NULL表示不“知道”。假如一個(gè)表中有個(gè)可空字段Name,如果有幾個(gè)實(shí)例Name為NULL,

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

需求:如果沒輸入姓名,則姓名應(yīng)該為NULL,如果沒輸入年齡,則年齡應(yīng)該為NULL。

問(wèn)題:在SqlParameter如果參數(shù)值為null,則表示沒有提供參數(shù)的值,會(huì)報(bào)錯(cuò)。

解決方法:.NET提供DBNull.Value用來(lái)表示數(shù)據(jù)庫(kù)中的NULL。以為DBNull.Value是object類型。所以需要這樣用:

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

接著SqlParameter參數(shù)改為objName。

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

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

但是也有個(gè)問(wèn)題,如果是int類型,則不能為null,就該定義的時(shí)候用int? age。

必須嚴(yán)格區(qū)分0,NULL和“”,否則出現(xiàn)問(wèn)題很難查到。

附帶上次講的SqlHelper里的兩個(gè)函數(shù),就是對(duì)上面兩個(gè)用法的封裝,可以直接用在SqlParameter參數(shù)中。

可空數(shù)據(jù)輸入數(shù)據(jù)庫(kù)時(shí)用

public static object ToDBValue(this object value)

    {
      return value == null ? DBNull.Value : value;
    }

輸出時(shí)用

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

這個(gè)主要是用在SqlParameter中,實(shí)現(xiàn)可空數(shù)據(jù)的輸入輸出。

以上內(nèi)容是關(guān)于本文給大家介紹的C#連接數(shù)據(jù)庫(kù)的方法,希望大家喜歡。

相關(guān)文章

  • 詳解WCF服務(wù)中的svc文件

    詳解WCF服務(wù)中的svc文件

    本文詳細(xì)講解了WCF服務(wù)中的svc文件,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • C# WebApi CORS跨域問(wèn)題解決方案

    C# WebApi CORS跨域問(wèn)題解決方案

    本篇文章主要介紹了C# WebApi CORS跨域問(wèn)題解決方案,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • C#使用WebSocket實(shí)現(xiàn)聊天室功能

    C#使用WebSocket實(shí)現(xiàn)聊天室功能

    這篇文章主要為大家詳細(xì)介紹了C#使用WebSocket實(shí)現(xiàn)聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 10個(gè)C#程序員經(jīng)常用到的實(shí)用代碼片段

    10個(gè)C#程序員經(jīng)常用到的實(shí)用代碼片段

    如果你是一個(gè)C#程序員,那么本文介紹的10個(gè)C#常用代碼片段一定會(huì)給你帶來(lái)幫助,從底層的資源操作,到上層的UI應(yīng)用,這些代碼也許能給你的開發(fā)節(jié)省不少時(shí)間。以下是原文:
    2015-09-09
  • C# ToolStrip制作四邊??扛?dòng)工具欄

    C# ToolStrip制作四邊??扛?dòng)工具欄

    這篇文章主要介紹了C# ToolStrip浮動(dòng)工具欄的制作,可以上/下/左/右???,代碼在下面
    2013-12-12
  • C#操作注冊(cè)表的方法

    C#操作注冊(cè)表的方法

    這篇文章主要介紹了C#操作注冊(cè)表的方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-01-01
  • C#并行編程之PLINQ(并行LINQ)

    C#并行編程之PLINQ(并行LINQ)

    這篇文章介紹了C#并行編程之PLINQ(并行LINQ),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • C#創(chuàng)建自定義控件及添加自定義屬性和事件使用實(shí)例詳解

    C#創(chuàng)建自定義控件及添加自定義屬性和事件使用實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于C#創(chuàng)建自定義控件及添加自定義屬性和事件使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Unity Shader實(shí)現(xiàn)紋理遮罩效果

    Unity Shader實(shí)現(xiàn)紋理遮罩效果

    這篇文章主要為大家詳細(xì)介紹了Unity Shader實(shí)現(xiàn)紋理遮罩效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • c# 備忘錄模式

    c# 備忘錄模式

    備忘錄模式:在不破壞封裝的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在這個(gè)對(duì)象之外的地方保存這個(gè)狀態(tài),這樣以后就可將該對(duì)象恢復(fù)到原來(lái)保存的狀態(tài)了
    2012-10-10

最新評(píng)論