SQLHelper

合集下载

如何调用数据库

如何调用数据库

找工作,上长沙英才网//如何调用数据库using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data.SqlClient;using System.Data;namespace Sql2005{///<summary>/// Sql数据操作帮助类,包括数据的创建,删除,修改密码等一系统列操作///</summary>public abstract class DBT_SqlHelper{///<summary>///根据条件创建数据库///</summary>///<param name="dbName">用于指定数据文件的逻辑名称</param>///<param name="dbFileName">指定数据文件的操作系统文件名。

其后面的参数是创建数据文件时定义的物理文件的路径名和文件名</param>///<param name="dbSize">指定数据文件的大小</param>///<param name="dbMaxSize">指定数据文件可以增长到的最大大小</param>///<param name="dbFileGrowth">///指定数据文件的增长增量,其值不能超过maxsize设置。

0表示不增长。

,默认值为MB。

如果指定为%,///则增量大小为发生时文件大小的指定百分比,如果没有指定,默认值为10%。

///</param>///<param name="logName">用于指定数据日志的逻辑名称</param>///<param name="logFileName">指定数据日志的操作系统文件名。

mybatisplus oracle分页写法

mybatisplus oracle分页写法

MyBatis Plus是一个优秀的Java开发框架,支持简单的分页查询。

尤其是和Oracle数据库配合使用,可以很方便的进行分页查询,这在许多实际应用中十分重要。

本文将介绍MyBatis Plus中Oracle分页查询的使用方法。

MyBatis Plus使用一个Page类将查询参数封装起来,这个Page类中定义了每页大小等内容,但要注意第一页的页码始终是1,不可随意设置。

另外,查询总数也要在Page类中设置,否则可能会出现问题。

MyBatis Plus的Oracle分页查询可以使用RowBounds和PaginationInterceptor类来实现。

使用RowBounds可以在传入的SQL语句后面添加limit子句,通过PaginationInterceptor实现不同数据库的分页查询,Mybatis Plus会自动切换不同数据库。

如果要进行Oracle分页查询,则需要添加:```xml<page-interceptor page-sql-parser="com.baomidou.mybatisplus.parsers.oracle.OraclePageParser"></page-interceptor>```并且需要在pom.xml中添加以下maven依赖:```xml<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-extension</artifactId><version>3.0</version></dependency>```最后,在拼接SQL语句时,我们可以使用MyBatis Plus封装的SqlHelper.concatOrderBy方法,将SQL语句后面的order by子句拼接在这条SQL上,使得能够顺利的完成分页的查询。

sqlserver中高并发情况下同时执行select和update语句死锁问题(一)

sqlserver中高并发情况下同时执行select和update语句死锁问题(一)

sqlserver中⾼并发情况下同时执⾏select和update语句死锁问题(⼀)最近在项⽬上线使⽤过程中使⽤SqlServer的时候发现在⾼并发情况下,频繁更新和频繁查询引发死锁。

通常我们知道如果两个事务同时对⼀个表进⾏插⼊或修改数据,会发⽣在请求对表的X锁时,已经被对⽅持有了。

由于得不到锁,后⾯的Commit⽆法执⾏,这样双⽅开始死锁。

但是select语句和update语句同时执⾏,怎么会发⽣死锁呢?看完下⾯的分析,你会明⽩的…⾸先看到代码中使⽤的查询的⽅法Select<span style="font-size:18px;"> /// <summary>/// 根据学⽣ID查询教师信息。

⽤于前台学⽣评分主页⾯显⽰/// </summary>/// <param name="enTeacherCourseStudent">教师课程学⽣关系实体:StudentID</param>public DataTable QueryTeacherByStudent(TeacherCourseStudentLinkEntity enTeacherCourseStudent){//TODO:QueryTeacherByStudent string strSql = "SELECT ID, CollegeTeacherID,CollegeTeacherName,TeacherID,TeacherCode," +//"TeacherName,CourseID,CourseName,CourseTypeID,CourseTypeName," +//"StudentID,StudentName,IsEvluation FROM TA_TeacherCourseStudentLink WITH(NOLOCK) " +//"WHERE StudentID = @StudentID";//根据学⽣ID查询该学⽣对哪些教师评分的sql语句string strSql = "SELECT ID, CollegeTeacherID,CollegeTeacherName,TeacherID,TeacherCode," +"TeacherName,CourseID,CourseName,CourseTypeID,CourseTypeName," +"StudentID,StudentName,IsEvluation FROM TA_TeacherCourseStudentLink WITH(NOLOCK) " +"WHERE StudentID = @StudentID";//参数SqlParameter[] para = new SqlParameter[] {new SqlParameter("@StudentID",enTeacherCourseStudent.StudentID) //学⽣ID};//执⾏带参数的sql查询语句或存储过程DataTable dtStuTeacher = sqlHelper.ExecuteQuery(strSql,para,CommandType.Text);//返回查询结果return dtStuTeacher;}</span>更新⽅法<span style="font-size:18px;"> /// <summary>/// 学⽣对教师评分完毕,是否评估由N变为Y/// </summary>/// <param name="enTeacherCourseStudent">教师课程学⽣关系实体:StudentID、TeacherID、CourseID</param>/// <return>是否修改成功,true成功,false失败</return>public Boolean EditIsEvaluation(TeacherCourseStudentLinkEntity enTeacherCourseStudent, SqlConnection sqlCon, SqlTransaction sqlTran){//更改是否评估字段为"Y"的sql语句string strSql = "UPDATE TA_TeacherCourseStudentLink WITH(UPDLOCK) SET IsEvluation='Y' WHERE TeacherID=@TeacherID AND StudentID=@StudentID AND CourseID=@CourseID";//参数SqlParameter[] paras = new SqlParameter[]{new SqlParameter("@TeacherID",enTeacherCourseStudent.TeacherID), //教师IDnew SqlParameter("@StudentID",enTeacherCourseStudent.StudentID), //学⽣IDnew SqlParameter("@CourseID",enTeacherCourseStudent.CourseID) //课程ID};//李社河添加2014年12⽉29⽇Boolean flagModify = false;try{//执⾏带参数的增删改sql语句或存储过程flagModify = sqlHelper.ExecNoSelect(strSql, paras, CommandType.Text, sqlCon, sqlTran);}catch (Exception e){throw e;}//返回修改结果return flagModify;}</span>现在分析,在数据库系统中,死锁是指多个⽤户(进程)分别锁定了⼀个资源,并⼜试图请求锁定对⽅已经锁定的资源,这就产⽣了⼀个锁定请求环,导致多个⽤户(进程)都处于等待对⽅释放所锁定资源的状态。

