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. ...
随机推荐
- Python二级-----------程序冲刺1
1. 仅使用 Python 基本语法,即不使用任何模块,编写 Python 程序计算下列数学表达式的结果并输出,小数点后保留3位. ...
- Ext.isNumber与Ext.isNumeric
Ext.isNumber: Ext.isNumber(1) true Ext.isNumber(new Number(1)) false Ext.isNumber("1") fal ...
- RabbitMQ for Mac OS Install
使用brew来安装 RabbitMQ brew install rabbitmq 执行看到如下命令: Updating Homebrew... ==> Auto-updated Homebrew ...
- Neo4j 全文检索
全文检索基本概念 搜索 搜索这个行为是用户与搜索引擎的一次交互过程,用户需要找一些数据,他提供给搜索引擎一些约束条件.搜索引擎通过约束条件抽取一些结果给用户 搜索引擎 搜索引擎存在的目的是存储,查找和 ...
- php连接数据库,以及日期处理函数
php连接数据库,以及日期处理函数 $conn=mysql_connect("10.0.10.0:0000","root","123456" ...
- socket.io 出现的WebSocket is closed before the connection is established
WebSocket is closed before the connection is established 最近socket.io是挺流行的,幼麟棋牌和一些好的开源项目也使用这个框架,在搭建其平 ...
- windows最简单的局部截图工具
大家写博客的时候应该经常要用截图吧!不知道大家用的都是什么截图工具. 1.最开始我只会键盘的printscreen截图,然后去电脑,附件,画图....总之很多步骤,贼麻烦. 2.然后用电脑玩qq的时候 ...
- java8 list转map,list集合中的元素的属性转set,list集合中对象的属性转list
一.使用java8对list操作 1.1list转map private Map<String, Member> getMemberMap() { List<Member> m ...
- Troubleshooting 'library cache: mutex X' Waits. (Doc ID 1357946.1)
In this Document Purpose Troubleshooting Steps What is a 'library cache: mutex X' wait? What ...
- MongoDB索引基本操作
一.简介 在MongoDB建立索引能提高查询效率,只需要扫描索引只存储的这个集合的一小部分,并只把这小部分加载到内存中,效率大大的提高,如果没有建立索引,在查询时,MongoDB必须执行全表扫描,在数 ...