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#銜接數據庫的辦法,願望年夜家愛好。