C# 数据库dataGridView刷新数据和主外键判断
本文主要讲诉在使用VS2012+SQL Server数据库做系统中,通常会遇到几个问题.使用dataGridView控件在修改、删除、插入数据后,怎样刷新数据显示操作后的结果.同时在对数据操作时通常会判断数据的主键是否存在或重复,判断外键是否重复,这几个问题我推荐使用函数的形式完成,同时推荐一个操作格式,下面将详细介绍.
一.dataGridView刷新数据
如下图所示,在数据库中删除一个数据或插入一个数据,我们都希望能够在左边的dataGridView控件中显示操作后的内容,而使用dataGridView1.Refresh()刷新只是刷新页面重绘控件,没有从数据库里读取内容.所以我们需要重新绑定数据,点击按钮故障信息删除后,实现重新读取数据库的值,并显示在控件dataGridView中即可.而这里我采用自定义函数实现重新绑定数据.
代码如下:
public void ShowInfoQues()
{
//定义数据库连接语句:服务器=.(本地) 数据库名=a
string consqlserver = "Data Source=.;Initial Catalog=a;Integrated Security=True;";
string sql = "select * from Question"; //定义SQL查询语句
DataSet ds = new DataSet(); //定义数据内存中缓存
SqlConnection con; //定义SQL Server连接对象
SqlDataAdapter da; //数据库命令和数据库连接
con = new SqlConnection(consqlserver); //定义SQL Server连接对象
da = new SqlDataAdapter(sql, con); //数据库命令和数据库连接
con.Open();
try
{
da.Fill(ds); //填充数据
dataGridView1.DataSource = ds.Tables[0]; //获取数据源赋值数据库控件
}
catch (Exception msg)
{
MessageBox.Show(msg.Message); //异常处理
}
finally
{
con.Close(); //关闭连接
con.Dispose(); //释放连接
da.Dispose(); //释放资源
}
}
点击按钮"故障信息删除"后调用该函数ShowInfoQues()即可实现,通常填充数据中需要判断语句如下,如果插入到的结果存在时数据显示在dataGridView控件中,但这样会存在一个问题,当数据库中只存在一个数据时,删除该数据后表中为空就不会更新dataGridView,因为此时已经没有数据就不会执行dataGridView1.DataSource = ds.Tables[0].它会始终显示一行数据,除非在此载入该窗体,所以此时不需要下面判断:
if (ds.Tables[0].Rows.Count > 0) //判断是否符合条件的数据记录
{
dataGridView1.DataSource = ds.Tables[0];
}
在上面代码函数ShowInfoQues()中我设置为public,因为在点击“故障信息导入”按钮,它会进入另外一个界面,在那个界面填写完要插入的数据后同时更新父窗口dataGridView控件中的数据,实现插入数据更新,其中子窗口中的构造函数将带参数,如下图所示是子界面的代码:
//父窗体custServ 父窗体中含函数ShowInfoQues()
custServ cstemp = new custServ();
public custServInput(custServ cs)
{
InitializeComponent();
cstemp = cs;
}
//点击"确认添加"按钮实现满意度调查
private void button1_Click(object sender, EventArgs e)
{
... //插入数据操作
cstemp.ShowInfoQues(); //父窗口刷新
this.Hide(); //隐藏窗体
}
父窗体中的代码如下:
//点击"故障信息录入"按钮
private void repInf_Click(object sender, EventArgs e)
{
custServInput cSI = new custServInput(this);
cSI.Show();
}
二.数据库主外键的判断
在对数据库进行操作时,通常会遇到判断主键是否存在或是否重复的问题,或判断外键是否存在的问题,因为如果外键不存在是不能插入数据的.在判断主键与外键时,我们可以定义一个函数,通过调用这个函数进行判断.
//该函数用于判断表中Phoneid(手机序列号)是否存在
private bool IsPhoneIdentify()
{
string consqlserver = "Data Source=.;Initial Catalog=TeleMS;Integrated Security=True;";
string sql = "select * from Question where phoneid='" + textBox2.Text.Trim() + "'";
SqlConnection Conn = new SqlConnection(consqlserver); //定义SQL Server连接对象
Conn.Open();
SqlCommand Cmd = new SqlCommand(sql, Conn);
SqlDataReader reader = Cmd.ExecuteReader(); //数据库命令和数据库连接
if (reader.Read()) //存在
{
return true;
}
else
{
return false;
}
}
上面代码是判断手机序列号是否存在,它通过判断数据库中phoneid=textBox2内容,如果存在返回true,如果不存在返回false并提示错误信息"该外键不存在,请验证插入!"提示:使用try{..}catch(Exception msg){MessageBox.Show(msg.Message);}finally{..}时C#会自动生成异常信息,但通过自定义函数总体感觉更好,至少让我们能更好的了解数据库原理及常见的操作错误.
三.推荐格式源代码
通过上面的叙述,可能你还不知道怎样使用这些函数在对数据库进行操作时进行一些简单的判断,下面通过需要插入如图数据,其中主外键表明:
我推荐的代码如下:
//点击"确认记录"按钮实现满意度调查
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text == "" || textBox2.Text == "" || textBox3.Text == "")
{
MessageBox.Show("请输入顾客身份证号、售后人员编号和手机序列号!", "信息提示",
System.Windows.Forms.MessageBoxButtons.OK,
System.Windows.Forms.MessageBoxIcon.Warning);
}
else if (IsCusIdentify() == false) //顾客身份证号重复(主键)
{
MessageBox.Show("该顾客身份证号已经存在,请验证输入!", "错误提示",
System.Windows.Forms.MessageBoxButtons.OK,
System.Windows.Forms.MessageBoxIcon.Warning);
}
else if (IsPhoneIdentify() == false) //手机序列号不存在(外键)
{
MessageBox.Show("该手机序列号不存在,请验证输入!", "错误提示",
System.Windows.Forms.MessageBoxButtons.OK,
System.Windows.Forms.MessageBoxIcon.Warning);
}
else if (IsUserIdentify() == false) //售后人员编号不存在(外键)
{
MessageBox.Show("该售后人员编号错误,请验证!", "错误提示",
System.Windows.Forms.MessageBoxButtons.OK,
System.Windows.Forms.MessageBoxIcon.Warning);
}
else if (MessageBox.Show("确认要添加该进货订单信息?", "验证提示",
System.Windows.Forms.MessageBoxButtons.YesNo,
System.Windows.Forms.MessageBoxIcon.Question)==System.Windows.Forms.DialogResult.Yes)
{
//实现插入数据操作
string sqlInsert = string.Format(@"insert into ServiceInfo...");
string consqlserver = "Data Source=.;Initial Catalog=a;Integrated Security=True;";
SqlConnection cons = new SqlConnection(consqlserver); //定义SQL Server连接对象
SqlCommand cmd = new SqlCommand(sqlInsert, cons); //执行一个SQL语句
try
{
cons.Open(); //打开连接
cmd.ExecuteNonQuery(); //返回执行SQL语句的行数
MessageBox.Show("顾客手机使用满意情况调查数据记录成功!", "信息提示",
System.Windows.Forms.MessageBoxButtons.OK,
System.Windows.Forms.MessageBoxIcon.Information);
csrmtemp.ShowInfoQues(); //父窗口刷新
this.Hide(); //隐藏窗体
}
catch (Exception msg)
{
MessageBox.Show(msg.Message); //异常处理
}
finally
{
cons.Close(); //关闭连接
cons.Dispose(); //释放连接
cmd.Dispose(); //释放资源
}
}
}
四.总结
上面的排版可能有点乱,可能写得不是很好!但作者尽力了.原本想分成两篇写的,但因为上面叙述的几点是最近做项目同时遇到的一些知识,所以就同时写了.主要从dataGridView和主外键两个方面叙述,通过自己认为比较好的代码,传递给大家一些东西.希望大家能学到有用的知识,作者已尽力,如果有不足和不喜欢的地方,见谅!
(By:Eastmount 2013-9-8 夜11点http://blog.csdn.net/eastmount)
C# 数据库dataGridView刷新数据和主外键判断的更多相关文章
- SQL Server语句创建数据库和表——并设置主外键关系
简单的创建数据库的 SQL 语句: use master go if exists(select * from sysdatabases where name='Test') begin select ...
- django rest framework 向数据库中插入数据时处理外键的方法
一.models.py中 from django.db import models class UserModel(models.Model) user_name = models.CharField ...
- 数据库的SQL语句创建和主外键删除操作
create table UserType ( Id ,), Name nvarchar() not null ) go create table UserInfo ( Id ,), LoginPwd ...
- 清除oracl中有主外键关联的表中的部分数据。
1.禁用主外键BEGINfor c in (select 'ALTER TABLE '||TABLE_NAME||' DISABLE CONSTRAINT '||constraint_name||' ...
- MySQL创建数据表并建立主外键关系
为mysql数据表建立主外键需要注意以下几点: 需要建立主外键关系的两个表的存储引擎必须是InnoDB. 外键列和参照列必须具有相似的数据类型,即可以隐式转换的数据类型. 外键列和参照列必须创建索引, ...
- Sql Server有主外键关系时添加、删除数据
当表之间有主外键关系时删除数据会被约束,添加.删除失败 解决办法,我们可以先把主外键关系的检查约束给关掉 → 然后删除数据 → 之后再把约束打开 查询出关掉所有外键约束的语句 SELECT 'ALTE ...
- 经典SQL语句大全_主外键_约束
一.基础(建表.建约束.关系) 约束(Constraint)是Microsoft SQL Server 提供的自动保持数据库完整性的一种方法,定义了可输入表或表的单个列中的数据的限制条件(有关数据完整 ...
- SQLserver创建与主外键的看法
一个.背景 最初研究的相关内容数据库.仅仅是正式.从来没有练过,只能慢慢漂流,现在做的客房时,,非常多的知识需要使用视图,慢的实践. 视图:我理解的就是一张表.它把我们所须要的某个表或某几个表中的部分 ...
- EF如何操作内存中的数据和加载外键数据:延迟加载、贪婪加载、显示加载
EF如何操作内存中的数据和加载外键数据:延迟加载.贪婪加载.显示加载 之前的EF Code First系列讲了那么多如何配置实体和数据库表的关系,显然配置只是辅助,使用EF操作数据库才是每天开发中都需 ...
随机推荐
- [置顶] 如何把你的笔记本电脑变成一个Wi-Fi路由器在Windows 7 & 8?
翻译自:http://www.hakanakdag.net/windows/how-to-create-wireless-ad-hoc-internet-connection-in-windows-8 ...
- Mysql explain 查看分区表
mysql> explain select * from ClientActionTrack where startTime>'2016-08-25 00:00:00' and start ...
- C语言的本质(25)——C标准库之内存管理
程序中需要动态分配一块内存时怎么办呢?我们可以定义一个缓冲区数组,但是这种方法不够灵活,C89要求定义的数组是固定长度的,而程序往往在运行时才知道要动态分配多大的内存,例如: void foo(cha ...
- vmware配置安装JDK、Tomcat以及项目部署
1.安装JDK1.7 JDK:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 安 ...
- 剪花布条(kmp)
欢迎参加——每周六晚的BestCoder(有米!) 剪花布条 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- 操作hadoop的经验积累
操作hadoop的经验积累 Hadoop namenode –format 在执行格式化-format命令时,要避免namenode的namdespaceid与datanode的namespaceid ...
- Hibernate征途(三)之CRUD
上篇博客<Hibernate征途(二)之基础与核心>介绍了Hibernate的基础内容和核心内容,这篇博客简单实践一下.第一篇博客也说过Hibernate是一种JDBC的简化方案,既然是和 ...
- PictureBox从本地上传图片和保存在磁盘目录
private void mypicbox_Click(object sender, EventArgs e) { try { OpenFileDialog ofdPic = new OpenFile ...
- 读书笔记-实用单元测试(英文版) Pragmatic Unit Testing in C# with NUnit
读书笔记-实用单元测试(英文版) Pragmatic Unit Testing in C# with NUnit Author: Andrew Hunt ,David Thomas with Matt ...
- oracle操作语句
Oracle中建立索引,会提高查询速度: create index 索引名 on 表名(列名); create index index_userid on tbl_detail(userid);如何找 ...