基于WinCE的嵌入式数据库研究

基于WinCE的嵌入式数据库研究

基于WinCE的嵌入式数据库研究摘要:鉴于WinCE下硬件资源的匮乏,大型的基于服务的数据库显得累赘而不可取,寻找可嵌入、可配置的小型数据库非常重要。

结合实际WinCE开发,研究两种嵌入式数据库的使用并给出各自的优缺点。

关键词:WinCE;嵌入式数据库;SQLite;SQL Server CE1 SQLite概述1.1 SQLite简介SQLite是一款轻量的、开源的数据库,是遵守ACID的关系型数据库,它的设计目标是嵌入式的。

SQLite所占用的资源非常少,无需非常复杂的配置就可以使用该数据库,同时它能够支持Windows/Linux/Unix等主流操作系统,同时能够与很多程序设计语言结合起来,并且处理速度相当快。

1.2 SQLite功能和特性(1)SQLite除支持最基本的增、删、改、查功能外,还支持ACID、视图、事务、触发器、索引和表达式等。

(2)零配置。

无需复杂的安装和配置,移植数据库只要复制文件就可以了。

(3)支持数据库大小可达到2TB。

(4)提供简单易用的API来操作数据库。

(5)开放源代码。

提供完整的C语言源代码并给予最详尽的注释。

(6)支持多种开发语言。

如C,C ++Java,C,PHP,Python等。

2 SQL Server CE概述2.1 SQL Server CE简介SQL Server Compact Edition是微软推出的适用于嵌入到移动应用的精简数据库产品,简称SQL Server CE或SqlServerCe。

虽然该数据库是SQL Server的精简产品,但其功能并未大幅缩水,它也是一个基于文件的数据库。

该数据库不仅支持WinCE 也可以在普通Windows当中使用。

2.2 SQL Server CE功能和特性(1)精简的数据库引擎和强大的查询优化器。

(2)支持合并复制和远程数据访问。

(3)支持用于SQL Server CE的和OLE DB访问接口。

(4)可以与Visual Studio无缝集成,操作起来非常方便。

C#--CS--学员管理系统--7--学员信息的增删改查

C#--CS--学员管理系统--7--学员信息的增删改查

