数据访问分为三个部分:(1)创建链接(2)创建与执行命令(3)读取或准备相关数据

一,需要引用的命名空间

using data;

using data.SqlClient;

二,创建与数据库的链接——SqlConnection(链接类)

1,链接字符串:server=目标服务器的IP地址;database=数据库名;uid=数据库的登录名;pwd=数据库的登录密码

server=.; database=mydb; uid=sa; pwd=123

2,实例化——构造

SqlConnection conn=new SqlConnection(链接字符串);

3,属性

state:用来描述链接当前的状态  closed:链接处于关闭状态   open:链接处于打开状态

4,方法

open():打开链接

close():关闭链接

5,案例

(1)定义链接字符串。
string connectionString = "server=.;database=mydb;uid=sa;pwd=123";
(2)构造链接对象
SqlConnection conn = new SqlConnection(connectionString);

SqlConnection conn = new SqlConnection();
conn.ConnectionString = connectionString;
(3)打开链接
conn.Open();
(4)关闭链接
conn.Close();

三,向数据传递sql语句或存储过程并执行——sqlcommand(命令类)

1,构造

SqlCommand cmd=conn.CreateCommand();

SqlCommand cmd=new SqlCommand();

2,属性

connection:(SqlConnection类型)指定通过哪个链接对象来操作数据库

CommandText:(string类型)要执行的sql语句或存储过程名

3,方法

ExecuteNonQuery():执行非查询命令,返回影响的行数。一般用来执行增删改的语句

ExecuteReader():执行读取命令,返回一个读取器对象。一般用来执行查询语句

4,案例

string connectionString = "server=.;database=mydb;uid=sa;pwd=123";
SqlConnection conn = new SqlConnection(connectionString);
conn.Open();

//操作数据库
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "insert into student values('s001','张三','1','清华大学','1990-6-1')";
cmd.ExecuteNonQuery();

conn.Close();

四,从查询的结果集中把数据逐个读取出来——SqlDataReader(读取器类)

1,构造

只有唯一的一种构造方式

SqlDataReader dr=cmd.ExecuteReader();

说明:只读,只向前,读取器工具,每次只读取一条记录,内存中只占一条记录的空间

2,属性

HasRows:返回值为bool类型,判断是否有数据可读,是否查出数据来了

3,方法

Read():返回值为bool类型,把结果集中当前行的内容读取到内存中的DataReader中来,读出来了返回true,没有数据可读返回false

在使用SqlDataReader读取某列数据时,必须先使用Read()方法把数据先取到内存中的SqlDataReader中。

从SqlDataReader中读取某列值的时候,使用方法:
(1)dr[列的下标/列的索引号]
(2)dr["列名"]
(3)dr.GetInt(索引号) dr.GetString(索引号) ...

4,案例

(1)登录的例子(输入用户名和密码验证是否正确)

Console.Write("用户名:");
string uid = Console.ReadLine();
Console.Write("密码:");
string pwd = Console.ReadLine();

//操作数据库
SqlConnection conn = new SqlConnection("server=.;database=mydb;uid=sa;pwd=123");
conn.Open();

SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "select * from Login where UserName='"+uid+"' and password='"+pwd+"' "; //查询
SqlDataReader dr = cmd.ExecuteReader(); //生成读取器对象。
if (dr.HasRows)
{
Console.WriteLine("OK");
}
else
{
Console.WriteLine("Error");
}

conn.Close();

(2)多表查询(将两个表中的数据联合显示出来):尽量不要用join连接查询,写多个函数,在主函数内调用即可

