如果说C++是面向对象的编程的话,这阵子摸索学习C#发现C#更是面向对象的编程,它连主函数都写在了类里。
SQLite数据库
以下方法都写在类中,这里我建了一个名为SQLiteHelper的类,并编写了以下代码
1 C#中的SQLite数据库连接和操作的方法
//声明一个连接串
private string ConnectionString = "";//为什么是private呢 因为不想被随便修改
//对连接串进行初始化
public void InitConnectionString(string path, string password="")
{
if (string.IsNullOrEmpty(password)||password.Equals(""))
{
this.ConnectionString = "Data Source=" + path;
}
else
{
this.ConnectionString = "Data Source=" + path + ";Password=" + password;
}
}
//System.Object(object)是所有类的基类,
//使用params object数组来声明一个方法,
//它能接受任意数量的object参数;这样就可以让参数的数量任意的,参数的类型任意
//这里进行SQL语句的处理 注意前面加了修饰符private 只能在本类中使用。
//调用的时候直接在类方法中使用函数名+参数就可以了
private void PrepareCommand(SQLiteCommand cmd, SQLiteConnection conn, string cmdText, params object[] p)
{
if (conn.State != ConnectionState.Open)
conn.Open();
cmd.Parameters.Clear();
cmd.Connection = conn;
cmd.CommandText = cmdText;
cmd.CommandType = CommandType.Text;
cmd.CommandTimeout = 30;
if (p != null)
{
foreach (object parm in p)
cmd.Parameters.AddWithValue(string.Empty, parm);
}
}
//执行sql语句,上述命令预处理方法就是如下的方式直接在类里调用
public int ExecuteNonQuery(string cmdText, params object[] p)
{
using (SQLiteConnection conn = new SQLiteConnection(ConnectionString))
{
using (SQLiteCommand command = new SQLiteCommand())
{
PrepareCommand(command, conn, cmdText, p);
return command.ExecuteNonQuery();
}
}
}
//除了执行sql语句之外还有读数据的功能如下 返回值是一个SQLiteDataReader类型的要注意及时关闭(close)此变量,否则程序会爆出数据库锁定(database is locked)
public SQLiteDataReader ExecuteReaderA(string cmdText)
{
SQLiteConnection conn = new SQLiteConnection(ConnectionString);
if (conn.State != ConnectionState.Open)
conn.Open();
SQLiteCommand command = new SQLiteCommand();
command = conn.CreateCommand();
command.CommandText = cmdText;
return command.ExecuteReader();
}
2 C#中如何使用上述方法实现数据库操作
//在主类中声明一个SQLiteHelper 对象
private SQLiteHelper sqliteHelper = new SQLiteHelper();
//对这个对象进行初始化
//获取你的数据库
string dbFile = System.Environment.CurrentDirectory + "\\你的数据库.db";
//将数据库初始化给数据库对象
sqliteHelper.InitConnectionString(dbFile);
//增删改操作类似
//增加删除
string insertSql = string.Format("insert into t_data (sampleLotNo,pieceNo,bundleWt,matThick,matNum,weightNo,prodDate,weightTime,createtime) values ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}')","","","","","","","","","");
sqliteHelper.UpdateDataBySQL(insertSql);
//修改
string updateSql = string.Format("update 表名 set token='{0}',createtime='{1}',status='{2}',deadline='{3}'", "字段1", "字段2", "字段3", "字段4");
sqliteHelper.ExecuteNonQuery(updateSql);
//查询
string selectSql = "select * from 表名";
SQLiteDataReader reader = sqliteHelper.ExecuteReaderA(selectSql);
reader.Read();//执行完上述查询表操作后,现在数据流指针在数据的前一个位置,需要挪动到数据的位置
DateTime time = Convert.ToDateTime(reader["字段名"]);//获取日期类型的数据
string str =Convert.ToString( reader["字段名"]);//获取字符串类型的数据
reader.Close();//读数据流需要关闭,不然再次对数据库进行操作会报错
C# WebAPI
1 编写服务端
创建一个项目
按照如下步骤创建好.ashx新建项,此项即为以后处理客户端请求的网页地址
在处理请求的文件里写入处理程序,以下就是我自己随便写的内容
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Newtonsoft.Json;
using testWebAPI.Models;
using System.IO;
namespace testWebAPI
{
/// <summary>
/// APIResponse 的摘要说明
/// </summary>
public class APIResponse : IHttpHandler
{
public void ProcessRequest(HttpContext context) //传导体 --外部与应用程序之间传导的导体是HttpContext
{
context.Response.ContentType = "text/plain";//HttpContext.Response.ContentType 用来设置HTTP的内容类型
HttpRequest clientRequest = context.Request;
string type= clientRequest.Params.Get("type");
//以下代码获取请求的内容
byte[] byts = new byte[HttpContext.Current.Request.InputStream.Length];
HttpContext.Current.Request.InputStream.Read(byts, 0, byts.Length);
string req = System.Text.Encoding.UTF8.GetString(byts);//编码类型按实际需求
#region 关于返回类型的注释
/* "text/plain" 输出内容是没有格式的纯文本
* "text/html" 输出内容是HTML格式的文本
* "text/xml" 输出内容是xml格式的文本类型
* "image/jpeg" 输出内容是图片类型
* context.Response.Clear() 输出之前清空输出缓冲区
* context.Response.Flush() 把输出缓冲区的内容全部输出到客户端
*/
//string responseStr = "{\"code\":0,\"data\":{" +
// "\"sampleLotNo\":\"test\"," +
// "\"pieceNo\":\"2023\"," +
// "\"bundleWt\":\"09\"," +
// "\"matThick\":\"21\"," +
// "\"matNum\":\"zyzb\"," +
// "\"weightNo\":\"Web\"," +
// "\"prodDate\":\"API\"," +
// "\"wightTime\":\"14:34\"}}";
#endregion
#region 测试获取数据API
ReturnDataModel returnDataModel = new ReturnDataModel();
returnDataModel.code = 0;
DataModel dataModel = new DataModel();
dataModel.sampleLotNo = "test123456";
dataModel.pieceNo = "SG11111";
dataModel.bundleWt = "2556";
dataModel.matThick = "16";
dataModel.matNum = "110";
dataModel.weightNo = "0707";
dataModel.prodDate = "2023-9-20";
dataModel.weightTime = "2023-9-22 9:15";
returnDataModel.data = dataModel;
string responseJsonStr = JsonConvert.SerializeObject(returnDataModel);
context.Response.Write(responseJsonStr); //输出一个字符串 此语句用于测试获取数据API
#endregion
#region 测试获取Token API
ReturnTokenModel returnToken = new ReturnTokenModel();
returnToken.code = 0;
returnToken.token = "abc123ShaoGangTokenAPItest";
string responseTokenStr = JsonConvert.SerializeObject(returnToken);
//context.Response.Write(responseTokenStr); //输出一个字符串 此语句用于测试获取Token API
#endregion
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
右键项目->发布
会有选择发布位置的选项,自己找个本地的位置发布就可以了 ,然后找到IIS配置
搜索框直接搜索IIS
左侧右击网站->点击添加网站
ip地址为本机IP ,注意自己的电脑的IP如果不是固定的,那么每次开机后注意修改网站IP
修改网站IP的方法
要注意配置ASP .NET
根据自己的asp .NET版本安装 我这里是4.0 在下图路径下输入 aspnet_regiis -i命令进行安装
点击右侧
如果出现以下网页界面说明asp .NET 服务未勾选
在控制面板中找到如下图的程序界面(上述有相关寻找内容) ,勾选自己下载好的ASP .NET版本
出现以下界面表示成功
可以尝试用postman测试一下 服务端是否编写成功
2 客户端的相关代码
public static string HttpGetJsonAPI(string url)
{
try
{
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
webRequest.Method = "GET";
webRequest.ContentType = "application/json";
webRequest.Accept = "application/json";
// webRequest.Headers.Add("Authorization", GlobalVariable.NowLoginUser.JwtKey);
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
StreamReader reader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8);
String res = reader.ReadToEnd();
reader.Close();
return res.Trim();
}
catch (Exception ex)
{
return null;
}
}
public static string HttpPostJsonAPI(string uri, string parameters, string token = "")
{
try
{
byte[] bytes = Encoding.UTF8.GetBytes(parameters);//这里需要指定提交的编码
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
webRequest.Method = "POST";
webRequest.ContentType = "application/json";
webRequest.Accept = "application/json";
webRequest.Timeout = 2000;
webRequest.Headers.Add("token", token);
webRequest.ContentLength = bytes.Length;
Stream dataStream = webRequest.GetRequestStream();
dataStream.Write(bytes, 0, bytes.Length);
dataStream.Close();
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
StreamReader reader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8);
String res = reader.ReadToEnd();
reader.Close();
//return res.Trim();
return res;
}
catch (Exception ex)
{
LogHelper.SetSystemLog("请求服务异常:" + ex);
return null;
}
}
//以下两段代码为引用上述内容而按自己的要求编写
public static TokenModel GetTokenAPI(string url,string token)
{
string res = "";
RuCan ruCan = new RuCan();
ruCan.type = "getNewToken";
string jsonstr=JsonHelper.SerializeObject(ruCan);
res = HttpPostJsonAPI(url, jsonstr, token);
TokenModel tokenModel = new TokenModel();
if (res == ""||res==null)
{
tokenModel.code = -9;
}
else
{
tokenModel = JsonHelper.DeserializeJsonToObject<TokenModel>(res);
}
return tokenModel;
}
public static ReturnModel GetDataAPI(string url, string token)
{
string res;
RuCan ruCan = new RuCan();
ruCan.type = "getWeightData";
string jsonstr = JsonHelper.SerializeObject(ruCan);
res = HttpPostJsonAPI(url, jsonstr, token);
ReturnModel returnModel = new ReturnModel();
if (res == ""||res == null)
{
returnModel.code = -9;
}
else
{
//returnModel =JsonHelper.DeserializeJsonToObject<ReturnModel>(res);
returnModel = JsonConvert.DeserializeObject<ReturnModel>(res);
}
return returnModel;
}
}