C#--CS--学员管理系统--7--学员信息的增删改查以下是学习笔记:⼀,添加新学员1,后台部分:在DAL---StudentService中添加代码/// <summary>/// 判断当前⾝份证号是否已经存在/// </summary>/// <param name="studentIdNo"></param>/// <returns></returns>public bool IsIdNoExisted(string studentIdNo){string sql = "select count(*) from Students where StudentIdNo={0}";sql = string.Format(sql, studentIdNo);int result = Convert.ToInt32(SQLHelper.GetSingleResult(sql));if (result == 1) return true;else return false;}/// <summary>/// 添加学员/// </summary>/// <param name="objStudent"></param>/// <returns></returns>public int AddStudent(Student objStudent){//【1】编写SQL语句StringBuilder sqlBuilder = new StringBuilder();//如果字符串⽐较长,可以⽤StringBuildersqlBuilder.Append("insert into Students(StudentName,Gender,Birthday,StudentIdNo,Age,PhoneNumber,StudentAddress,CardNo,ClassId)"); sqlBuilder.Append(" values('{0}','{1}','{2}',{3},{4},'{5}','{6}','{7}',{8})");//【2】解析对象string sql = string.Format(sqlBuilder.ToString(),objStudent.StudentName, objStudent.Gender, objStudent.Birthday.ToString("yyyy-MM-dd"),objStudent.StudentIdNo, objStudent.Age, objStudent.PhoneNumber,objStudent.StudentAddress, objStudent.CardNo, objStudent.ClassId);//【3】提交到数据库try{return SQLHelper.Update(sql);}catch (SqlException ex){throw new Exception("数据库操作出现异常!具体信息:" + ex.Message);}catch (Exception ex){throw ex;}} 2,UI部分 确认添加的按钮事件private void btnAdd_Click(object sender, EventArgs e){#region 验证数据if (this.txtStudentName.Text.Trim().Length == 0){MessageBox.Show("学⽣姓名不能为空!", "提⽰信息");this.txtStudentName.Focus();return;}if (this.txtCardNo.Text.Trim().Length == 0){MessageBox.Show("考勤卡号不能为空!", "提⽰信息");this.txtCardNo.Focus();return;}//验证性别if (!this.rdoFemale.Checked && !this.rdoMale.Checked){MessageBox.Show("请选择学⽣性别!", "提⽰信息");return;}//验证班级if (this.cboClassName.SelectedIndex == -1){MessageBox.Show("请选择班级!", "提⽰信息");return;}//验证⾝份证号是否符合要求if (!Common.DataValidate.IsIdentityCard(this.txtStudentIdNo.Text.Trim())){MessageBox.Show("⾝份证号不符合要求!", "验证提⽰");this.txtStudentIdNo.Focus();return;}//验证⾝份证号是否重复if (objStudentService.IsIdNoExisted(this.txtStudentIdNo.Text.Trim())){MessageBox.Show("⾝份证号不能和现有学员⾝份证号重复!", "验证提⽰");this.txtStudentIdNo.Focus();this.txtStudentIdNo.SelectAll();return;}//验证⾝份证号是否和出⽣⽇期相吻合string month = string.Empty;string day = string.Empty;if (Convert.ToDateTime(this.dtpBirthday.Text).Month < 10)month = "0" + Convert.ToDateTime(this.dtpBirthday.Text).Month;elsemonth = Convert.ToDateTime(this.dtpBirthday.Text).Month.ToString();if (Convert.ToDateTime(this.dtpBirthday.Text).Day < 10)day = "0" + Convert.ToDateTime(this.dtpBirthday.Text).Day;elseday = Convert.ToDateTime(this.dtpBirthday.Text).Day.ToString();string birthday = Convert.ToDateTime(this.dtpBirthday.Text).Year.ToString() + month + day;if (!this.txtStudentIdNo.Text.Trim().Contains(birthday)){MessageBox.Show("⾝份证号和出⽣⽇期不匹配!", "验证提⽰");this.txtStudentIdNo.Focus();this.txtStudentIdNo.SelectAll();return;}//验证出⽣⽇期int age = DateTime.Now.Year - Convert.ToDateTime(this.dtpBirthday.Text).Year;if (age < 18){MessageBox.Show("学⽣年龄不能⼩于18岁!", "验证提⽰");return;}#endregion#region 封装学⽣对象Student objStudent = new Student(){StudentName = this.txtStudentName.Text.Trim(),Gender = this.rdoMale.Checked ? "男" : "⼥",Birthday = Convert.ToDateTime(this.dtpBirthday.Text),StudentIdNo = this.txtStudentIdNo.Text.Trim(),PhoneNumber = this.txtPhoneNumber.Text.Trim(),StudentAddress = this.txtAddress.Text.Trim(),CardNo = this.txtCardNo.Text.Trim(),ClassId = Convert.ToInt32(this.cboClassName.SelectedValue),//获取选择班级对应的ClassIdAge = DateTime.Now.Year - Convert.ToDateTime(this.dtpBirthday.Text).Year};#endregion#region 调⽤后台数据访问⽅法添加对象try{if (objStudentService.AddStudent(objStudent) == 1){DialogResult result = MessageBox.Show("新学员添加成功!是否继续添加?", "提⽰信息", MessageBoxButtons.YesNo, MessageBoxIcon.Question);if (result == DialogResult.Yes)//清空⽤户的输⼊{this.cboClassName.SelectedIndex = -1;this.rdoFemale.Checked = false;this.rdoMale.Checked = false;//清除⽂本框foreach (Control item in this.Controls){if (item is TextBox)item.Text = "";}this.txtStudentName.Focus();}}elsethis.Close();}catch (Exception ex){MessageBox.Show(ex.Message);}#endregion} ⼆,学员信息查询 1,Models中添加2个实体类:Models--Students 和扩展实体类Models--Ext-StudentExt Students:namespace Models{/// <summary>/// 学员实体类/// </summary>public class Student{public int StudentId { get; set; }public string StudentName { get; set; }public string Gender { get; set; }public DateTime Birthday{ get; set; }//将数据库中的18位整数转换成字符串public string StudentIdNo { get; set; }public int Age { get; set; }public string PhoneNumber { get; set; }public string StudentAddress { get; set; }public string CardNo { get; set; }public int ClassId { get; set; }}} StudentExt:namespace Models{/// <summary>/// 学员信息扩展实体/// </summary>public class StudentExt : Student{public string ClassName { get; set; }public int CSharp { get; set; }public int SQLServerDB { get; set; }}} 2,在DAL--StudentService学员信息数访问类添加查询⽅法#region 查询学员【根据班级、学号、卡号】/// <summary>/// 根据班级名称查询学员信息/// </summary>/// <param name="className"></param>/// <returns></returns>public List<StudentExt> GetStudentByClass(string className){string sql = "select StudentName,StudentId,Gender,Birthday,ClassName from Students";sql += " inner join StudentClass on Students.ClassId=StudentClass.ClassId";sql += " where ClassName='{0}'";sql = string.Format(sql, className);SqlDataReader objReader = SQLHelper.GetReader(sql);List<StudentExt> list = new List<StudentExt>();while (objReader.Read()){list.Add(new StudentExt(){StudentId = Convert.ToInt32(objReader["StudentId"]),StudentName = objReader["StudentName"].ToString(),Gender = objReader["Gender"].ToString(),Birthday = Convert.ToDateTime(objReader["Birthday"]),ClassName = objReader["ClassName"].ToString()});}objReader.Close();return list;}/// <summary>///根据学号查询学员对象/// </summary>/// <param name="studentId"></param>/// <returns></returns>public StudentExt GetStudentById(string studentId){string sql = "select StudentId,StudentName,Gender,Birthday,ClassName,StudentIdNo,PhoneNumber,StudentAddress,CardNo from Students"; sql += " inner join StudentClass on Students.ClassId=StudentClass.ClassId";sql += " where StudentId=" + studentId;SqlDataReader objReader = SQLHelper.GetReader(sql);StudentExt objStudent = null;if (objReader.Read()){objStudent = new StudentExt(){StudentId = Convert.ToInt32(objReader["StudentId"]),StudentName = objReader["StudentName"].ToString(),Gender = objReader["Gender"].ToString(),Birthday = Convert.ToDateTime(objReader["Birthday"]),ClassName = objReader["ClassName"].ToString(),CardNo = objReader["CardNo"].ToString(),StudentIdNo = objReader["StudentIdNo"].ToString(),PhoneNumber = objReader["PhoneNumber"].ToString(),StudentAddress = objReader["StudentAddress"].ToString()};}objReader.Close();return objStudent;}/// <summary>/// 根据卡号查询学⽣信息(请思考如何将上⾯的⽅法合并,像下⾯的⽅法这么简单)/// </summary>/// <param name="CardNo"></param>/// <returns></returns>public StudentExt GetStudentByCardNo(string CardNo){string whereSql = string.Format(" where CardNo='{0}'", CardNo);return this.GetStudent(whereSql);}private StudentExt GetStudent(string whereSql){string sql = "select StudentId,StudentName,Gender,Birthday,ClassName,";sql += "StudentIdNo,PhoneNumber,StudentAddress,CardNo from Students";sql += " inner join StudentClass on Students.ClassId=StudentClass.ClassId ";sql += whereSql;SqlDataReader objReader = SQLHelper.GetReader(sql);StudentExt objStudent = null;if (objReader.Read()){objStudent = new StudentExt(){StudentId = Convert.ToInt32(objReader["StudentId"]),StudentName = objReader["StudentName"].ToString(),Gender = objReader["Gender"].ToString(),Birthday = Convert.ToDateTime(objReader["Birthday"]),ClassName = objReader["ClassName"].ToString(),CardNo = objReader["CardNo"].ToString(),StudentIdNo = objReader["StudentIdNo"].ToString(),PhoneNumber = objReader["PhoneNumber"].ToString(),StudentAddress = objReader["StudentAddress"].ToString()};}objReader.Close();return objStudent;}#endregion 3,UI部分查询按钮事件代码://按照班级查询private void btnQuery_Click(object sender, EventArgs e){if (this.cboClass.SelectedIndex == -1){MessageBox.Show("请选择班级!", "提⽰信息");return;}this.dgvStudentList.AutoGenerateColumns = false;//DataGridView中设置不显⽰未封装的属性 //执⾏查询this.dgvStudentList.DataSource = objStuService.GetStudentByClass(this.cboClass.Text); }//根据学号查询private void btnQueryById_Click(object sender, EventArgs e){if (this.txtStudentId.Text.Trim().Length == 0){MessageBox.Show("请输⼊学号!", "提⽰信息");this.txtStudentId.Focus();return;}//进⼀步验证学号必须是数字(请使⽤正则表达式...)//执⾏查询StudentExt objStudent = objStuService.GetStudentById(this.txtStudentId.Text.Trim());if (objStudent == null){MessageBox.Show("学员信息不存在!", "提⽰信息");this.txtStudentId.Focus();}else{//在学员详细信息窗体显⽰FrmStudentInfo objFrmStuInfo = new FrmStudentInfo(objStudent);objFrmStuInfo.Show();}} 学员信息显⽰:学员信息显⽰代码:public partial class FrmStudentInfo : Form{public FrmStudentInfo(){InitializeComponent();}public FrmStudentInfo(StudentExt objStudent): this()//调⽤默认的构造⽅法{//显⽰学员信息this.lblStudentName.Text = objStudent.StudentName;this.lblStudentIdNo.Text = objStudent.StudentIdNo;this.lblPhoneNumber .Text = objStudent.PhoneNumber;this.lblBirthday.Text = objStudent.Birthday.ToShortDateString();this.lblAddress.Text = objStudent.StudentAddress;this.lblGender.Text = objStudent.Gender;this.lblClass.Text = objStudent.ClassName;this.lblCardNo.Text = objStudent.CardNo;}//关闭private void btnClose_Click(object sender, EventArgs e){this.Close();}} 三,学员信息修改1,后台代码:在DAL--StudentService中添加修改学员对象的⽅法#region 修改学员对象/// <summary>/// 修改学员时判断⾝份证号是否和其他学员重复/// </summary>/// <param name="studentIdNo"></param>/// <param name="studentId"></param>/// <returns></returns>public bool IsIdNoExisted(string studentIdNo, string studentId){string sql = "select count(*) from Students where StudentIdNo={0} and StudentId<>{1}";sql = string.Format(sql, studentIdNo, studentId);int result = Convert.ToInt32(SQLHelper.GetSingleResult(sql));if (result == 1) return true;else return false;}/// <summary>/// 修改学员对象/// </summary>/// <param name="objStudent"></param>/// <returns></returns>public int ModifyStudent(Student objStudent){StringBuilder sqlBuilder = new StringBuilder();sqlBuilder.Append("Update Students set StudentName='{0}',Gender='{1}',Birthday='{2}',");sqlBuilder.Append("StudentIdNo={3},Age={4},PhoneNumber='{5}',StudentAddress='{6}',CardNo='{7}',ClassId={8}"); sqlBuilder.Append(" where StudentId={9}");//注意where前⾯有空格//解析对象string sql = string.Format(sqlBuilder.ToString(),objStudent.StudentName, objStudent.Gender, objStudent.Birthday,objStudent.StudentIdNo, objStudent.Age, objStudent.PhoneNumber,objStudent.StudentAddress, objStudent.CardNo, objStudent.ClassId, objStudent.StudentId);try{return SQLHelper.Update(sql);}catch (SqlException ex){throw new Exception("数据库操作出现异常!具体信息:" + ex.Message);}catch (Exception ex){throw ex;}}#endregion 2,前端UI点击修改代码的事件代码修改的代码://修改学员对象private void btnEidt_Click(object sender, EventArgs e){if (this.dgvStudentList.RowCount == 0){MessageBox.Show("没有任何要修改的学信息!", "提⽰信息");return;}if (this.dgvStudentList.CurrentRow == null)//判断当前⾏{MessageBox.Show("请选中要修改的学员信息!", "提⽰信息");return;}//获取学号string studentId = this.dgvStudentList.CurrentRow.Cells["StudentId"].Value.ToString();//获取要修改的学员详细信息StudentExt objStudent = objStuService.GetStudentById(studentId);//显⽰要修改的学员信息窗⼝FrmEditStudent objEditStudent = new FrmEditStudent(objStudent);DialogResult result = objEditStudent.ShowDialog();//判断修改是否成if (result == DialogResult.OK){btnQuery_Click(null, null);//同步刷新修改的信息(适合查询数据量⼩的情况)}} 3,修改学员信息的代码通过构造函数把学员信息对象传过来提交修改的代码//提交修改private void btnModify_Click(object sender, EventArgs e){#region 验证信息if (this.txtStudentName.Text.Trim().Length == 0){MessageBox.Show("学⽣姓名不能为空!", "提⽰信息");this.txtStudentName.Focus();return;}//验证性别if (!this.rdoFemale.Checked && !this.rdoMale.Checked){MessageBox.Show("请选择学⽣性别!", "提⽰信息");return;}//验证班级if (this.cboClassName.SelectedIndex == -1){MessageBox.Show("请选择班级!", "提⽰信息");return;}//验证⾝份证号是否符合要求if (!Common.DataValidate.IsIdentityCard(this.txtStudentIdNo.Text.Trim())){MessageBox.Show("⾝份证号不符合要求!", "验证提⽰");this.txtStudentIdNo.Focus();return;}//验证⾝份证号是否重复if (objStudentService.IsIdNoExisted(this.txtStudentIdNo.Text.Trim(), this.txtStudentId.Text.Trim())) {MessageBox.Show("⾝份证号不能和现有学员⾝份证号重复!", "验证提⽰");this.txtStudentIdNo.Focus();this.txtStudentIdNo.SelectAll();return;}//验证⾝份证号是否和出⽣⽇期相吻合string month = string.Empty;string day = string.Empty;if (Convert.ToDateTime(this.dtpBirthday.Text).Month < 10)month = "0" + Convert.ToDateTime(this.dtpBirthday.Text).Month;if (Convert.ToDateTime(this.dtpBirthday.Text).Day < 10)day = "0" + Convert.ToDateTime(this.dtpBirthday.Text).Day;string birthday = Convert.ToDateTime(this.dtpBirthday.Text).Year.ToString() + month + day;if (!this.txtStudentIdNo.Text.Trim().Contains(birthday)){MessageBox.Show("⾝份证号和出⽣⽇期不匹配!", "验证提⽰");this.txtStudentIdNo.Focus();this.txtStudentIdNo.SelectAll();return;}//验证出⽣⽇期int age = DateTime.Now.Year - Convert.ToDateTime(this.dtpBirthday.Text).Year;if (age < 18){MessageBox.Show("学⽣年龄不能⼩于18岁!", "验证提⽰");return;}#endregion#region 封装学⽣对象Student objStudent = new Student(){StudentId = Convert.ToInt32(this.txtStudentId.Text.Trim()),StudentName = this.txtStudentName.Text.Trim(),Gender = this.rdoMale.Checked ? "男" : "⼥",Birthday = Convert.ToDateTime(this.dtpBirthday.Text),StudentIdNo = this.txtStudentIdNo.Text.Trim(),PhoneNumber = this.txtPhoneNumber.Text.Trim(),StudentAddress = this.txtAddress.Text.Trim(),CardNo = this.txtCardNo.Text.Trim(),ClassId = Convert.ToInt32(this.cboClassName.SelectedValue),//获取选择班级对应的ClassIdAge = DateTime.Now.Year - Convert.ToDateTime(this.dtpBirthday.Text).Year};#endregion#region 提交修改try{if (objStudentService.ModifyStudent(objStudent) == 1){MessageBox.Show("学员信息修改成功!", "提⽰信息");this.DialogResult = DialogResult.OK;//返回修改成功的信息this.Close();}}catch (Exception ex){MessageBox.Show(ex.Message);}#endregion} 4,优化⽤户体验,双击显⽰学员信息//双击选中的学员对象并显⽰详细信息private void dgvStudentList_CellDoubleClick(object sender, DataGridViewCellEventArgs e){if (this.dgvStudentList.CurrentRow != null){string studentId = this.dgvStudentList.CurrentRow.Cells["StudentId"].Value.ToString();this.txtStudentId.Text = studentId;btnQueryById_Click(null, null);}} 5,优化⽤户体验,右键就可以修改(查看)学员信息,效果如下:1,添加contextMenuStrip控件,2,设置DataGridView的ContextMenuStrip3,设置ContextMenuStrip的事件代码://右键菜单的事件private void tsmiModifyStu_Click(object sender, EventArgs e){btnEidt_Click(null, null);//修改学员对象按钮的事件} 四,删除学员信息1,后台代码在DAL--StudentService中添加删除学员对象的⽅法#region 删除学员对象public int DeleteStudentById(string studentId){string sql = "delete from Students where StudentId=" + studentId;try{return SQLHelper.Update(sql);}catch (SqlException ex){if (ex.Number == 547)throw new Exception("该学号被其他数据表引⽤,不能直接删除该学员对象!");//判断外键引⽤ elsethrow new Exception("数据库操作出现异常!具体信息:" + ex.Message);}catch (Exception ex){throw ex;}}#endregion 2,前端UI删除按钮的事件代码://删除学员对象private void btnDel_Click(object sender, EventArgs e){if (this.dgvStudentList.RowCount == 0){MessageBox.Show("没有任何要删除的学信息!", "提⽰信息");return;}if (this.dgvStudentList.CurrentRow == null){MessageBox.Show("请选中要删除的学员信息!", "提⽰信息");return;}//删除确认string studentName = this.dgvStudentList.CurrentRow.Cells["StudentName"].Value.ToString();DialogResult result = MessageBox.Show("确认要删除学员 [" + studentName + "] 吗?", "删除询问", MessageBoxButtons.OKCancel, MessageBoxIcon.Question); if (result == DialogResult.Cancel) return;//获取学号并删除string studentId = this.dgvStudentList.CurrentRow.Cells["StudentId"].Value.ToString();try{if (objStuService.DeleteStudentById(studentId) == 1){btnQuery_Click(null, null);}}catch (Exception ex){MessageBox.Show(ex.Message, "提⽰信息");}}。

