ADO.NET
连接数据库
首先要有连接字符串,
然后是建立连接对象,
然后打开连接
使用完毕之后关闭连接(或者使用using语句块)
//使用sql server方式登陆
//Data Source:要连接的服务器名称
//Initial Catalog:要连接的数据库名称
string sqlServerConstr = @"Data Source=.\wqserver; Initial Catalog=lianxi1; User Id=ass; Password=123456";
//使用windows身份验证方式登陆
//Integrated Security=true:设置集成安全
string constr = @"Data Source=.\wqserver; Initial Catalog=lianxi1; Integrated Security=true";
//建立连接对象
SqlConnection connection = new SqlConnection(sqlServerConstr);
//连接数据库
connection.Open();
MessageBox.Show("打开成功");
connection.Close();
connection.Dispose();
MessageBox.Show("关闭连接");
使用using语句块
//使用windows身份验证方式登陆
string constr = @"Data Source=.\wqserver; Initial Catalog=lianxi1; Integrated Security=true";
//using语句块(在using语句块中开辟的资源会在using语句块结束后自动释放)
using (conn=new SqlConnection(constr))
{
//打开连接
conn.Open();
MessageBox.Show("打开成功");
//使用
//这里不用手动关闭了哟
}
没关闭之前不能重复打开,所以可以在打开之前做一下判断
//判断当前对象是否已连接
if(ConnectionState.Closed==conn.State)
conn.Open();
注意:可以重复关闭
//当状态改变时会触发一个事件
conn.StateChange += new StateChangeEventHandler(conn_StateChange);
//===============================================================================
void conn_StateChange(object sender, StateChangeEventArgs e)
{
//获取当前状态
MessageBox.Show(e.CurrentState.ToString());
}
自动生成连接字符串
方法一
这里以vs2010为例
1)工具→连接到数据库
选择数据源,这里我选Microsoft SQL Server,选择好之后点击继续
选择好要连接的地方后,点击高级
这里就是你想要的连接字符串了,复制出来就可以了
方法二
//新建一个连接字符串类
SqlConnectionStringBuilder scsb = new SqlConnectionStringBuilder();
//设置服务器名
scsb.DataSource = @".\wqserver";
//设置要连接的数据库
scsb.InitialCatalog = "lianxi1";
//集成安全
scsb.IntegratedSecurity = true;
//获取连接字符串
string constr = scsb.ConnectionString;
基本增删查改
执行非查询语句
string constr = @"Data Source=.\wqserver; Initial Catalog=webshop; Integrated Security=true";
using (SqlConnection conn=new SqlConnection(constr))
{
//编写sql语句
string sql = @"insert into users(u_ID,u_Name,u_Type,u_Password)values(312,'sada','普通','gdfgec');";
//创建一个命令对象,执行sql语句
using(SqlCommand cmd=new SqlCommand(sql,conn))
{
//打开连接
conn.Open();
// 执行一个非查询sql语句,返回受影响的行数
int n= cmd.ExecuteNonQuery();
//判断sql语句是否执行成功
if(n>0)
{
MessageBox.Show("执行成功");
}
}
}
执行查询语句
string constr = @"Data Source=.\wqserver; Initial Catalog=webshop; Integrated Security=true";
using (SqlConnection conn=new SqlConnection(constr))
{
//编写sql查询语句
string sql = @"select * from goods";
//创建一个命令对象,执行sql语句
using(SqlCommand cmd=new SqlCommand(sql,conn))
{
//打开连接
conn.Open();
//执行一个查询sql语句,返回查询结果
using (SqlDataReader dataReader=cmd.ExecuteReader())
{
//判断查询结果是否有数据
if(dataReader.HasRows)
{
//将游标指向下一两条数据(循环取出每一条记录)
while (dataReader.Read())
{
//获取记录的第一列的数据
string str = dataReader.GetValue(0).ToString();
//获取记录的第二列的数据
str += ("----" + dataReader.GetValue(1).ToString());
listBox1.Items.Add(str);
}
}
}
}
}
当查询结果为单行单列时用
//返回查询结果的第一行第一列
cmd.ExecuteScalar();
根据列名获取列的索引
int n = dataReader.GetOrdinal("name");
获取当前记录的字段长度
//循环读取一条记录
for (int i = 0; i < dataReader.FieldCount; i++)
{
Console.WriteLine(dataReader.GetValue(i));
}
当有多个结果集的时候
//前进到下一个结果集
while (dataReader.NextResult())
{
//判断是否查询到记录
if (dataReader.HasRows)
{
//前进到下一条记录
while (dataReader.Read())
{
//循环读取一条记录
for (int i = 0; i < dataReader.FieldCount; i++)
{
Console.WriteLine(dataReader.GetValue(i));
}
}
}
}
带参数的sql语句
//带参数的sql语句
string sql = @"select * from @name";
//
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
//设置参数
cmd.Parameters.AddWithValue("@name", "goods");
}
注意:表名列名不能用参数代替的
获取配置文件中的连接字符串
首先创建一个配置文件
选择常规→应用程序配置文件
配置文件名称一定不要改哟,用默认的就好,改了会出错的。
打开配置文件就可以写连接字符串了
在使用配置文件的时候需要添加引用
在项目中使用配置文件中的连接字符串
//获取配置文件中的连接字符串
string constr = ConfigurationManager.ConnectionStrings["sql"].ConnectionString;
数据绑定
//创建一个集合
List<person> personList = new List<person>();
person per = new person() {Id = 100, Name = "张三"};
person per2 = new person() { Id = 111, Name = "李四" };
//添加数据
personList.Add(per);
personList.Add(per2);
//设置控件中每一项实际显示的值
listBox1.DisplayMember = "Name";
//设置控件中每一项value中实际存储的值
listBox1.ValueMember = "Id";
//绑定数据源
listBox1.DataSource = personList;
person类
public class person
{
//一定要设置成属性,不能是字段,否则无法绑定的
public int Id { get; set; }
public string Name { get; set; }
}
获取值
//获取选中项value中的实际值
int id = (int) listBox1.SelectedValue;
DataSet的使用
什么是DataSet:
数据集合,临时数据库,内存数据库
string constr = @"Data Source=.\wqserver; Initial Catalog=WebShop; Integrated Security=true";
string sql = "select * from goods";
//创建连接数据库的一个适配器
SqlDataAdapter adapter = new SqlDataAdapter(sql, constr);
//创建一个DataSet
DataSet ds=new DataSet();
//绑定DataSet
adapter.Fill(ds);
//绑定数据
dataGridView1.DataSource = ds.Tables[0];
使用SQLDataAdapter实现分页
string constr = @"Data Source=.\wqserver; Initial Catalog=WebShop; Integrated Security=true";
string sql = "select * from goods";
//创建连接数据库的一个适配器
SqlDataAdapter adapter = new SqlDataAdapter(sql, constr);
//创建一个表
DataTable daaTable = new DataTable();
//绑定,只要前5行数据
adapter.Fill(0, 5, daaTable);
//绑定数据
dataGridView1.DataSource = daaTable;
封装SQLHelper
/// <summary>
/// 可以实现增删查改
/// </summary>
public static class SqlHelper
{
//获取配置文件中的连接字符串,并设置成只读的
private static readonly string constr = ConfigurationManager.ConnectionStrings["sql"].ConnectionString;
/// <summary>
/// 执行非查询语句,返回受影响的行数
/// </summary>
/// <param name="sql">sql语句</param>
/// <param name="pms">参数</param>
/// <returns>返回受影响的行数</returns>
public static int ExecuteNonQuery(string sql,params SqlParameter[] pms)
{
using (SqlConnection conn=new SqlConnection(constr))
{
using (SqlCommand cmd=new SqlCommand(sql,conn))
{
if (pms!=null)
{
cmd.Parameters.AddRange(pms);
}
conn.Open();
return cmd.ExecuteNonQuery();
}
}
}
/// <summary>
/// 执行非查询语句,返回首行首列
/// </summary>
/// <param name="sql">sql语句</param>
/// <param name="pms">sql的参数</param>
/// <returns>返回首行首列</returns>
public static object ExecuteScalar(string sql,params SqlParameter[] pms)
{
using (SqlConnection conn = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
if (pms != null)
{
cmd.Parameters.AddRange(pms);
}
conn.Open();
return cmd.ExecuteScalar();
}
}
}
/// <summary>
/// 执行一个查询语句,返回一个SQLDataReader,用完几个close哟
/// </summary>
/// <param name="sql">sql语句</param>
/// <param name="pms">sql语句的参数</param>
/// <returns>返回的SQLDataReader</returns>
public static SqlDataReader ExecuteReader(string sql,params SqlParameter[] pms)
{
SqlConnection conn = new SqlConnection(constr);
using (SqlCommand cmd=new SqlCommand(sql,conn))
{
if(pms!=null)
{
cmd.Parameters.AddRange(pms);
}
conn.Open();
//设置这个参数后,以后当用户关闭reader时,sqlconnection也就自动关闭了
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
}
/// <summary>
/// 执行一个查询语句,返回一个DataTable
/// </summary>
/// <param name="sql">sql语句</param>
/// <param name="pms">参数</param>
/// <returns>返回DataTable</returns>
public static DataTable ExecuteDataTable(string sql,params SqlParameter[] pms)
{
SqlDataAdapter sqlAdapter = new SqlDataAdapter(sql,constr);
if (pms!=null)
{
sqlAdapter.SelectCommand.Parameters.AddRange(pms);
}
DataTable dt = new DataTable();
sqlAdapter.Fill(dt);
return dt;
}
}
调用存储过程
实例:验证用户登录
string uid = tb_uid.Text;
string pwd = tb_pwd.Text;
string constr = ConfigurationManager.ConnectionStrings["sql"].ConnectionString;
bool tag; //用来接受存储过程中那个output参数
using(SqlConnection conn=new SqlConnection( constr))
{
//调用存储过程只需要写存储过程名称,参数在后面再加
string sql = "ulogin";
using (SqlCommand cmd=new SqlCommand(sql,conn))
{
//设置参数
SqlParameter[] pms=new SqlParameter[]
{
new SqlParameter("@uid",uid),
new SqlParameter( "@pwd",pwd),
//output输出参数就不需要设置值了
new SqlParameter("@tag",SqlDbType.Bit)
};
//设置参数为输出参数
pms[2].Direction = ParameterDirection.Output;
cmd.Parameters.AddRange(pms);
//设置命令类型为存储过程
cmd.CommandType = CommandType.StoredProcedure;
conn.Open();
//这里用下面三个方法哪一个都行,只要执行了sql语句就行
//cmd.ExecuteScalar();
//cmd.ExecuteReader();
cmd.ExecuteNonQuery();
//当执行完sql语句之后获取到输出参数的值
tag =Convert.ToBoolean(pms[2].Value);
}
}
//判断输出参数的值,就可以知道登陆是否成功,用户名和密码是否匹配
if (tag)
{
MessageBox.Show("登陆成功");
}
else
{
MessageBox.Show("登陆失败");
}
使用事务
string constr = @"Data Source=.\wqserver; Initial Catalog=lianxi1; Integrated Security=true";
using(SqlConnection conn=new SqlConnection(constr))
{
conn.Open();
//创建一个事务对象
SqlTransaction tran = conn.BeginTransaction();
string sql = "delete from users where uid='qwe';";
using (SqlCommand cmd=new SqlCommand(sql,conn))
{
//设置sql命令的事务对象
cmd.Transaction = tran;
int r = cmd.ExecuteNonQuery();
Console.WriteLine("所影响的行数{0}",r);
//回滚
tran.Rollback();
Console.WriteLine("回滚");
//提交
//tran.Commit();
// Console.WriteLine("提交了");
}
}
Console.ReadKey();