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操作数据库才是每天开发中都需 ...
随机推荐
- haproxy image跳转 haproxy匹配 匹配到了就停止,不会继续往下匹配
<pre name="code" class="html">/***第一种 nginx 配置: location / { root /var/www ...
- 原生Javascript 省市区下拉列表插件
每个电商网站中,都会有收件地址管理模块,用户进行地址操作时,最好不要用户手工进行填写地址. 常见的地址管理界面: 实现插件:PCASClass.js 插件下载地址:http://pan.baidu.c ...
- 各种浏览器兼容篡位的css样式写法
谷歌浏览器的识别 @media screen and (-webkit-min-device-pixel-ratio:0) { height:10px; } IE6特制识别的 *HTML .Searc ...
- Android解析中国天气网的Json数据
在Android开发中.一般的APP都是通过获取server端的数据来更新UI.从server获取到的数据能够是Json.它的数据量要比XML要小,这里解析中国天气网上获取的数据,尽管已经不再更新了. ...
- Zepto.js touch模块深入分析 解决手机点击事件
源码: // Zepto.js // (c) 2010-2015 Thomas Fuchs // Zepto.js may be freely distributed under the MIT li ...
- Netty详解
Netty详解 http://blog.csdn.net/suifeng3051/article/category/2161821
- Web页面在手机上显示过大问题
网上抄来了,自己也备忘下:增加<meta name="viewport" content="width=device-width, initial-scale=1. ...
- Android周笔记(9.8-14)(持续更新)
本笔记记录一周内的小知识点和一些心学习的Demo. 1.PopupWindow: new 一个activity_pop_window:id为popwindow的Button,id为hello123的T ...
- Python : 熟悉又陌生的字符编码(转自Python 开发者)
Python : 熟悉又陌生的字符编码 字符编码是计算机编程中不可回避的问题,不管你用 Python2 还是 Python3,亦或是 C++, Java 等,我都觉得非常有必要厘清计算机中的字符编码概 ...
- MYSQL 没有varchar(max)这个类型。
背景: MYSQL 中不可以用varchar(max) 这种类型列来建立表 -------------------------------------------------------------- ...