三層登入 D層(資料庫操作及實現SQL防注入)

2021-09-13 13:17:06 字數 2050 閱讀 7643

上個部落格對三層的**有了巨集觀的把控,接下來對d層(資料訪問層)的**進行剖析

**:

public login.model.userinfo selectuser(string username, string password)

user.id = reader.getint32(0);//將資料庫第零列的資料以int32的格式返回

user.username = reader.getstring(1);//第一列

user.password = reader.getstring(2);//第二列

if (!reader.isdbnull (3))

}return user;//返回乙個user物件

}

}

對於第一行**

using (sqlconnection conn = new sqlconnection(dbutil.connstring))
using的作用:用於自動釋放資料庫連線,因為在使用sqldatareaer這個類的時候會與資料庫建立長連線,消耗資料庫的連線數

下面**涉及到sqlparameter類的用法:

cmd.commandtext = @"select id,username,password,email from users where   

username = @username and password=@password";

先看@的作用

在寫資料庫語句的時候,在使用資料或者資料時會加入@,會在一定程度上防止sql注入,所謂的sql注入只需要在賦值時改變值即可不需要密碼進入資料庫竊取資料,如下面的例子:

加入@的方法便為引數化sql,在使用引數化查詢的情況下,資料庫伺服器不會將引數的內容視為sql指令的一部份來處理,而是在資料庫完成 sql 指令的編譯後,才套用引數執行,因此就算引數中含有惡意的指令,由於已經編譯完成,就不會被資料庫所執行,因此,可從一定程度上避免sql注入。詳見部落格:

回過頭來看第一行的**@username便達到了這個效果,使用

cmd.parameters.add("@username",username);
即可完成將使用者的值賦予資料庫中的字段

在剛才的@的作用(引數化sql)中只是在一定程度上避免sql注入,如何在進一步實現呢,這就用到sqlparameter類

cmd.parameters.add(new sqlparameter("@username",username));

cmd.parameters.add(new sqlparameter("@password",password));

這個時候可以解決sql注入了詳見部落格:

接著看下面的**涉及到sqlcommand類及sqldatareader類

sqldatareader reader = cmd.executereader();
user.id = reader.getint32(0);//將資料庫第零列的資料以int32的格式返回

user.username = reader.getstring(1);//第一列

user.password = reader.getstring(2);//第二列

第一行**將查詢的結果賦予reader,reder.read方法一行行讀取資料,第二行**通過reader.getint32得到資料返回model層賦予user.id,這就實現資料庫的資料與model類中資料的一致性

三層 資料庫為什麼打不開?

最近在敲三層的例子,到了要建資料庫的時候突然打不開,想起來,還是先要啟動sql server 服務中的一些配置,但是在找到sql server 服務的時候顯示的卻是這樣的結果。第一種辦法就是 開啟控制面板,找到解除安裝程式,把 microsoft sql server 2013 2012 expre...

資料庫 三層架構

資料層 dal 業務邏輯層 bll 表示層 ui 三層結構原理 3個層次中,系統主要功能和業務邏輯都在業務邏輯層進行處理。所謂三層體系結構,是在客戶端與資料庫之間加入了乙個 中間層 也叫元件層。這裡所說的三層體系,不是指物理上的三層,不是簡單地放置三颱機器就是三層體系結構,也不僅僅有b s應用才是三...

三層 C 語句操作SQLServer資料庫

1.概述 首先是為我們的程式新增必要的引用以及一些資料成員。因為我們的程式設計到資料庫的訪問操作,所以必須要運用到資料提供者 data provider 的物件。在.net框架下,我們主要運用的資料提供者分兩類,一類是sql型別的,另一類是oledb型別的。他們涉及的命名空間是system.data...