namespace ConsoleApplication1
{
class Program
{
public const string CONNECTIONSTRING = "server=.;database=mydb;uid=sa;pwd=123";   //在函数外定义链接字符串常量
static string GetNationName(string code)     
{
string str = "";

//根据民族代号查询民族名称
SqlConnection conn = new SqlConnection(CONNECTIONSTRING);
conn.Open();

SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "select * from nation where code='" + code + "' ";
SqlDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
dr.Read();
str = dr["Name"].ToString();
}
else
{
str = "未知";
}

conn.Close();

return str;
}
static string GetWorks(string code)  //通过代号查询工作经历
{
string str = "";

SqlConnection conn = new SqlConnection(CONNECTIONSTRING);
conn.Open();

SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "select * from work where infocode='" + code + "'";
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
str += ((DateTime)dr["StartDate"]).ToString("yyyy年MM月dd日") + "\t";
str += ((DateTime)dr["EndDate"]).ToString("yyyy年MM月dd日") + "\t";
str += dr["Firm"].ToString()+ "\t";
str += dr["Depart"].ToString() + "\n";
}

conn.Close();

return str;
}
static void Main(string[] args)
{
//显示
SqlConnection conn = new SqlConnection(CONNECTIONSTRING);
conn.Open();

SqlCommand cmd = conn.CreateCommand();

cmd.CommandText = "select * from info";
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
string code = dr["code"].ToString();
string name = dr["name"].ToString();
string sex = ((bool)dr["Sex"]) ? "男" : "女";
string nation = GetNationName(dr["nation"].ToString());
string birthday = ((DateTime)dr["birthday"]).ToString("yyyy年MM月dd日");

Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine(code + "\t" + name + "\t" + sex + "\t" + nation + "\t" + birthday);
Console.ResetColor();
//显示工作简历
Console.WriteLine("****工作简历****");
Console.WriteLine(GetWorks(code));
}

conn.Close();
}
}
}

(3)向info表中插入数据(要注意先检查输入信息的格式是否正确和主外键是否冲突)

namespace ConsoleApplication1
{
class Class1
{
public const string CONNECTIONSTRING = "server=.;database=mydb;uid=sa;pwd=123";
public static bool Check(string columnName, string value)  //检查输入的性别和生日格式是否正确
{
if (columnName == "sex")
{
if (value == "0" || value == "1")
{
return true;
}
else
{
Console.WriteLine("性别格式不正确");
return false;
}
}
else if (columnName == "birthday")
{
try
{
Convert.ToDateTime(value);
return true;
}
catch
{
Console.WriteLine("生日格式不正确");
return false;
}
}
else
{
return true;
}
}
public static bool CheckPK(string pk)  //检查主键code是否与输入冲突
{
bool notHasPK = true;
SqlConnection conn = new SqlConnection(CONNECTIONSTRING);
conn.Open();

SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "select * from info where code='" + pk + "'";
SqlDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
notHasPK = false;
Console.WriteLine("主键已存在");
}
else
{
notHasPK = true;
}
conn.Close();

return notHasPK;
}
public static bool HasNation(string nationCode)  //检查外键
{
bool hasNation = true;
SqlConnection conn = new SqlConnection(CONNECTIONSTRING);
conn.Open();

SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "select * from nation where code='" + nationCode + "'";
SqlDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
hasNation = true;
}
else
{
hasNation = false;
Console.WriteLine("民族代号输入不正确");
}
conn.Close();
return hasNation;
}
public static void AddInfo(string code, string name, string sex, string nation, string birthday)   //插入信息函数
{
SqlConnection conn = new SqlConnection(CONNECTIONSTRING);
conn.Open();

SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "insert into info values('" + code + "','" + name + "','" + sex + "','" + nation + "','" + birthday + "')";
cmd.ExecuteNonQuery();

conn.Close();
}
public static void Main111(string[] args)
{
//输入
Console.Write("代号:");
string code = Console.ReadLine();
Console.Write("姓名:");
string name = Console.ReadLine();
Console.Write("性别(0,1):");
string sex = Console.ReadLine();
Console.Write("民族:");
string nation = Console.ReadLine();
Console.Write("生日:");
string birthday = Console.ReadLine();
//检查
bool isOK = CheckInput(code, sex, nation, birthday);

//插入
if (isOK == true)
{
AddInfo(code, name, sex, nation, birthday);
}
}

