在C#中,常用的有三种 访问数据库的模式分别为:SqlClient模式、OleDb模式和Odbc模式。其中SqlClient模式是微软老大哥专门为其产品Sql Server数据库而设计的,所以如果欲使用Sql Server数据库开发应用程序的话,建议使用这种模式,其性能和效率是比其他模式的要高。OleDb模式和Odbc模式可以运用在任何支持该模式的数据 库产品中,如Access数据库、DB2、Sybase和Sql Server 数据库等。下面主要分析SqlClient模式。
在C#中要操作数据库,一般情况需要引入两个命名空间,在三种连接模式中都要引入下面的命名空间:
using System.Data;
如果使用SqlClient模式的话,则需要引入如下命名空间:
System.Data.SqlClient;
如果使用OleDb模式的话,需要使用下面的命名空间:
System.Data.Odbc;
在C#中,如果想连接数据库的话,需要使用Connection连接对象。同样,不同的连接模式下,所使用的连接对象也不同:
在SqlClient模式下,其基本连接字符串和连接对象如下:连接字
string connString = "server=.;database=testDB;uid=sa;pwd=123456;"
;server是指数据库所在的机器(服务器),如果使用当前机器(本地机器)的话,可 以使用“.”、“(local)”、“127.0.0.1”或本地机器的名字。如果使用其它机器上的数据库的话,可以使用那台机器的机器名字(确保域和工 作组的正确)或IP地址。database指的数据库的名字。uid和pwd分别代表连接数据库的用户名和密码。定义连接字符串后,就可以建立SqlClient模式下的连接对象了,在SqlClient模式下,应使用SqlConnection。
SqlConnection sConn = new SqlConnection(connString);
打开数据库使用Open方法,但在试图打开数据连接时会发生错误,因此常采用如下的异常控制方法(这里假设打开SqlClient模式下连接,实际上只不过连接对象的名字不同而已):
try{
sConn.Open();
}
catch(Exception ex){
MessageBox.Show("发生错误:"+ex.Message);
//Console.WriteLine("发生错误:"+ex.Message); //在控制台下使用这种方式
}
Command用于向数据库传输的命令的对象,其构造函数常用两个参数,一个参数是所使用的 命令文本(CommandText),另一个为所使用的连接对象Connection。
假设我们想使用SqlClient模式查询Sql Server中TRecord数据库中GameDetails表中的Date(日期)和Sorce(分数)两列的值,则可以建立如下的命令对象(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方法用于返回查询结果的全部数据。 ExecuteNonQuery方法用于返回所影响的行数,一般用于Insert、Update和Delete操作。ExecuteScalar方法返回 结果中的第一行第一列的值。
DataReader用于从返回来的数据区中读取数据。其根据使用的数据连接模式不同也有不同的形式:SqlDataReader对应着SqlClient模式,OleDbDataReader对应着OleDb模式,OdbcDataReader对应着Odbc模式
数据读取器应与命令对象配合使用,下面接着4中的例子来写:
SqlDataReader sdr = null;
sdr = sCmd.ExecuteReader(); //执行命令对象,并用sdr指向结果集的第一条记录。
while(sdr.Read()){ //每读取一条记录后,指向其下一条记录
textBox2.Text = textBox2.Text + sdr["Date"]+" ";
textBox2.Text += sdr["Sorce"];
textBox2.Text += "\r\n"; //换行
}
sdr.Close();
下面给出一个数据库操作的例子。假设在Sql Server2012中有一个数据库TRecord,其存放着一个数据表名为GameDetails,其结构为GameDetails(Date,Sorce),下面使用SqlClient模式连接数据库:
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 = "未连接数据库.";
}
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("未链接数据库!","执行错误");
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 = "已执行操作!";
}
}
}
}