深入了解ADO.NET:如何处理数据库时间 (ado.net 数据库时间)

在使用数据库时,处理时间数据总是一个重要的任务。因为时间数据的正确性直接影响到数据查询和应用程序的可靠性。本文将深入介绍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。我们介绍了如何存储和获取时间数据,以及如何处理不同的时间数据类型。我们介绍了如何处理时区问题。了解这些内容对于正确地处理时间数据是很重要的。

相关问题拓展阅读:

  • ado.net快速上手实践篇(二)

ado.net快速上手实践篇(二)

五、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 数据库时间的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

香港服务器首选树叶云,2H2G首月10元开通。
树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/269126.html<

(0)
运维的头像运维
上一篇2025-05-07 05:10
下一篇 2025-05-07 05:11

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注