private static bool CheckInput(string code, string sex, string nation, string birthday)   //验证所有检查是否都执行完
{
//1.对输入的数据格式进行检查
bool isOK = true;
bool isOK1 = Check("sex", sex);
bool isOK2 = Check("birthday", birthday);

//2.对主外键进行检查
bool isOK3 =CheckPK(code);
bool isOK4 = HasNation(nation);

isOK = isOK && isOK1 && isOK2 && isOK3 && isOK4;
return isOK;
}
}
}

(4)从info表中删除数据(注意有外键的情况,有两种方法删除:一,在数据库中使用级联删除。二,写代码先删除从表再删除主表)

namespace ConsoleApplication1
{
class Class2
{
public const string CONNECTIONSTRING = "server=.;database=mydb;uid=sa;pwd=123";
static string GetNationName(string code)
{
string str = "";

//根据民族代号查询民族名称
SqlConnection conn = new SqlConnection(CONNECTIONSTRING);
conn.Open();

SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "select * from nation where code='" + code + "' ";
SqlDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
dr.Read();
str = dr["Name"].ToString();
}
else
{
str = "未知";
}

conn.Close();

return str;
}
//显示所有人员信息
public static void Show()
{
//显示
SqlConnection conn = new SqlConnection(CONNECTIONSTRING);
conn.Open();

SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "select * from info";
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
string code = dr["code"].ToString();
string name = dr["name"].ToString();
string sex = ((bool)dr["Sex"]) ? "男" : "女";
string nation = GetNationName(dr["nation"].ToString());
string birthday = ((DateTime)dr["birthday"]).ToString("yyyy年MM月dd日");

Console.WriteLine(code + "\t" + name + "\t" + sex + "\t" + nation + "\t" + birthday);
}

conn.Close();
}
//检查主键是否存在
public static bool CheckPK(string pk)
{
bool hasPK = true;
SqlConnection conn = new SqlConnection(CONNECTIONSTRING);
conn.Open();

SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "select * from info where code='" + pk + "'";
SqlDataReader dr = cmd.ExecuteReader();
hasPK = dr.HasRows;
conn.Close();

return hasPK;
}
public static void DeleteInfo(string pk)
{
SqlConnection conn = new SqlConnection(CONNECTIONSTRING);
conn.Open();

SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "delete from family where InfoCode='" + pk + "'";
cmd.ExecuteNonQuery();
cmd.CommandText = "delete from work where InfoCode='" + pk + "'";
cmd.ExecuteNonQuery();
cmd.CommandText = "delete from info where code='" + pk + "'";
cmd.ExecuteNonQuery();

conn.Close();
}
public static void Main(string[] args)
{
//显示
Show();
//输入要删除的人员代号
Console.Write("输入要删除的人员:");
string code = Console.ReadLine();
//删除
//看看有没有这个代号的人员,如果没有就提示代号输入错误。
bool pkIsOK = CheckPK(code);
if (pkIsOK == true)
{
//执行删除
DeleteInfo(code);
Console.WriteLine("删除成功");
}
else
{
Console.WriteLine("找不到要删除的人员代号,删除失败。请重新检查要删除的人员代号。");
}

//显示
Show();
}
}
}

