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