在使用数据库时,处理时间数据总是一个重要的任务。因为时间数据的正确性直接影响到数据查询和应用程序的可靠性。本文将深入介绍ADO.NET如何处理数据库时间,为读者提供更多关于时间数据的信息。
1. 时间数据类型
在大多数关系数据库中,时间数据类型通常包括日期时间、时间戳等。不同的数据库管理系统可能有不同的时间数据类型,它们可以通过ADO.NET提供的一些类进行映射。以下是一些常见的时间数据类型:
– datetime: 表示一个日期和时间值,它的精度可达到秒级别。在SQL Server中,它的取值范围为”1753/1/1 00:00:00″到”9999/12/31 23:59:59″。
– datetime2: 表示一个日期和时间值,它的精度可达到各种级别,从100纳秒到1微秒不等。在SQL Server中,它的取值范围与datetime相同。
– time: 表示一个时间值,可以精确到秒、毫秒或者微秒。它的取值范围为”00:00:00″到”23:59:59.9999999″。
– timestamp: 表示一个二进制值,它在数据库中用于实现数据行的版本控制。它的大小为8字节,由数据库自动生成。
2. 处理时间数据
在使用ADO.NET处理时间数据时,需要注意以下几点:
2.1. 存储时间数据
在向数据库中存储时间数据时,需要将时间数据转换成数据库中的时间数据类型。例如,在SQL Server中,可以使用datetime或datetime2数据类型来存储日期时间信息。在进行数据插入或更新操作时,需要使用以下代码将时间数据转换成数据库中的数据类型:
“`
DateTime dateTime = DateTime.Now;
SqlParameter param = new SqlParameter(“@DateTime”, SqlDbType.DateTime);
param.Value = dateTime;
“`
2.2. 获取时间数据
在从数据库中获取时间数据时,需要使用DataReader对象的GetDateTime()方法来获取DateTime类型的时间值。例如,以下代码查询数据库中的时间数据并显示到控制台上:
“`
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand(“SELECT CreationTime FROM Users WHERE Id = @Id”, conn);
cmd.Parameters.AddWithValue(“@Id”, 1);
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
DateTime creationTime = reader.GetDateTime(0);
Console.WriteLine(creationTime.ToString());
}
reader.Close();
}
“`
2.3. 处理不同的时间数据类型
如果数据库中存储的时间数据类型与.NET中的时间数据类型不同,需要使用Convert类或者DateTime.Parse()方法来将数据类型进行转换。以下是一个例子:
“`
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand(“SELECT StartTime FROM Schedule WHERE Id = @Id”, conn);
cmd.Parameters.AddWithValue(“@Id”, 1);
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
string startTime = reader.GetString(0);
DateTime dt = DateTime.Parse(startTime);
Console.WriteLine(dt.ToString());
}
reader.Close();
}
“`
3. 时区处理
在分布式应用程序中,时区处理是一个复杂的问题。由于不同的地理位置使用不同的时区,这可能会导致时间数据的混乱。因此,了解如何在应用程序中正确处理时区是很重要的。
在.NET中,可以使用TimeZoneInfo类来处理时区。它提供了一些方法来将本地时间转换为协调世界时(UTC)或将UTC时间转换为指定时区的时间。以下是一个例子:
“`
DateTime localTime = new DateTime(2023, 1, 1, 14, 0, 0);
TimeZoneInfo chinaZone = TimeZoneInfo.FindSystemTimeZoneById(“China Standard Time”);
DateTime chinaTime = TimeZoneInfo.ConvertTime(localTime, chinaZone);
Console.WriteLine(“Local time: {0}”, localTime);
Console.WriteLine(“China time: {0}”, chinaTime);
“`
4.
在本文中,我们深入讨论了ADO.NET如何处理数据库时间。我们介绍了常见的时间数据类型,包括datetime、datetime2、time和timestamp。我们介绍了如何存储和获取时间数据,以及如何处理不同的时间数据类型。我们介绍了如何处理时区问题。了解这些内容对于正确地处理时间数据是很重要的。
成都网站建设公司-创新互联为您提供网站建设、网站制作、网页设计及定制高端网站建设服务!
五、dal层数据访问实现
在这里我们使用前一篇文章里实现的数据持久化层和伪SqlMapper对象,实现数据操作。下面我们来看看Dal下缺友核心的Dao如何实现:
还记得我们在下面的dao类是怎么实现的吗?没错,我们前陆根据一个基类BaseDAO和它的构造函数,实现dao的配置加载。但是楼猪的实现没有那么复杂和强大,本文的实现其实就是通过BaseDAO和构造函数获取数据库连接对象的key,初始化一个SqlMapper,然后利用SqlMapper对象进行基本的CRUD等等数据操作。那么我们如何利用BaseDAO和构造函数就像以慧扮顷前在系列文章里的提到的Dal层下那样进行SqlMapper的初始化呢?
1、在AdoNetDataaccess.Mapper下我们定义公共的BaseDAO类
代码
namespace AdoNetDataAccess.Mapper
{
public abstract class BaseDAO
{
#region PRoperties
public SqlMapper SqlMapper { get; set; }
#endregion
#region Constructor
private BaseDAO()
{
}
/// summary
/// SqlMapper属性适用
/// /summary
/// param name=”mapperName”/param
public BaseDAO(string mapperName)
{
this.SqlMapper = MapperUtill.GetMapper(mapperName);
}
#endregion
}
}
2、初始化SqlMapper的实用类
代码
using System;
using System.Collections.Generic;
using System.Configuration;
namespace AdoNetDataAccess.Mapper
{
using AdoNetDataAccess.Core.Contract;
using AdoNetDataAccess.Core.Implement;
public sealed class MapperUtill
{
#region fields
public static string currentSqlKey = “sqlConn”;
public static int cmdTimeOut = 15;
private static readonly object objSync = new object();
private static readonly IDictionarystring, SqlMapper dictMappers = new Dictionarystring, SqlMapper();
#endregion
#region constructor and methods
private MapperUtill()
{
}
static MapperUtill()
{
try
{
cmdTimeOut = int.Parse(ConfigurationManager.AppSettings);
}
catch
{
cmdTimeOut = 15;
}
//实例化SqlDbMapper
for (int i = 0; i
ConfigurationManager.ConnectionStrings.Count; i++)
{
string key = ConfigurationManager.ConnectionStrings.Name;
string value = ConfigurationManager.ConnectionStrings.ConnectionString;
CreateMapper(key, value, cmdTimeOut);
}
}
public static SqlMapper GetSqlMapper(string key)
{
return MapperUtill.GetMapper(key);
}
public static SqlMapper GetCurrentSqlMapper()
{
return MapperUtill.GetMapper(currentSqlKey);
}
public static void CreateMapper(string connKey, string sqlConStr, int connTimeOut)
{
IDbOperation operation = new SqlServer(sqlConStr, connTimeOut);
SqlMapper mapper = new SqlMapper(operation);
dictMappers.Add(connKey.ToUpper().Trim(), mapper);//不区分大小写
}
public static SqlMapper GetMapper(string sqlConKey)
{
if (string.IsNullOrEmpty(sqlConKey))
{
throw new Exception(“数据库连接字符串主键为空!”);
}
sqlConKey = sqlConKey.ToUpper();//不区分大小写
SqlMapper mapper = null;
if (dictMappers.ContainsKey(sqlConKey))
{
mapper = dictMappers;
}
else
{
throw new Exception(string.Format(“没有{0}所对应的数据库连接”, sqlConKey));
}
return mapper;
}
/// summary
/// 释放所有
/// /summary
public void Release()
{
foreach (KeyValuePairstring, SqlMapper kv in dictMappers)
{
SqlMapper mapper = kv.Value;
if (mapper == null)
{
continue;
}
mapper.CurrentDbOperation.CloseConnection();
}
dictMappers.Clear();
}
#endregion
}
}
这个实用类的重要作用就是初始化配置文件里connectionStrings配置节点,以获取sql连接对象必须的连接字符串。
3、PersonDao类
下面就是针对具体的Person表的数据操作了:
代码
using System.Collections.Generic;
using System.Data;
namespace AdoNetDataAccess.Dal.Dao
{
using AdoNetDataAccess.Dal.Model;
using AdoNetDataAccess.Dal.Utility;
using AdoNetDataAccess.Mapper;
public class PersonDao : BaseDAO
{
public PersonDao()
{
}
public int Insert(string sqlInsert)
{
int id = this.SqlMapper.Insert(sqlInsert);
//object obj = this.SqlMapper.ExecuteScalar(sqlInsert, System.Data.CommandType.Text, null);
return id;
}
public bool BatchInsert(IListPerson listModels)
{
int batchSize = 50000;
int copyTimeOut = 60;
DataTable dt = DataTableHelper.CreateTablePerson(listModels);
bool flag = this.SqlMapper.BatchInsert(typeof(Person).Name, batchSize, copyTimeOut, dt);
return flag;
}
public int Update(string sqlUpdate)
{
int result = this.SqlMapper.Update(sqlUpdate);
return result;
}
public IListPerson SelectPersons(string sqlSelect)
{
IListPerson listPersons = this.SqlMapper.QueryForListPerson(sqlSelect);
return listPersons;
}
public IDictionaryint, Person SelectDictPersons(string sqlSelect)
{
IDictionaryint, Person dictPersons = this.SqlMapper.QueryForDictionaryint, Person(“Id”, sqlSelect);
return dictPersons;
}
public DataTable SelectPersonTable(string sqlSelect)
{
DataTable dt = this.SqlMapper.FillDataTable(sqlSelect, CommandType.Text, null);
return dt;
}
public DataSet SelectPersonDataSet(string sqlSelect)
{
DataSet ds = this.SqlMapper.FillDataSet(sqlSelect, CommandType.Text, null);
return ds;
}
public int Delete(string sqlDelete)
{
int result = this.SqlMapper.Delete(sqlDelete);
return result;
}
}
}
到这里,一个dao类操作就实现了。然后我们按步就班实现对外调用的服务接口。在表现层调用吧。
六、表现层的调用
1、配置文件
代码
appSettings
add key=”db_timeOut” value=”5000″/
/appSettings
connectionStrings
add name=”sqlConn” connectionString=”Data Source=.sqlexpress; Initial Catalog=TestDb; User Id=sa; PassWord=123456;”/
add name=”sqlConnStr1″ connectionString=”Data Source=.sqlexpress; Initial Catalog=TestDb; User Id=sa; Password=123456;”/
add name=”sqlConnStr2″ connectionString=”Data Source=.sqlexpress; Initial Catalog=TestDb; User Id=sa; Password=123456;”/
/connectionStrings
其中,connectionString是必须的,如果没有,我们无法加载调用可用的SqlMapper。
2、CRUD操作测试
代码
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
namespace OOXXWebApp
{
using AdoNetDataAccess.Dal;
using AdoNetDataAccess.Dal.Model;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//增删改查测试
string sqlInsert = “INSERT Person (FirstName,LastName,Weight,Height) VALUES( ‘jeff’,’wong’,70,180) SELECT @@IDENTITY FROM Person(NOLOCK)”;
string sqlUpdate = “UPDATE Person SET Height=178 WHERE Id=1”;
string sqlSelect = “SELECT TOP 100 * FROM Person(NOLOCK)”;
string sqlDelete = “DELETE Person WHERE Id10 AND Id100”;
IListPerson listModels = new ListPerson();
for (int i = 0; i
500000; i++)
{
Person model = new Person();
model.FirstName = “Jeff”;
model.LastName = “Wong”;
model.Weight = 70;
model.Height = 180;
listModels.Add(model);
}
Response.Write(“Test Beginning……br/”);
int id = ServiceFactory.CreatePersonService().Add(sqlInsert);
Response.Write(string.Format(“br/Insert and return id:{0}”, id));
bool flag = ServiceFactory.CreatePersonService().BatchInsert(listModels);
Response.Write(string.Format(“br/ Batch Insert {0}”, flag ? “succeed” : “failed”));
IListPerson listPersons = ServiceFactory.CreatePersonService().GetPersons(sqlSelect);
Response.Write(string.Format(“br/Select pesons and return persons:{0}”, listPersons.Count));
IDictionaryint, Person dictPersons = ServiceFactory.CreatePersonService().GetDictPersons(sqlSelect);
Response.Write(string.Format(“br/Select pesons and return dictionary persons:{0}”, dictPersons.Count));
DataTable dt = ServiceFactory.CreatePersonService().GetPersonTable(sqlSelect);
Response.Write(string.Format(“br/Select pesons and return persons:{0}”, dt.Rows.Count));
DataSet ds = ServiceFactory.CreatePersonService().GetPersonDataSet(sqlSelect);
Response.Write(string.Format(“br/Select pesons and return persons:{0}”, ds.Tables.Rows.Count));
int affectNum = ServiceFactory.CreatePersonService().Modify(sqlUpdate);
Response.Write(string.Format(“br/Update and affect rows :{0}”, affectNum));
affectNum = 0;
affectNum = ServiceFactory.CreatePersonService().Remove(sqlDelete);
Response.Write(string.Format(“br/Delete and affect rows :{0}”, affectNum));
Response.Write(“br/br/Test End.”);
}
}
}
}
这个就不用多说了吧,表现层写SQL语句调用写好的服务就行了。比较不舒服的地方就是SQL语句不得不写在类里面,如果自动生成或者独立放在xml下实现可配置的形式那就更好了,当然sql语句不是我们讨论的重点,您有好的方法可以自己扩展实现更人性化的功能,减少书写SQLl语句的工作。
七、最后,对demo工程文件结构进行简单说明。
1、数据持久化层AdoNetDataAccess.Core
2、SqlMapper层AdoNetDataAccess.Mapper(引用AdoNetDataAccess.Core)
3、具体数据操作使用层AdoNetDataAccess.Dal(引用AdoNetDataAccess.Mapper)
关于ado.net 数据库时间的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
创新互联-老牌IDC、云计算及IT信息化服务领域的服务供应商,业务涵盖IDC(互联网数据中心)服务、云计算服务、IT信息化、AI算力租赁平台(智算云),软件开发,网站建设,咨询热线:028-86922220
网页标题:深入了解ADO.NET:如何处理数据库时间(ado.net数据库时间)
URL分享:http://www.csdahua.cn/qtweb/news31/354731.html
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网