1、基础
(1)配置文件app.config
在哪里要使用数据库就需要把这个贴到哪里,配置了连接字符串
<appSettings> <add key="connectionString" value="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=E:\project\vs2015_project\WinGis\DAL\App_Data\WinGis.mdf;Integrated Security=True;Connect Timeout=30"/> </appSettings>
(2)SQL语句
- $为转义字符串
- 当是固定的表名时直接用表名;
//表名是Layer,列名是Layer_ID,Layer_name string cmdText = $"select Layer_ID,Layer_name from Layer";
- 当插入一个值时,如果是int类型,用{}将该int型对象括起来{int},如果是字符串类型,用’{}’将该字符串类型对象括起来'{string}';
// LayerIdValue是int类型,LayerNameValue是string类型 string cmdText = $"insert into Layer values({layerIdValue},'{layerNameValue}',{layerTypeValue})";
- 当表名不固定时,[{tableName}],当列名不固定时,{colName}
// tableName是string类型,代表了可能的表名,colName是string类型,代表了可能的列名 string cmdText = $"delete from [{tableName}] where {colName}='{colValue}'";
(3)定义数据库类,读取数据
using System.Data.SqlClient; using System.Configuration; public class DataHelper { private SqlConnection _sqlConnection; public DataHelper() { //配置文件,连接字符串 string i = ConfigurationManager.AppSettings["connectionString"]; _sqlConnection = new SqlConnection(i); } public List<PointEx> GetPoints(int layerId) { this._sqlConnection.Open(); SqlCommand scmd = this._sqlConnection.CreateCommand(); string cmdText = $"select point.* from point, Layer_Point where Layer_Point.Layer_ID={layerId} AND point.Point_ID=Layer_Point.Point_ID;"; scmd.CommandText = cmdText; //在数据库中执行,一个函数字符串只能定义一个 var reader = scmd.ExecuteReader(); List<PointEx> ret = new List<PointEx>(); while (reader.Read()) { var pid = (int)reader.GetValue(0); var color = (string)reader.GetValue(1); color.Trim(); var color2 = System.Drawing.Color.FromArgb(Convert.ToInt32(color)); var size = (int)reader.GetValue(2); var type = (int)reader.GetValue(3); var point = (SqlGeometry)reader.GetValue(4); PointEx p = new PointEx() { Id = pid, Color = color2, Size = size, Point = new Point(Convert.ToInt32(point.STX.Value),Convert.ToInt32(point.STY.Value)), Type = type }; ret.Add(p); } this._sqlConnection.Close(); return ret; } }
2、存储并读取Color类型
颜色在数据库中存储类型为char(16),显示为一串数字(RGB值)。
读取时,添加头文件:Using System.Drawing;读转换句:Color color= System.Drawing.Color.FromArgb(Convert.ToInt32(CL));
//从数据库中读取颜色值 var color = (string)reader.GetValue(1); //Trim()删除字符串头部及尾部出现的空格 color.Trim(); //将color转换为Color类型 var color2 = System.Drawing.Color.FromArgb(Convert.ToInt32(color));
存储时,
//定义一个Color类型的对象 Color color= Color.AliceBlue; //将其转换为字符串类型,数据库中存储的就是这个str string str=color.ToArgb().ToString();
3、读取数据库geometry类型
- 首先需要在vs中安装Microsoft.SqlServer.Types10.50(可以在NuGet包中安装);
- 头文件引用:using Microsoft.SqlServer.Types;
- 获得数据库geometry对象存储的点对象:
//读取数据库的geometry对象 var point = (SqlGeometry)reader.GetValue(4); //将读取的对象转换为点对象,using System.Drawing Point = new Point(Convert.ToInt32(point.STX.Value),Convert.ToInt32(point.STY.Value));
- 获得数据库geometry对象存储的线对象:
//首先自己定义了一个Line类
//取出数据库geometry对象 var line = (SqlGeometry)reader.GetValue(3); //将该对象转换为字符串 var temp = line.ToString(); //转换为SqlGeometry对象 SqlGeometry geo = SqlGeometry.Parse(temp); //获得数量 int num = geo.STNumPoints().Value; for (int i = 1; i <= num; ++i) { //取出line的两个端点 SqlGeometry geo1 = SqlGeometry.Parse(geo.STPointN(i).ToString()); int x = Convert.ToInt32(geo1.STX.Value); int y = Convert.ToInt32(geo1.STY.Value); //坐标X point[i - 1].X = x; //坐标Y point[i - 1].Y = y; } Line p = new Line(point[0],point[1])();