kms访问数据库的方式(该篇只是作为个人笔记,不具有任何公共参考意图)
项目类型:winform
语言:C#
服务程序:webservice(webservice我本人也不了解,在下一章中会总结一下对它的概念的简单理解)
情景描述:简单创建一个窗体,实现学生信息(姓名、性别)的新增和查询
一、保存按钮下的事件:
private void btnSave_Click(object sender, EventArgs e)
{
try
{
List<SqlPara> list = new List<SqlPara>();
list.Add(new SqlPara("stuName",txtName.Text));
list.Add(new SqlPara("stuSex",txtSex.Text));
SqlParasEntity sps = new SqlParasEntity(OperType.Execute, "AddStudentInfo", list);
int result = SqlHelper.ExecuteNoQuery(sps);
if(result > )
{
MessageBox.Show("操作成功!");
return;
}
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
return;
}
}
二、创建方法中使用到的类(使用一个类库统一管理这些类型)
//参数对象
public class SqlPara
{
public string ParaName
{ get; set; }
public object ParaValue
{ get; set; }
public SqlPara(string n, object o)
{
this.ParaName = n;
this.ParaValue = o;
}
} //表示数据库操作类型
public enum OperType
{
Query = ,//查询 Execute = //执行
} //实例化对象(构造函数的重载,实现不同数据库操作的对象实例化)
public class SqlParasEntity
{
public OperType OperType
{ get; set; }
public string procedureName
{ get; set; }
public List<SqlPara> ParaList
{ get; set; }
public SqlParasEntity(OperType type, string proName, List<SqlPara> list)
{
OperType = type;
procedureName = proName;
ParaList = list;
}
public SqlParasEntity(OperType type,string proName)
{
OperType = type;
procedureName = proName;
}
}
三、第一大点中第九行的方法:int result = SqlHelper.ExecuteNoQuery(sps);
namespace DAL
{
public class SqlHelper
{
private static int ver = ;
public static int ExecuteNoQuery(SqlParasEntity ent)
{
int flag = ExecuteNoQuery(ent, ver);
return flag;
}
private static int ExecuteNoQuery(SqlParasEntity ent, int ver)
{
DataSet ds = new DataSet();
DataTable dt = new DataTable(ent.procedureName);
dt.Columns.Add("pname");
dt.Columns.Add("pvalue");
ds.Tables.Add(dt);
if (ent.ParaList == null)
{
List<SqlPara> list = new List<SqlPara>();
ent.ParaList = list;
}
foreach(var item in ent.ParaList)
{
if (item.ParaValue.GetType() == typeof(DataTable))
{
DataTable table = (item.ParaValue as DataTable).Copy();
table.TableName = item.ParaName;
ds.Tables.Add(table);
}
else
{
dt.Rows.Add(item.ParaName,item.ParaValue);
}
}
SqlResult result = new SqlResult();
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
SqlParasTable data = new SqlParasTable(ent.OperType,ds);
string json = JsonConvert.SerializeObject(data,settings);
result = HttpHelper.HttpPost(string.Format("ver={0}&json={1}",ver,json));
if (result.State == )
{
int count = ;
if (StringHelper.IsNumberId(result.Result))
{
count = Convert.ToInt32(result.Result);//这个为什么这样做
}
return count;
}
else
{
throw new Exception("返回信息:\r\n" + result.Result.Replace("数据库访问异常:","").Replace("错误信息","").Trim());
}
}
}
}
四、第三大点中41行代码方法:result = HttpHelper.HttpPost(string.Format("ver={0}&json={1}",ver,json));
1、先创建使用到的类型,三大点中36,39行
public class SqlResult
{
/// <summary>
/// sql执行返回状态:1成功,2失败
/// </summary>
public int State
{ get; set; } /// <summary>
/// 如果state是1,则返回结果集(DataSet);State=0,返回错误信息
/// </summary>
public string Result
{ get; set; }
} /// <summary>
/// 数据库操作提交参数
/// </summary>
public class SqlParasTable
{
public OperType OperType
{ get; set; } /// <summary>
/// 参数集合,表类型
/// <para>第一个 table 是简单的数据类型,键值类型</para>
/// <para>第二 table 放表类型的参数(例如批量导入数据时)</para>
/// </summary>
public DataSet ParasDataSet
{ get; set; }
public SqlParasTable(OperType type,DataSet ds)
{
OperType = type;
ParasDataSet = ds;
}
}
2、三大点中41行方法:
namespace DAL
{
class HttpHelper
{
public static string urlPage = "kms1.ashx";
// static string domain = "http://192.168.2.139:8090/";
static string domain = "http://localhost:28383/";
public static SqlResult HttpPost(string data)
{
string url = domain + urlPage;
SqlResult result = new SqlResult();
try
{
string json = "";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Proxy = null;
req.Method = "post";
req.ContentType = "application/x-www-form-urlencoded";
req.Timeout = ; byte[] btbody = Encoding.UTF8.GetBytes(data);
req.ContentLength = btbody.Length;
using (Stream st = req.GetRequestStream())
{
st.Write(btbody, , btbody.Length);
st.Close();
st.Dispose();
}
WebResponse wr = req.GetResponse();
using (StreamReader sr = new StreamReader(wr.GetResponseStream()))
{
json = sr.ReadToEnd();
sr.Close();
sr.Dispose();
}
wr.Close();
result = JsonConvert.DeserializeObject<SqlResult>(json);
}
catch (WebException ex)
{
result.State = ;
result.Result = "远程访问错误,\r\n" + ex.Message;
}
catch (Exception ex)
{
result.State = ;
result.Result = ex.Message;
}
return result;
}
}
}
章结尾:上面的数据库访问失败了。公司项目代码是这样的逻辑,但我没有使用过webservice服务,想自己搭建然后访问,但是没有成功。
上面的内容供自己参考一下数据传输的设计理念,后面要掌握一下webservice服务,实现数据访问
查询的操作方式和上面基本一致,将数据库放回结果转换为自己想要的数据类型即可(DataSet)
kms访问数据库的方式(该篇只是作为个人笔记,不具有任何公共参考意图)的更多相关文章
- c#连接访问数据库(菜鸡篇)
C#如何访问数据库(小白篇) 刚入坑不久学习的路上还是遇到了不小的问题,昨天学习C#的时候需要连接数据库获取数据. 网上有很多这样的文章,说实话对于我这样的小白还真是有点难理解,经过一番周折总算是了解 ...
- Spring访问数据库(方式上跟HQL类似,每行记录映射一个实体类)
看了这篇技术博客,觉得收获较大,收藏了:http://sarin.iteye.com/blog/875915
- ADO.NET基础01(ADO.NET组成,数据库的方式,SqlCommand,SqlDataReader)
什么是ADO.NET: ADO.NET就是一组类库,这组类库可以让我们通过程序的方式访问数据库,就像System.IO下的类操作文件一样, System.Data.这组类是用来操作数据库(不光是MSS ...
- Spring Boot入门(六):使用MyBatis访问MySql数据库(注解方式)
本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 本篇博客我们讲解下在Spring Boot中使用MyBatis访问MySql数据库的简单用法. 1.前期 ...
- 非链接方式访问数据库--查询的数据集用Dataset来存储。
private void Button_Click_1(object sender, RoutedEventArgs e) { //非链接方式访问数据库, //1创建连接对象(连接字符串) using ...
- ADO.NET 连接方式和非链接方式访问数据库
一.//连接方式访问数据库的主要步骤(利用DataReader对象实现数据库连接模式) 1.创建连接对象(连接字符串) SqlConnection con = new SqlConnection(Co ...
- php 面向对象的方式访问数据库
<body> <?php //面向对象的方式访问数据库 //造对象 $db = new MySQLi("localhost","root",& ...
- ASP.NET MVC- EF返回连接池用ADO.NET方式访问数据库
用习惯了ADO.NET的方式去访问数据库,虽然ADO.NET写的代码没有EF简洁,可是也并不麻烦.而且EF在进行多表查询的那种方式是,EF需要先去数据库里定义外键,再进去一次代码生成,然后才能用INC ...
- Jdbc访问数据库篇
一万年太久,只争朝夕 What JDBC 上部 JDBC(Java DataBase Connectivity)Java 数据库连接,主要提供编写 Java 数据库应用程序的 API 支持 java. ...
随机推荐
- 责任链模式 职责链模式 Chain of Responsibility Pattern 行为型 设计模式(十七)
责任链模式(Chain of Responsibility Pattern) 职责链模式 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系 将这些对象连接成一条链,并沿着这 ...
- Spring MVC(二)基于标注的MVC
1.基于标注的Spring MVC 1.1 建立一个项目导入jar包(ioc aop mvc) 拷贝容器对应的配置文件到src下 在WEB-INF建立一个login.jsp 1.2 在web.xml ...
- vue框架入门和ES6介绍
vue框架入门和ES6介绍 vue-mvvm模式,vue是一种轻量级的前端框架,主要为模板渲染,数据同步,组件化,模块化,路由等. https://cn.vuejs.org/ 源码:https://g ...
- 日志分析工具Log Parser介绍
摘要: 微软动态CRM专家罗勇 ,回复321或者20190322可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! 分析Dynamics 365 Customer Enga ...
- typescript中的接口
说到接口:在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用.接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心 ...
- 一起学Android之Intent
本文简述在Android开发中Intent的常见应用,仅供学习分享使用. 什么是Intent? Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Inten ...
- Java:配置环境(Mac)——Eclipse;修改JDK版本后,Eclipse打不开
1.官网下载 选择一个速度快的镜像 推荐东软这个 2.双击下载的安装包,下一步 其中有一步是选择Eclipse版本,SE选第一个,EE第二个.仔细审题吧. 3.配置JDK 应用.关闭 4.测试:写个H ...
- Python Learning: 03
An inch is worth a pound of gold, an inch of gold is hard to buy an inch of time. Slice When the sca ...
- 自反ACL(第三组)
一.实验拓扑 二.配置过程 此处我用了学号后两位来划分网段,注意:先把网络做通再配ACL 1)网络连通测试 内网可以telnet外网 ----------- 外网可以telnet内网 2)ACL配置( ...
- 浏览器仿EXCEL表格插件 版本更新 - 智表ZCELL产品V1.3.1更新
智表(zcell)是一款浏览器仿excel表格jquery插件.智表可以为你提供excel般的智能体验,支持双击编辑.设置公式.设置显示小数精度.下拉框.自定义单元格.复制粘贴.不连续选定.合并单元格 ...