npoi实现类似excel、word自身的加密解密效果

npoi实现类似excel、word自身的加密解密效果

npoi实现类似excel、word⾃⾝的加密解密效果最近在做⼀个⽂件管理系统,要求上传的excel、word、pdf ⽂件加密存在服务器上。

在系统⾥下载可以不输密码直接打开,在服务器上点开⽂件必须要输密码。

要考虑做好⼀劳永逸、也不能⽤收费的。

以前没做过关于⽂档加密的东西,⽹上搜了好多,可以实现加密解密的⼤致分为3种:1:Spire有免费的,我下载dll做完后发现有⽔印,因为公司的⽂件都是很正式的⽂件,所以果断放弃了它。

这款能实现多种类型的⽂件加密解密,如果公司愿意花钱买,⽤这个还是很不错的。

可以给我们开发⼈员省很多事。

using添加引⽤。

//加密//初始化⼀个⼯作簿并加载⼀个⼯作簿实例Workbook book = new Workbook();book.LoadFromFile("d://test.xls");//为⼯作簿设置访问密码book.Protect("123");//保存并打开⽂档book.SaveToFile("d://test.xls", ExcelVersion.Version2013);//解密//初始化⼀个Workbook实例Workbook workbook = new Workbook();//输⼊密码并加载⽂档workbook.OpenPassword = ("123");workbook.LoadFromFile("d://test.xls", ExcelVersion.Version2013);//取消保护workbook.UnProtect();//保存workbook.SaveToFile("d://test.xls", ExcelVersion.Version2013)//word加密// savePath绝对路径//doc 可以,但是眉头加了⼀⾏⽔印。

