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. ...
随机推荐
- 学习笔记—log4j2
概念 什么是日志 日志是系统运行过程中的后台输出信息,方便程序员进行系统运行的管控以及Bug的查找. log4j2的概念 log4j2是一个日志输出的插件,专门用来进行日志的管理. Log4j是Apa ...
- H5、C3、ES6的新特性
H5的新特性 1.语义化标签 有利于SEO,有助于爬虫抓取更多的有效信息,爬虫是依赖于标签来确定上下文和各个关键字的权重. 语义化的HTML在没有CSS的情况下也能呈现较好的内容结构与代码结构 方便其 ...
- Spring注解AOP及单元测试junit(6)
2019-03-10/20:19:56 演示:将xml配置方式改为注解方式 静态以及动态代理推荐博客:https://blog.csdn.net/javazejian/article/details/ ...
- vue中使用百度地图,悬浮窗搜索功能
https://www.cnblogs.com/shuaifing/p/8185311.html 侵删 <template> <div id="all"> ...
- 解决在圆角手机(如小米8)上自定义Dialog无法全屏的问题
在小米8等一系列圆角的手机上测试项目时,发现我的自定义dialog无法全屏了,这时我的dialog全屏的解决方案还是和网上大部分人是一样的 Window window = getWindow(); i ...
- Linux系统上Nginx服务器的安装与配置
前言: 详细步骤移步菜鸟教程 一. 安装Nginx,注意虚拟机与宿主机的网络连通性 l 安装编译工具及库文件(zlib库. ssl) yum -y install make zlib zlib-de ...
- 纯Java实现微信朋友圈分享图
纯Java实现微信朋友圈分享图 1.实现分享图的效果 2.开发环境 2.1 JDK * oracle's jdk 1.8以上 2.2 字体 * 若选择了微软雅黑字体又是代码部署到Linux,则需要安装 ...
- Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式
Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式 目录 Pycharm使用技巧(转载) Python第一天 安装 shell 文件 Py ...
- redis -list
列表的元素类型为string 按照插入顺序排序 增加: 例如: 从列表的 左侧 加入数据 a b c lpush 键 a b c 显示:1“c"2"b"3"c& ...
- vue(6)—— vue中向后端异步请求
异步请求 其实什么是异步请求已经不用多说了,通俗的说,就是整个页面不会刷新,需要更新的部分数据做局部刷新,其他数据不变. 学到这里,你应该用过jquery里的ajax了,所以很能理解了,不多说了.详细 ...