winform基础——数据访问及几个案例的更多相关文章

  1. 16. Django基础数据访问

    如果我们想使用Django对数据库进行访问,我们可以使用django自带的shell. 进入blog目录,打开cmd命令窗口,输入python manage.py shell,如下图所示: 插入数据 ...

  2. 在WCF数据访问中使用缓存提高Winform字段中文显示速度

    在我们开发基于WCF访问方式的Winform程序的时候,一般情况下需要对界面显示的字段进行中文显示的解析.如果是硬编码进行中文显示,那么除了不方便调整及代码臃肿外,性能上没有什么问题,但是不建议这样处 ...

  3. SYS_数据访问权限Operation Unit和Ledger的访问设定(案例)

    2014-06-01 Created By BaoXinjian

  4. ABP框架之——数据访问基础架构

    大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享阅读心得,希望我的文章能成为你成长路上的一块垫脚石,我们一起精进. 几乎所有的业务应用程序都要适用一种数据库基础架构,用来实现数据访问逻辑,以便从数 ...

  5. winform中利用反射实现泛型数据访问对象基类(1)

    考虑到软件使用在客户端,同时想简化代码的实现,就写了一个泛型的数据访问对象基类,并不是特别健全,按道理应该参数化的方式实现insert和update,暂未使用参数化,抽时间改进. /// <su ...

  6. PHP数据访问基础知识(20161028)

    数据访问 动态页面的特征:能够读取数据库,网页的内容都是从数据库读出来的,而不是写死的 所有的程序归根结底都是对数据的增删改查 如何用服务器的PHP来操作服务器的MySQL,Apache则是用来管理, ...

  7. JAVAWEB基础模块开发顺序与数据访问对象实现类步骤

    一.模块的开发的顺序 1. 定义数据表 2. 新建模型类 3. 新建"add.jsp" 4. 实现AddServlet中的doGet()方法 5. 定义Dao.Service接口 ...

  8. Spring Boot数据访问之动态数据源切换之使用注解式AOP优化

    在Spring Boot数据访问之多数据源配置及数据源动态切换 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中详述了如何配置多数据源及多数据源之间的动态切换.但是需要读数据库的地方,就 ...

  9. Spring Boot数据访问之整合Mybatis

    在Mybatis整合Spring - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中谈到了Spring和Mybatis整合需要整合的点在哪些方面,需要将Mybatis中数据库连接池等相关对 ...

随机推荐

  1. MAC安裝《Genymotion Android模擬器》大玩Android APP (神魔之塔)

    链接地址:http://www.minwt.com/mac/10083.html/comment-page-2 MAC» 智慧型裝罝» Android | 2014/02/12 Android是一個開 ...

  2. JS 切换显示

    <style>  #hhh div {        width:200px;    height:200px;    background:red;    display:none;   ...

  3. 最新的QT git代码到code.qt.io/cgit,还有planet.qt.io有许多博客

    http://code.qt.io/cgit/ http://planet.qt.io/

  4. WPF: 针对Windows 8优化菜单栏和工具栏

    原文 WPF: 针对Windows 8优化菜单栏和工具栏 目录 1. 关于菜单图标大小 2. 关于IsEnabled和工具栏图标 3. 针对.NET 3.x的菜单栏和工具栏外观 返回目录 1. 关于菜 ...

  5. Linux高性能server编程——高级I/O函数

     高级I/O函数 pipe函数 pipe函数用于创建一个管道,实现进程间的通信. #include <unistd.h> int pipe(int pipefd[2]); 通过pipe ...

  6. UVA 10905 Children's Game 孩子的游戏 贪心

    题意:给出N个数,要求把它们拼凑起来,让得到的数值是最大的. 只要分别比较两个数放前与放后的值的大小,排序后输出就可以了. 比如123和56,就比较12356和56123的大小就行了. 写一个比较函数 ...

  7. phantomjs环境搭建已经运行

    1.下载phantomjs http://phantomjs.org/ 2.运行 新建phantomjs.bat,记得改目录路径 里面内容为: D:\java\phantomjs\phantomjs. ...

  8. java--多线程之前台幕后

    前台程序是相对于后台程序来说的,那么什么是后台程序呢? [后台程序]就是在启动了start()之前,调用了setDaemon(true)方法,这个线程就变成了后台.如果一个进程中只用后台线程在运行,那 ...

  9. perl 面向对象 use base

    1.XXX.pm 文件里面的第一行要是:package XXX: 2.要有构造函数 sub new,实现如下: sub new { my $class = shift; # Get the reque ...

  10. android 由于界面控件过多耗时处理办法

    在开发当中,有时候可能界面嵌套较多,那么导致控件实例化增多,有时候会大大影响界面加载的速度,特别在viewpage中的时候,要是第一页里面要inflate一个控件比较多的页面的时候,就会影响整个Act ...