未经处理的异常在System.Data.dll中发生。其它信息:在应使用条件的上下文(在#。。。

未经处理的异常在System.Data.dll中发⽣。

其它信息:在应使⽤条件的上下⽂(在#。

机房收费系统中,有些⼈在联合查询这个模块⽤的是存储过程,我先尝试着在数据库中建⽴了⼀个视图,然后在UI层做个推断并⽣成查询条件strCondition。

在机房收费系统的“联合查询”模块中出现的问题:“System.Data.SqlClient.SqlException”类型的未经处理的异常在System.Data.dll 中发⽣。

其它信息: 在应使⽤条件的上下⽂(在 '@strCondition' 附近)中指定了⾮布尔类型的表达式。

出错的DAL层代码为:Public Function QueryOnLineStatus(ByVal strCondition As String) As List(Of Entity.QueryOnLineStatusViewEntity) Implements IDAL.IQueryOnLineStatusView.QueryOnLineStatus Dim cmdText As String = "select * from QueryOnLineStatus_View where @strCondition" '定义查询字符串(strCondition为UI层传过来的查询条件)Dim cmdType As CommandType = CommandType.Text '定义命令类型Dim sqlHelper As New SqlHelper '实例化SqlHelper类Dim myList As List(Of Entity.QueryOnLineStatusViewEntity)Dim dtb As New DataTableDim parameters As SqlParameter()parameters = {New SqlParameter("@strCondition", strCondition)}dtb = sqlHelper.ExecuteSelect(cmdText, cmdType, parameters)myList = Entity.EntityHelper.ConvertToList(Of Entity.QueryOnLineStatusViewEntity)(dtb) 'EntityHelper.ConvertToList的功能是把DataTable类型转化为泛型集合Return myListEnd Function代码⾥SQL语句中的strCondition是从UI层传过来的查询条件,此发⽣错误时。

基于OSS云存储的考试系统的设计与实现

“sfzh ”
);
//
将认证信息写入 cookie 并设置跨域主域名
cookie.Value = username.Trim();
cookie.Domain =“***.com”

context.Response.Cookies.Add(cookie);
2.2
图 1 基于 OSS 云存储的考试系统设计框架
技术。
第6期
运现钦,等:基于 OSS 云存储的考试系统的设计与实现
DataTable dt = sqlhelper.gettable(
“select top 1 *
2 系统的构架设计与实现
2.1
29
from ks_user_info where [”+ txb1_zd +“]=
‘”+
系统的构架设计
,false,
<script>
var kaoshi_id=getCookie(
“kaoshi_id”
);
var shijuan_id = sjcanshu.shijuan[0].shijuan_id;
$.get (‘../js_shijuan/’ + kaoshi_id + ‘/’ +
shijuan_id +‘.txt’
“sfzh”
].ToString();
mm:ss”
)+“’,”+ kaoshi_id +“,
‘”+ shijuan_id +
context.Request[
“username”
].ToString();
string kaoshi_id =

iBATIS In Action:什么是iBATIS(一)

在上一章中我们详细讨论了iBATIS的哲学观,以及这个框架的来历。

我们也说过,iBATIS是一个混合式的解决方案(hybrid solution),借鉴了多种操作关系数据库的方法的理念。

那么iBATIS到底是什么呢?这一章就来回答这个问题。

iBATIS是一种data mapper。

Martin Fowler在他的《Patterns of Enterprise Application Architecture》一书中是这样描述Data Mapper的:一个映射层,在对象和数据库间传递数据,并保持两者与映射层本身相独立。

.注:Mapper是在两个独立对象间建立通信关系的一种对象。

Martin很好地区分了数据映射(Data Mapping)和元数据映射(Metadata Mapping),后者正是O/RM工具的依据,这种工具将数据库的表和列映射到应用程序中的类和字段(field),也就是说它将数据库的元数据映射到类的元数据。

图2.1显示了类和数据库表的O/R 映射的情形。

在这种情况下,类的每个字段映射到了表中的一个相应的列。

译注:在C#中通常在类的属性(Property)与表的列间进行映射。

iBATIS则与之不同,它不是直接在类与数据表或字段与列之间进行关联,而是把SQL语句的参数(parameter)和返回结果(result)映射至类。

在本书的剩余部分您将看到,iBATIS是处于类和数据表之间的一个中间层,这使得它在类和数据表之间进行映射时更加灵活,而不需要数据库模型或对象模型(object model)的任何修改。

我们所说的中间层实际上就是SQL,它使得iBATIS能够更好地分离数据库和对象模型的设计,这样就相对减少了两者间的耦合。

图2.2说明了iBATIS如何使用SQL映射数据。

从图2.2可以看到,iBATIS的映射层正是SQL。

您只管写您的SQL,iBATIS会为您处理类的属性和数据表的列之间的映射。

上传图片后使用数据库保存图片的示例分享

这篇文章主要介绍了上传图片后使用数据库保存图片的示例,需要的朋友可以参考下代码如下:HttpPostedFile UpFile = File1.PostedFile;int FileLenght = UpFile.ContentLength;decimal FileSize = FileLenght / 1024;if (FileLenght == 0){DIVShowGVError.Visible = true;LblShowGVError.Text = "请选择上传文件";return;}string strImageName = UpFile.FileName;string strImageType = strImageName.Substring(stIndexOf(".")).ToLower();if (strImageType != ".jpg" &amp;&amp; strImageType != ".jpeg" &amp;&amp; strImageType != ".bmp" &amp;&amp; strImageType != ".png"){DIVShowGVError.Visible = true;LblShowGVError.Text = "請上傳以下文件格式的圖片:jpg,jpeg,bmp,png";return;}if (FileSize &gt; 2048){DIVShowGVError.Visible = true;LblShowGVError.Text = "上傳圖片不能大於2M";return;}else{Byte[] FileByteArray = new Byte[FileLenght];Stream StreamObject = UpFile.InputStream;StreamObject.Read(FileByteArray, 0, FileLenght);strNewLeave = "insert into [Leave]([ID],[EmployeeNo],[AgentID],[LeaveType],[StartDate],[EndDate],[Hours],[LeaveR eason],[ReportTime],[ReportID],[ImageName],[ImageData]) ";strNewLeave += "values(@LeaveNo,@EmpNo,@AgentName,@LeaType,@StartDate,@EndDate,@Hours,@Reas on,getdate(),@Admin,@ImageName,@Image) ";sqlPara = new SqlParameter[] {new SqlParameter("@LeaveNo",strLeaNo),new SqlParameter("@EmpNo",strEmpNo),new SqlParameter("@AgentName",strAgentID),new SqlParameter("@LeaType",strLeaType),new SqlParameter("@StartDate",strDateSt),new SqlParameter("@EndDate",strDateEnd),new SqlParameter("@Hours",strHours),new SqlParameter("@Reason",strReason),new SqlParameter("@Admin",strAdmin),new SqlParameter("@ImageName",strImageName),new SqlParameter("@Image",FileByteArray)};StreamObject.Close();}代码如下:SQLHelper sqlH = new SQLHelper();string strID = context.Request["ID"];byte[] MyData = new byte[0];string str = " select [ImageData] from [Leave] where [ID]='" + strID + "' "; DataTable dt = sqlH.ExecuteQuery(str, CommandType.Text);if (dt.Rows.Count &gt; 0){MyData = (byte[])dt.Rows[0][0];int ArraySize = MyData.GetUpperBound(0);context.Response.OutputStream.Write(MyData, 0, ArraySize);}更多信息请查看IT技术专栏。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

using System; using System.Data; using System.Xml; using System.Data.SqlClient; using System.Collections;

namespace MyWeb.DataProvider { /// /// The SqlHelper class is intended to encapsulate high performance, scalable best practices for /// common uses of SqlClient /// public sealed class SqlHelper {

/// /// 连接字符串 ///

// 暂不加密。 private static string CONN_STRING = System.Configuration.ConfigurationManager.ConnectionStrings[ "CnStr" ].ToString();

// 用户缓存参数。 private static Hashtable parmCache = Hashtable.Synchronized( new Hashtable() );

/// /// 使用默认连接, 执行SQL语句,仅仅返回数据库受影响行数。 /// 所需参数:命令文本,参数列表。 /// /// 命令文本 /// 参数列表 /// public static int ExecuteNonQuery( string cmdText, params SqlParameter[] cmdParms ) { SqlCommand cmd = new SqlCommand();

using( SqlConnection conn = new SqlConnection( CONN_STRING ) ) { PrepareCommand( cmd, conn, null, CommandType.Text, cmdText, cmdParms ); int val = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); return val; } } /// /// 使用默认连接, 执行SQL语句,仅仅返回数据库受影响行数。 /// 所需参数:命令文本,参数列表。 /// /// 命令文本 /// 参数列表 /// public static int ExecuteNonQuery( string cmdText, CommandType commandType, params SqlParameter[] cmdParms ) { SqlCommand cmd = new SqlCommand();

using( SqlConnection conn = new SqlConnection( CONN_STRING ) ) { PrepareCommand( cmd, conn, null, commandType, cmdText, cmdParms ); int val = cmd.ExecuteNonQuery(); conn.Close(); cmd.Parameters.Clear(); return val; } }

/// /// 执行一个sql命令,仅仅返回数据库受影响行数。 /// 所需参数:连接字符串,命令类型,命令文本,参数列表。 /// /// 连接字符串 /// 命令类型 /// 命令文本 /// 参数列表 /// 数据库受影响行数 public static int ExecuteNonQuery( string connString, CommandType cmdType, string cmdText, params SqlParameter[] cmdParms ) { SqlCommand cmd = new SqlCommand();

using( SqlConnection conn = new SqlConnection( connString ) ) { PrepareCommand( cmd, conn, null, cmdType, cmdText, cmdParms ); int val = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); return val; } }

/// /// 执行一个sql命令,仅仅返回数据库受影响行数。 /// 所需参数:连接对象,命令类型,命令文本,参数列表。 /// /// 连接对象 /// 命令类型 /// 命令文本 /// 参数列表 /// 数据库受影响行数 public static int ExecuteNonQuery( SqlConnection conn, CommandType cmdType, string cmdText, params SqlParameter[] cmdParms ) { SqlCommand cmd = new SqlCommand();

PrepareCommand( cmd, conn, null, cmdType, cmdText, cmdParms ); int val = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); return val; }

/// /// 执行一个sql命令,仅仅返回数据库受影响行数。(用于需要事务的情况) /// 所需参数:事务对象,命令类型,命令文本,参数列表。 /// /// 事务对象 /// 命令类型 /// 命令文本 /// 参数列表 /// 数据库受影响行数 public static int ExecuteNonQuery( SqlTransaction trans, CommandType cmdType, string cmdText, params SqlParameter[] cmdParms ) { SqlCommand cmd = new SqlCommand(); PrepareCommand( cmd, trans.Connection, trans, cmdType, cmdText, cmdParms ); int val = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); return val; }

/// /// 执行一个sql查询语句,返回DataReader对象。使用默认连接。 /// 所需参数:命令文本,参数列表。 /// /// /// /// public static SqlDataReader ExecuteReader( string cmdText, params SqlParameter[] cmdParms ) { SqlCommand cmd = new SqlCommand(); SqlConnection conn = new SqlConnection( CONN_STRING );

// 此处使用try/catch的原因:当出现异常时,也可以保证能关闭连接。 try { PrepareCommand( cmd, conn, null, CommandType.Text, cmdText, cmdParms ); SqlDataReader rdr = cmd.ExecuteReader( CommandBehavior.CloseConnection ); cmd.Parameters.Clear(); return rdr; } catch { conn.Close(); throw; } }

/// /// 执行一个sql查询命令,返回DataReader对象。 /// 所需参数:连接字符串,命令类型,命令文本,参数列表。 /// /// 连接字符串 /// 命令类型 /// 命令文本 /// 参数列表 /// 查询的结果 DataReader对象 public static SqlDataReader ExecuteReader( string connString, CommandType cmdType, string cmdText, params SqlParameter[] cmdParms ) { SqlCommand cmd = new SqlCommand(); SqlConnection conn = new SqlConnection( connString );

// 此处使用try/catch的原因:当出现异常时,也可以保证能关闭连接。 try { PrepareCommand( cmd, conn, null, cmdType, cmdText, cmdParms ); SqlDataReader rdr = cmd.ExecuteReader( CommandBehavior.CloseConnection ); cmd.Parameters.Clear(); return rdr; } catch { conn.Close(); throw; } } ///

相关文档
最新文档