? ? ? ?在C#中,常用的有三種 訪問數(shù)據(jù)庫的模式分別為:SqlClient模式、OleDb模式和Odbc模式穷遂。其中SqlClient模式是微軟老大哥專門為其產(chǎn)品Sql Server數(shù)據(jù)庫而設計的栓票,所以如果欲使用Sql Server數(shù)據(jù)庫開發(fā)應用程序的話,建議使用這種模式颜启,其性能和效率是比其他模式的要高偷俭。OleDb模式和Odbc模式可以運用在任何支持該模式的數(shù)據(jù) 庫產(chǎn)品中,如Access數(shù)據(jù)庫缰盏、DB2涌萤、Sybase和Sql Server 數(shù)據(jù)庫等。下面主要分析SqlClient模式口猜。
1负溪、引入相關的命名空間
? ? ? 在C#中要操作數(shù)據(jù)庫,一般情況需要引入兩個命名空間济炎,在三種連接模式中都要引入下面的命名空間:
using System.Data;
? ? ? 如果使用SqlClient模式的話川抡,則需要引入如下命名空間:
System.Data.SqlClient;
如果使用OleDb模式的話,需要使用下面的命名空間:
System.Data.OleDb;
如果使用Odbc模式的話,需要使用下面的命名空間:
System.Data.Odbc;
2崖堤、定義連接字符串侍咱,并建立連接對象
? ? ? 在C#中,如果想連接數(shù)據(jù)庫的話密幔,需要使用Connection連接對象楔脯。同樣,不同的連接模式下胯甩,所使用的連接對象也不同:
? ? ? 在SqlClient模式下昧廷,其基本連接字符串和連接對象如下:連接字符串:
string connString = "server=.;database=testDB;uid=sa;pwd=123456;";
? ? ? ?其中,server是指數(shù)據(jù)庫所在的機器(服務器)偎箫,如果使用當前機器(本地機器)的話木柬,可 以使用“.”、“(local)”淹办、“127.0.0.1”或本地機器的名字眉枕。如果使用其它機器上的數(shù)據(jù)庫的話,可以使用那臺機器的機器名字(確保域和工 作組的正確)或IP地址娇唯。database指的數(shù)據(jù)庫的名字齐遵。uid和pwd分別代表連接數(shù)據(jù)庫的用戶名和密碼。定義連接字符串后塔插,就可以建立SqlClient模式下的連接對象了梗摇,在SqlClient模式下,應使用SqlConnection想许。
SqlConnection sConn = new SqlConnection(connString);
3伶授、打開數(shù)據(jù)庫連接
打開數(shù)據(jù)庫使用Open方法,但在試圖打開數(shù)據(jù)連接時會發(fā)生錯誤流纹,因此常采用如下的異趁优耄控制方法(這里假設打開SqlClient模式下連接,實際上只不過連接對象的名字不同而已):
try{
sConn.Open();
}
catch(Exception ex){
MessageBox.Show("發(fā)生錯誤:"+ex.Message);
//Console.WriteLine("發(fā)生錯誤:"+ex.Message); //在控制臺下使用這種方式
}
4漱凝、Command命令對象的應用
? ? ? ? Command用于向數(shù)據(jù)庫傳輸?shù)拿畹膶ο蟠模錁?gòu)造函數(shù)常用兩個參數(shù),一個參數(shù)是所使用的 命令文本(CommandText)茸炒,另一個為所使用的連接對象Connection愕乎。
? ? ? ? 假設我們想使用SqlClient模式查詢Sql Server中TRecord數(shù)據(jù)庫中GameDetails表中的Date(日期)和Sorce(分數(shù))兩列的值,則可以建立如下的命令對象(sConn參見建立的連接sConn:
SqlCommand sCmd = new SqlCommand("SELECT Date,Sorce FROM TRecord.dbo.GameDetails",sConn);
亦可使用如下的形式:
SqlCommand sCmd = new SqlCommand();
sCmd.CommandText = "SELECT Date,Sorce FROM TRecord.dbo.GameDetails";
sCmd.Connection = sConn;
命令對象常用的有三個方法:ExecuteReader(), ExecuteNonQuery()和ExecuteScalar()壁公。ExecuteReader方法用于返回查詢結(jié)果的全部數(shù)據(jù)感论。 ExecuteNonQuery方法用于返回所影響的行數(shù),一般用于Insert紊册、Update和Delete操作比肄。ExecuteScalar方法返回 結(jié)果中的第一行第一列的值。
5、數(shù)據(jù)讀取器DataReader
? ? ? ?DataReader用于從返回來的數(shù)據(jù)區(qū)中讀取數(shù)據(jù)芳绩。其根據(jù)使用的數(shù)據(jù)連接模式不同也有不同的形式:SqlDataReader對應著SqlClient模式掀亥,OleDbDataReader對應著OleDb模式,OdbcDataReader對應著Odbc模式示括。
數(shù)據(jù)讀取器應與命令對象配合使用铺浇,下面接著4中的例子來寫:
SqlDataReader sdr = null;
sdr = sCmd.ExecuteReader();???? //執(zhí)行命令對象痢畜,并用sdr指向結(jié)果集的第一條記錄垛膝。
while(sdr.Read()){? ? ? ? ? ? ? //每讀取一條記錄后,指向其下一條記錄
textBox2.Text = textBox2.Text + sdr["Date"]+" ";
textBox2.Text += sdr["Sorce"]; ? ?
textBox2.Text += "\r\n"; ? ? ? ?//換行
}
sdr.Close();?
? ? 下面給出一個數(shù)據(jù)庫操作的例子丁稀。假設在Sql Server2012中有一個數(shù)據(jù)庫TRecord吼拥,其存放著一個數(shù)據(jù)表名為GameDetails,其結(jié)構(gòu)為GameDetails(Date,Sorce)线衫,下面使用SqlClient模式連接數(shù)據(jù)庫:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace ConnectionDb
{
public partial class Form1 : Form
{
string connString ;
SqlConnection con1;
string sql;
SqlCommand sCmd;
SqlDataReader sdr;
DataSet ds;
public Form1()
{
InitializeComponent();
this.connString = null;
this.connString = null;
this.sql = null;
this.sCmd = null;
this.sdr = null;
this.ds = null;
}
private void button1_Click(object sender, EventArgs e)
{
connString = "Server = .;Database = TRecord;uid = sa;pwd = 123456;";
con1 = new SqlConnection(connString);
try
{
con1.Open();
textBox2.Text = "鏈接成功凿可!";
}
catch (Exception ex)
{
textBox2.Text = "鏈接失敗授账!";
}
}
private void button2_Click(object sender, EventArgs e)
{
if (con1 == null)
{
textBox2.Text = "未連接數(shù)據(jù)庫.";
}
else
{
if (sdr != null)
{
sdr.Close();
}
con1.Close();
textBox2.Text = "已斷開鏈接.";
}
}
private void button3_Click(object sender, EventArgs e)
{
textBox2.Text = "";
if (con1 == null)
{
MessageBox.Show("未鏈接數(shù)據(jù)庫枯跑!","執(zhí)行錯誤");
return;
}
sql = textBox1.Text;
sCmd = new SqlCommand(sql);
sCmd.Connection = con1;
if (sql.Contains("select"))
{
sdr = sCmd.ExecuteReader();
while(sdr.Read()){
textBox2.Text = textBox2.Text + sdr["Date"]+" ";
textBox2.Text += sdr["Sorce"];
textBox2.Text += "\r\n";
}
sdr.Close();
}
else
{
sCmd.ExecuteNonQuery();
textBox2.Text = "已執(zhí)行操作!";
}
}
}
}
如果本文引用了你的文章而未注明白热,請及時聯(lián)系我敛助。