程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#銜接數據庫的辦法

C#銜接數據庫的辦法

編輯:C#入門知識

C#銜接數據庫的辦法。本站提示廣大學習愛好者:(C#銜接數據庫的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C#銜接數據庫的辦法正文


以下內容給年夜家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)的對象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中,完成可空數據的輸出輸入。

以上內容是關於本文給年夜家引見的C#銜接數據庫的辦法,願望年夜家愛好。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved