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. ...
随机推荐
- canvas动态图标
前言 canvas 强大的功能让它成为了 HTML5 中非常重要的部分,至于它是什么,这里就不需要我多作介绍了.而可视化图表,则是 canvas 强大功能的表现之一. 现在已经有了很多成熟的图表插件都 ...
- 在chrome 怎么通过ajax请求加载本地文件
在chrome下面用Jquery 的load方法加载本地的html文件时会报错 我百度了一下是因为 谷歌浏览器内核为了安全机制,不允许这样方式访问其他页面,但是可以通过加 --enable-file- ...
- 【转】Dockerfile详解
Dockerfile详解 https://blog.csdn.net/wo18237095579/article/details/80540571 --------------------- 作者:大 ...
- Win 10 和 Ubuntu 16.04 双系统,安装完成后,设置默认的启动项
当安装好了 Windows 和 Ubuntu 双系统之后,默认的启动项是 Ubuntu,我们可以来设置默认的启动项, 开机时,在启动项选择处,可以通过↑↓ 键来选择启动哪个系统,第一行序号是 0 ,第 ...
- memcached 学习
memcached 是什么 特点 协议简单 基于 libevent 的事件处理 内置内存存储方式 memcached 不互相通信的分布式 启动 安装 依赖 libevent 安装命令 下载地址在这个网 ...
- git简单提交操作
一.本地仓库操作 1.打开git命令行,先'到需要提交的目录 2.输入git init,初始化本地仓库 3.输入git add <file> 命令添加提交文件 4.输入git status ...
- JVM内存结构简单认知
关于JVM的面试传送门:https://blog.csdn.net/shengmingqijiquan/article/details/77508471 JVM内存结构主要划分为:堆,jvm栈,本地方 ...
- Core官方DI剖析(1)--ServiceProvider类和ServiceCollection类
前段时间看了蒋老师的Core文章,对于DI那一块感觉挺有意思,然后就看了一下Core官方DI的源码,这也算是第一个看得懂大部分源码的框架,虽然官方DI相对来说特别简单, 官方DI相对于其它框架(例如 ...
- Java8-2-Lambda表达式实战-一句话实现Map中按照Value排序
在上一讲中, 我们着重的讲了表达式的一些基础知识和基本的使用, 今天我们来实战一把, 对Map的Value值排序进行简化. 在以前的思路我们的做法如下: /** * * Map根据value排序; * ...
- 03-MySQL表操作
MySQL表操作 1.介绍 表就相当于文件,表中的一条记录就相当与文件的一行内容,不同的是,表中的一条记录有对应的标题,成为表的字段. 2.创建表 2.1语法 create table 表名( 字段名 ...