说明:本人完成的工作是对传感器--超声波物位计进行硬件集成,上位机通过串口接收传感器数据并将其存到数据库中;在DAL层实现对数据库的增删改查,其中包含两个数据表分别是WaterLevelSet表和WaterLevelRecord表,以下代码即是完成对两张表进行数据操作。

 /*----------------------------------------------------------------
// Copyright (C) 2013 *************
// 版权所有。
//
// 文件名:WaterLevelDao.cs
// 文件功能描述:定义水位计设置信息相关的数据访问对象
//
// 创建标识:2013-9-22
//
// 修改标识:2013-9-23
// 修改描述:添加GetAllWaterLevelSetInfo,AddWaterLevelSetInfo,
//ModifyWaterLevelSetInfo,DelWaterLevelSetInfo等方法
//
// 修改标识:2013-9-24
// 修改描述:修改可空字段的数据绑定
//修改标识:2013-9-26
// 修改描述:修改AddWaterLevelSet,去掉SELECT @@IDENTITY
//
//----------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SMOS.Model.Device;
using System.Data.SqlClient;
using System.Data; namespace SMOS.DAL.Device
{
public class WaterLevelSetDao
{
/// <summary>
/// 根据设备ID获取水位计设置信息
/// </summary>
/// <param name="deviceID"></param>
/// <returns>水位计设置信息</returns>
public WaterLevelSetInfo GetWaterLevelSetInfo(int deviceID)
{
string sql =
@"select t.DeviceID,t.BaseLevel,t.Remark,t.Port,
t.BaudRate,t.DataBites,t.ParityBit,t.StopBits,t.AcquisitionInterval,
t.ConnectType,t.CreateBy,t.CreateTime,t.UpdateBy,t.UpdateTime
from dbo.WaterLevelSet t(nolock)
where t.DeviceID=@DeviceID"; IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@DeviceID",SqlDbType.Int){Value = deviceID}
}; WaterLevelSetInfo entity = null;
DataSet ds = DBHelper.ExecuteDataset(sql,paras.ToArray()); if (ds == null || ds.Tables.Count <= || ds.Tables[].Rows.Count <= )
return entity;
return DataRowBinding(ds.Tables[].Rows[]);
}
/// <summary>
/// 获取所有水位计设置信息
/// </summary>
/// <returns>水位计设置列表</returns>
public IList<WaterLevelSetInfo> GetAllWaterLevelSetInfo()
{
string sql =
@"select t.DeviceID,t.BaseLevel,t.Remark,t.Port,
t.BaudRate,t.DataBites,t.ParityBit,t.StopBits,t.AcquisitionInterval,
t.ConnectType,t.CreateBy,t.CreateTime,t.UpdateBy,t.UpdateTime
from dbo.WaterLevelSet t(nolock)
where 1=1";
IList<WaterLevelSetInfo> lstWaterLevelSetInfo = new List<WaterLevelSetInfo>();
DataSet ds = DBHelper.ExecuteDataset(sql);
if (ds == null || ds.Tables.Count <= )
return lstWaterLevelSetInfo;
foreach (DataRow dr in ds.Tables[].Rows)
{
WaterLevelSetInfo entity = DataRowBinding(dr);
if (entity != null)
lstWaterLevelSetInfo.Add(entity);
}
return lstWaterLevelSetInfo;
}
/// <summary>
/// 增加水位计设置信息
/// </summary>
/// <param name="waterLevelSetInfo">水位计设置信息</param>
/// <returns>操作记录数</returns>
public int AddWaterLevelSetInfo(WaterLevelSetInfo waterLevelSetInfo)
{
if (waterLevelSetInfo == null)
{
return ;
}
string sql=
@"INSERT INTO dbo.WaterLevelSet
(DeviceID,BaseLevel,Remark,Port,BaudRate,
DataBites,ParityBit,StopBits,AcquisitionInterval,
ConnectType,CreateBy,CreateTime
)
VALUES
(@DeviceID,@BaseLevel,@Remark,@Port,@BaudRate,
@DataBites,@ParityBit,@StopBits,@AcquisitionInterval,
@ConnectType,@CreateBy,@CreateTime
)";
IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@DeviceID",SqlDbType.Int){Value = waterLevelSetInfo.DeviceID},
new SqlParameter("@BaseLevel",SqlDbType.Decimal){Value = waterLevelSetInfo.BaseLevel},
new SqlParameter("@Remark",SqlDbType.NVarChar,){Value = waterLevelSetInfo.Remark},
new SqlParameter("@Port",SqlDbType.Int){Value = waterLevelSetInfo.Port},
new SqlParameter("@BaudRate",SqlDbType.Int){Value = waterLevelSetInfo.BaudRate},
new SqlParameter("@DataBites",SqlDbType.Int){Value = waterLevelSetInfo.DataBits},
new SqlParameter("@ParityBit",SqlDbType.Int){Value = waterLevelSetInfo.ParityBit},
new SqlParameter("@StopBits",SqlDbType.Int){Value = waterLevelSetInfo.StopBits},
new SqlParameter("@AcquisitionInterval",SqlDbType.Int){Value = waterLevelSetInfo.AcquisitionInterval},
new SqlParameter("@ConnectType",SqlDbType.TinyInt){Value = waterLevelSetInfo.ConnectType.GetHashCode()},
new SqlParameter("@CreateBy",SqlDbType.NVarChar,){Value = Global.GlobalInfo.loginInfo.LoginAccount},
new SqlParameter("@CreateTime",SqlDbType.DateTime){Value = DateTime.Now},
}; return DBHelper.ExecuteNonQuery(sql, paras.ToArray());
}
/// <summary>
/// 修改水位计设置信息
/// </summary>
/// <param name="waterLevelSetInfo">水位计设置信息</param>
/// <returns>操作记录</returns>
public int ModifyWaterLevelSetInfo(WaterLevelSetInfo waterLevelSetInfo)
{
if (waterLevelSetInfo == null)
{
return ;
}
string sql =
@"UPDATE dbo.WaterLevelSet
SET DeviceID=@DeviceID
,BaseLevel=@BaseLevel
,Remark=@Remark
,Port=@Port
,BaudRate=@BaudRate
,DataBites=@DataBites
,ParityBit=@ParityBit
,StopBits=@StopBits
,AcquisitionInterval=@AcquisitionInterval
,ConnectType=@ConnectType
,UpdateBy=@UpdateBy
,UpdateTime=@UpdateTime
WHERE DeviceID=@DeviceID";
IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@DeviceID",SqlDbType.Int){Value = waterLevelSetInfo.DeviceID},
new SqlParameter("@BaseLevel",SqlDbType.Decimal){Value = waterLevelSetInfo.BaseLevel},
new SqlParameter("@Remark",SqlDbType.NVarChar,){Value = waterLevelSetInfo.Remark},
new SqlParameter("@Port",SqlDbType.Int){Value = waterLevelSetInfo.Port},
new SqlParameter("@BaudRate",SqlDbType.Int){Value = waterLevelSetInfo.BaudRate},
new SqlParameter("@DataBites",SqlDbType.Int){Value = waterLevelSetInfo.DataBits},
new SqlParameter("@ParityBit",SqlDbType.Int){Value = waterLevelSetInfo.ParityBit},
new SqlParameter("@StopBits",SqlDbType.Int){Value = waterLevelSetInfo.StopBits},
new SqlParameter("@AcquisitionInterval",SqlDbType.Int){Value = waterLevelSetInfo.AcquisitionInterval},
new SqlParameter("@ConnectType",SqlDbType.TinyInt){Value = waterLevelSetInfo.ConnectType.GetHashCode()},
new SqlParameter("@UpdateBy",SqlDbType.NVarChar,){Value = Global.GlobalInfo.loginInfo.LoginAccount},
new SqlParameter("@UpdateTime",SqlDbType.DateTime){Value = DateTime.Now},
};
return DBHelper.ExecuteNonQuery(sql, paras.ToArray());
}
/// <summary>
/// 删除水位计设置信息
/// </summary>
/// <param name="waterLevelSetInfo">水位计设置信息</param>
/// <returns>操作记录</returns>
public int DelWaterLevelSetInfo(WaterLevelSetInfo waterLevelSetInfo)
{
if (waterLevelSetInfo == null)
{
return ;
}
string sql =
@"DELETE FROM dbo.WaterLevelSet
WHERE DeviceID = @DeviceID";
IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@DeviceID",SqlDbType.Int){Value = waterLevelSetInfo.DeviceID },
}; return DBHelper.ExecuteNonQuery(sql, paras.ToArray());
}
#region 数据绑定
private WaterLevelSetInfo DataRowBinding(DataRow dr)
{
if (dr == null)
{
return null;
} WaterLevelSetInfo entity = new WaterLevelSetInfo();
entity.DeviceID = Convert.ToInt32(dr["DeviceID"]);
entity.BaseLevel = Convert.ToDecimal(dr["BaseLevel"]); if (dr["Remark"] != DBNull.Value)
{
entity.Remark = dr["Remark"].ToString();
}
else
{
entity.Remark = string.Empty;
}
entity.Port = Convert.ToInt32(dr["Port"]);
entity.BaudRate = Convert.ToInt32(dr["BaudRate"]);
if (dr["DataBites"] != DBNull.Value)
{
entity.DataBits = Convert.ToInt32(dr["DataBites"]);
}
if (dr["ParityBit"] != DBNull.Value)
{
entity.ParityBit = Convert.ToInt32(dr["ParityBit"]);
}
if (dr["StopBits"] != DBNull.Value)
{
entity.StopBits = Convert.ToInt32(dr["StopBits"]);
}
if (dr["AcquisitionInterval"] != DBNull.Value)
{
entity.AcquisitionInterval = Convert.ToInt32(dr["AcquisitionInterval"]);
}
if (dr["ConnectType"] != DBNull.Value)
{
entity.ConnectType = SMOS.Model.Eunm.ConvertToEnum<SMOS.Model.Eunm.DeviceConnectType>(dr["ConnectType"]);
}
if (dr["CreateBy"] != DBNull.Value)
{
entity.CreateBy = dr["CreateBy"].ToString();
}
else
{
entity.CreateBy = string.Empty;
}
entity.CreateTime = Convert.ToDateTime(dr["CreateTime"]);
if (dr["UpdateBy"] != DBNull.Value)
{
entity.UpdateBy = dr["UpdateBy"].ToString();
}
else
{
entity.UpdateBy = string.Empty;
}
if (dr["UpdateTime"] != DBNull.Value)
{
entity.UpdateTime = Convert.ToDateTime(dr["UpdateTime"]);
}
return entity;
}
#endregion
}
}
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SMOS.Model.Device;
using System.Data.SqlClient;
using System.Data; namespace SMOS.DAL.Device
{
public class WaterLevelRecordDao
{
/// <summary>
/// 查出水位计记录信息的最后一条记录
/// </summary>
/// <param name="deviceID">设备ID</param>
/// <returns>操作记录</returns>
public WaterLevelRecordInfo GetLastWaterLevelRecordInfo(int deviceID)
{
string sql =
@"select top 1
t.RecordID,t.DeviceID,t.MeasuredLevel,t.RecordTime,
t.CreateBy,t.CreateTime,t.Remark
from dbo.WaterLevelRecord t(nolock)
where t.DeviceID=@DeviceID
order by t.CreateTime desc"; IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@DeviceID",SqlDbType.Int){Value = deviceID}
}; WaterLevelRecordInfo entity = null;
DataSet ds = DBHelper.ExecuteDataset(sql, paras.ToArray()); if (ds == null || ds.Tables.Count <= || ds.Tables[].Rows.Count <= )
{
return entity;
}
return DataRowBinding(ds.Tables[].Rows[]); }
/// <summary>
/// 查询水位计的记录信息
/// </summary>
/// <param name="deviceID">设备ID</param>
/// <returns>记录信息</returns>
public IList<WaterLevelRecordInfo> GetWaterLevelRecordInfos(int deviceID)
{
string sql =
@"select t.RecordID,t.DeviceID,t.MeasuredLevel,t.RecordTime,
t.CreateBy,t.CreateTime,t.UpdateBy,t.UpdateTime,t.Remark
from dbo.WaterLevelRecord t(nolock)
where t.DeviceID=@DeviceID";
IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@DeviceID",SqlDbType.Int){Value = deviceID}
};
IList<WaterLevelRecordInfo> lstWaterLevelRecordInfo = new List<WaterLevelRecordInfo>();
DataSet ds = DBHelper.ExecuteDataset(sql, paras.ToArray()); if (ds == null || ds.Tables.Count <= )
return lstWaterLevelRecordInfo;
foreach (DataRow dr in ds.Tables[].Rows)
{
WaterLevelRecordInfo entity = DataRowBinding(dr);
if (entity != null)
{
lstWaterLevelRecordInfo.Add(entity);
}
}
return lstWaterLevelRecordInfo;
}
/// <summary>
/// 分时间查出水位计相应记录信息
/// </summary>
/// <param name="deviceID">设备ID</param>
/// <param name="startTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <returns>记录信息</returns>
public IList<WaterLevelRecordInfo> GetWaterLevelRecordInfos(int deviceID, DateTime startTime, DateTime endTime)
{
string sql =
@"select t.RecordID,t.DeviceID,t.MeasuredLevel,t.RecordTime,
t.CreateBy,t.CreateTime,t.Remark
from dbo.WaterLevelRecord t(nolock)
where t.DeviceID=@DeviceID and RecordTime between @startTime and @endTime";
IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@DeviceID",SqlDbType.Int){Value = deviceID},
new SqlParameter("@startTime",SqlDbType.DateTime){Value = startTime },
new SqlParameter("@endTime",SqlDbType.DateTime){Value = endTime }
};
IList<WaterLevelRecordInfo> lstWaterLevelRecordInfos = new List<WaterLevelRecordInfo>();
DataSet ds = DBHelper.ExecuteDataset(sql, paras.ToArray());
if (ds == null || ds.Tables.Count <= )
{
return lstWaterLevelRecordInfos;
}
foreach (DataRow dr in ds.Tables[].Rows)
{
WaterLevelRecordInfo entity = DataRowBinding(dr);
if (entity != null)
{
lstWaterLevelRecordInfos.Add(entity);
}
}
return lstWaterLevelRecordInfos;
}
/// <summary>
/// 增加水位计记录信息
/// </summary>
/// <param name="recordInfo">水位计记录信息</param>
/// <returns>操作记录</returns>
public int AddWaterLevelRecordInfo(WaterLevelRecordInfo recordInfo)
{
if (recordInfo == null)
{
return ;
}
string sql =
@"INSERT INTO dbo.WaterLevelRecord
(DeviceID,MeasuredLevel,RecordTime,
CreateBy,CreateTime,Remark
)
VALUES
(@DeviceID,@MeasuredLevel,@RecordTime,
@CreateBy,@CreateTime,@Remark
)
SELECT @@IDENTITY";
IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@DeviceID",SqlDbType.Int){Value = recordInfo.DeviceID},
new SqlParameter("@MeasuredLevel",SqlDbType.Decimal){Value = recordInfo.MeasuredLevel},
new SqlParameter("@RecordTime",SqlDbType.DateTime){Value = recordInfo.RecordTime},
new SqlParameter("@CreateTime",SqlDbType.DateTime){Value = DateTime.Now},
new SqlParameter("@CreateBy",SqlDbType.NVarChar,){Value = Global.GlobalInfo.loginInfo.LoginAccount},
new SqlParameter("@Remark",SqlDbType.NChar,){Value = recordInfo.Remark},
};
object ret = DBHelper.ExecuteScalar(sql, paras.ToArray());//返回非表类查询结果,自增的ID
if (ret != null && int.Parse(ret.ToString()) >= )
{
return int.Parse(ret.ToString());
}
return ;
}
/// <summary>
/// 更新水位计记录
/// </summary>
/// <param name="recordInfo">水位计记录信息</param>
/// <returns>操作记录</returns>
public int ModifyWaterLevelRecordInfo(WaterLevelRecordInfo recordInfo)
{
if (recordInfo == null)
{
return ;
}
string sql =
@"UPDATE dbo.WaterLevelRecord
SET DeviceID=@DeviceID
,MeasuredLevel=@MeasuredLevel
,RecordTime=@RecordTime
,UpdateBy=@UpdateBy
,UpdateTime=@UpdateTime
,Remark=@Remark
WHERE RecordID=@RecordID";
IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@RecordID",SqlDbType.Int){Value = recordInfo.RecordID},
new SqlParameter("@DeviceID",SqlDbType.Int){Value = recordInfo.DeviceID},
new SqlParameter("@MeasuredLevel",SqlDbType.Decimal){Value = recordInfo.MeasuredLevel},
new SqlParameter("@RecordTime",SqlDbType.DateTime){Value = recordInfo.RecordTime},
new SqlParameter("@UpdateTime",SqlDbType.DateTime){Value = DateTime.Now},
new SqlParameter("@UpdateBy",SqlDbType.NVarChar,){Value = Global.GlobalInfo.loginInfo.LoginAccount},
new SqlParameter("@Remark",SqlDbType.NVarChar,){Value = recordInfo.Remark},
};
return DBHelper.ExecuteNonQuery(sql, paras.ToArray());
}
/// <summary>
/// 删除水位计记录信息
/// </summary>
/// <param name="recordInfo">水位计记录信息</param>
/// <returns>操作记录</returns>
public int DelWaterLevelRecordInfo(WaterLevelRecordInfo recordInfo)
{
if (recordInfo == null)
{
return ;
}
string sql =
@"DELETE FROM dbo.WaterLevelRecord
WHERE RecordID=@RecordID";
IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@RecordID",SqlDbType.Int){Value = recordInfo.RecordID },
}; return DBHelper.ExecuteNonQuery(sql, paras.ToArray());
}
#region 数据绑定
private WaterLevelRecordInfo DataRowBinding(DataRow dr)
{
if (dr == null)
{
return null;
}
WaterLevelRecordInfo entity = new WaterLevelRecordInfo();
entity.DeviceID = Convert.ToInt32(dr["DeviceID"]);
entity.MeasuredLevel=Convert.ToDecimal(dr["MeasuredLevel"]);
if (dr["Remark"] != DBNull.Value)
{
entity.Remark = dr["Remark"].ToString();
}
else
{
entity.Remark = string.Empty;
}
entity.RecordTime = Convert.ToDateTime(dr["RecordTime"]);
if (dr["CreateBy"] != DBNull.Value)
{
entity.CreateBy= dr["CreateBy"].ToString();
}
else
{
entity.CreateBy = string.Empty;
}
entity.CreateTime = Convert.ToDateTime(dr["CreateTime"]);
if (dr["UpdateBy"] != DBNull.Value)
{
entity.UpdateBy = dr["UpdateBy"].ToString();
}
else
{
entity.UpdateBy = string.Empty;
}
if (dr["UpdateTime"] != DBNull.Value)
{
entity.UpdateTime = Convert.ToDateTime(dr["UpdateTime"]);
} return entity;
}
#endregion
}
}

  若需转载请标明出处或链接http://www.cnblogs.com/EaIE099/,本人初入职场,对编程也是一个菜鸟,只想把自己所学点滴记录下来,如有不合理的地方希望各位高手多多指点,非常感谢!

用C#实现对MSSqlServer数据库的增删改查---DAL层的更多相关文章

  1. 用C#实现对MSSqlServer数据库的增删改查---Server层(WaterLevelRecordServer.cs、DeviceRecordServer.cs)

    抛开现实的残酷与无奈,对技术孜孜不倦的追求,从专注到执着,从疯狂到忘我,始终坚信代码可以改变世界,更能改变自己的人生. WaterLevelRecordServer.cs using System; ...

  2. 用C#实现对MSSqlServer数据库的增删改查---Server层(WaterLevelSetServer.cs、DeviceSetServer.cs)

    在Server层定义WaterLevelSetServer和WaterLevelRecordServer两个子类,分别继承DeviceSetServer和DeviceRecordServer. usi ...

  3. SQLite帮助类SQlitehelper 实现对SQLite数据的增删改查

    public class SQLiteHelper { public const string sConn = "Data Source=" + @"path" ...

  4. python web.py操作mysql数据库,实现对数据库的增删改查操作

    使用web.py框架,实现对mysql数据库的增删改查操作: 该示例代码中连接的是本地数据库testdb,user表,表结构比较简单,只有两个字段:mobile和passwd,类型均为字符型 实际应用 ...

  5. Java操作数据库实现"增删改查"

    本文主要讲解JDBC操作数据库    主要实现对MySql数据库的"增删改查" 综合概述: JDBC的常用类和接口 一   DriverManager类 DriverManage类 ...

  6. ThinkPHP实现对数据库的增删改查

    好久都没有更新博客了,之前老师布置的任务总算是现在可以说告一段落了,今天趁老师还没提出其他要求来更新一篇博客. 今天我想记录的是我之前做项目,自己所理解的ThinkPHP对数据库的增删改查. 首先要说 ...

  7. Android学习---数据库的增删改查(sqlite CRUD)

    上一篇文章介绍了sqlite数据库的创建,以及数据的访问,本文将主要介绍数据库的增删改查. 下面直接看代码: MyDBHelper.java(创建数据库,添加一列phone) package com. ...

  8. Android 系统API实现数据库的增删改查和SQLite3工具的使用

    在<Android SQL语句实现数据库的增删改查>中介绍了使用sql语句来实现数据库的增删改查操作,本文介绍Android 系统API实现数据库的增删改查和SQLite3工具的使用. 系 ...

  9. Android SQL语句实现数据库的增删改查

    本文介绍android中的数据库的增删改查 复习sql语法: * 增 insert into info (name,phone) values ('wuyudong','111') * 删 delet ...

随机推荐

  1. bootstrap练习制作网页

    导航条 <nav class="navbar navbar-default"> <div class="container-fluid"> ...

  2. jmeter3.2生成图形html遇到的问题Error in NonGUIDriver java.lang.IllegalArgumentException: Results file:log is not empty

    遇到Creating summariser <summary> Error in NonGUIDriver java.lang.IllegalArgumentException: Resu ...

  3. Django 2.0 学习(15):Web框架

    Web框架的本质 对于学习Python的同学,相信对Flask.Django.Web.py等不会陌生,这些都是Python语言的web框架.那么问题来了,web服务器是什么?它和web框架有什么关系? ...

  4. 【Java】常用POI生成Excel文档设置打印样式

    package poi_test; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi ...

  5. QML从文件加载组件简单示例

    QML从文件加载组件简单示例 文件目录列表: Project1.pro QT += quick CONFIG += c++ CONFIG += declarative_debug CONFIG += ...

  6. windows 网络共享无法用

    可以远程电脑,但是无法网卡共享 原因是  远程电脑的Server服务停掉了,再开启下就行了

  7. Android 解决ScrollView嵌入ListView | GridView | ScrollView显示问题

    一.ScrollView中嵌套ListView ScrollView和ListView都是滚动结构,很明显如果在ScrollView中加入ListView,可以预见性的知道,肯定会有显示/滚动的问题, ...

  8. CF891E [数学题]

    1.答案=初始乘积-最终乘积的期望.然后直接dp+ntt是O(nklogk) 2.考虑展开式子ans=sum(a[i]-b[i]),大概感受一下未知数个数相同的项系数相同,问题在于如何求系数 3.没思 ...

  9. loj2541 「PKUWC2018」猎人杀 【容斥 + 分治NTT】

    题目链接 loj2541 题解 思路很妙啊, 人傻想不到啊 觉得十分难求,考虑容斥 由于\(1\)号可能不是最后一个被杀的,我们容斥一下\(1\)号之后至少有几个没被杀 我们令\(A = \sum\l ...

  10. 洛谷 P3802 小魔女帕琪 解题报告

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...