C# 将字符串解码为日期时间

C# 将字符串解码为日期时间,c#,datetime,string-decoding,C#,Datetime,String Decoding,我将数据库中的DateTime设置为字符串,例如:6@11@2012@1@37 我有这样的解码方法: public static DateTime DecodeTime(string time) { int day = Int32.Parse(time.Split('@')[0].Trim()); int month = Int32.Parse(time.Split('@')[1].Trim()); int

我将数据库中的DateTime设置为字符串,例如:6@11@2012@1@37 我有这样的解码方法:

public static DateTime DecodeTime(string time)
        {
            int day = Int32.Parse(time.Split('@')[0].Trim());
            int month = Int32.Parse(time.Split('@')[1].Trim());
            int year = Int32.Parse(time.Split('@')[2].Trim());
            int hour = Int32.Parse(time.Split('@')[3].Trim());
            int minute = Int32.Parse(time.Split('@')[4].Trim());

            DateTime decode = new DateTime(year, month, day, hour, minute, 0);

            return decode;
        }
 public DataSet GetAllBooking()
        {
            string connString = ConfigurationManager.ConnectionStrings["SQL2012_892524_amritConnectionString"].ConnectionString;
            DataSet dataSet = new DataSet();
            // Create connection object
            //OleDbConnection oleConn = new OleDbConnection(connString);
            SqlConnection oleConn = new SqlConnection(connString);
             try
            {
                oleConn.Open();
                string sql = "SELECT TOP (50) Driver.FirstName + Driver.LastName AS DriverName, Booking.BookingId, Driver.CarId AS CarUsed, Booking.CreateDateTime AS BookingDateTime, Booking.Status FROM Booking INNER JOIN Customer ON Booking.CustomerId = Customer.CustomerId INNER JOIN Driver ON Booking.DriverId = Driver.DriverId ORDER BY Booking.BookingId DESC";
                SqlDataAdapter dataAdapter = new SqlDataAdapter(sql, oleConn);
                dataAdapter.Fill(dataSet, "Booking");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                oleConn.Close();
            }
            if (dataSet.Tables.Count <= 0)
                return null;
            else
                return dataSet;
        }
我试图做的是将信息放入数据集中,如下所示:

public static DateTime DecodeTime(string time)
        {
            int day = Int32.Parse(time.Split('@')[0].Trim());
            int month = Int32.Parse(time.Split('@')[1].Trim());
            int year = Int32.Parse(time.Split('@')[2].Trim());
            int hour = Int32.Parse(time.Split('@')[3].Trim());
            int minute = Int32.Parse(time.Split('@')[4].Trim());

            DateTime decode = new DateTime(year, month, day, hour, minute, 0);

            return decode;
        }
 public DataSet GetAllBooking()
        {
            string connString = ConfigurationManager.ConnectionStrings["SQL2012_892524_amritConnectionString"].ConnectionString;
            DataSet dataSet = new DataSet();
            // Create connection object
            //OleDbConnection oleConn = new OleDbConnection(connString);
            SqlConnection oleConn = new SqlConnection(connString);
             try
            {
                oleConn.Open();
                string sql = "SELECT TOP (50) Driver.FirstName + Driver.LastName AS DriverName, Booking.BookingId, Driver.CarId AS CarUsed, Booking.CreateDateTime AS BookingDateTime, Booking.Status FROM Booking INNER JOIN Customer ON Booking.CustomerId = Customer.CustomerId INNER JOIN Driver ON Booking.DriverId = Driver.DriverId ORDER BY Booking.BookingId DESC";
                SqlDataAdapter dataAdapter = new SqlDataAdapter(sql, oleConn);
                dataAdapter.Fill(dataSet, "Booking");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                oleConn.Close();
            }
            if (dataSet.Tables.Count <= 0)
                return null;
            else
                return dataSet;
        }
公共数据集GetAllBooking() { string connString=ConfigurationManager.ConnectionString[“SQL2012\U 892524\U amritConnectionString”]。ConnectionString; 数据集=新数据集(); //创建连接对象 //OLEDB连接oleConn=新的OLEDB连接(connString); SqlConnection-oleConn=新的SqlConnection(connString); 尝试 { 尺骨鹰嘴开(); string sql=“选择TOP(50)Driver.FirstName+Driver.LastName作为DriverName,Booking.BookingId,Driver.CarId作为CarUsed,Booking.CreateDateTime作为BookingDateTime,Booking.Status FROM Booking-internal-JOIN-Customer-ON-Booking.CustomerId=Customer.CustomerId-internal-JOIN-Driver-ON-Booking.DriverId=Driver.DriverId-ORDER-BY-BY-bookin; SqlDataAdapter dataAdapter=新的SqlDataAdapter(sql,OLECTONN); dataAdapter.Fill(数据集,“预订”); } 捕获(例外情况除外) { Console.WriteLine(例如ToString()); } 最后 { 鹰嘴闭合(); }
如果(dataSet.Tables.CountSqlDataAdapter/DataTable/DataColumn不提供任何机制来截取值并将其类型更改为DateTime(您只能将某些内容转换为自定义类)。最好在SQL查询中进行转换(尽管字符串函数非常有限,因此查询将非常长)

另一个选项是在返回之前向表中添加一个新的DateTime列,并遍历每一行以调用您的方法

if (dataSet.Tables.Count == 0)
    return null;

dataSet.Tables[0].Columns.Add(new DataColumn("CreationTime2", typeof(DateTime)));
foreach (var r in dataSet.Tables[0].Rows)
    r["CreationTime2"] = DecodeTime(r["CreationTime"]);

return dataSet;

这可以使用
String.Format
方法实现。

像往常一样将GridView绑定到数据源,并在标记中声明一个模板列,如下所示

<asp:TemplateField HeaderText="Date">
    <ItemTemplate>
        <%# String.Format("{2}/{1}/{0} {3}:{4}:00", 
                  Eval("ColName").Split('@') ) %>
    </ItemTemplate>
<asp:TemplateField>


第一件事-不应该调用string.Split()5次,但仅一次并重用同一阵列您的数据适配器将返回数据库指定的任何数据类型,因此,如果您返回varchar,您将得到一个字符串。您不能使用存储过程来执行此操作吗?什么存储过程?我无法更改数据库,但我希望以任何方式将该字符串转换为datetime并显示它o gridview。此问题的任何解决方案/我如何在sql查询中进行转换?任何帮助或提示?您使用的是哪种sql server和版本?添加了另一个示例,说明如何在.net端进行转换,因为sql转换将非常长。我遇到了此错误“错误1 foreach语句无法对“System.Data.DataTable”类型的变量进行操作,因为“System.Data.DataTable”不包含“GetEnumerator”的公共定义C:\Users\smartamrit\Desktop\Admin Site\northstar\northstar\DriverJob.aspx.cs 46 13 northstar”"请让我们详细说明如何实现您的解决方案打开您的
aspx
页面,然后在
GridView控件标记的
..
标记中,将其放置在html的上方。然后将
ColName更改为您的列名称,其中包含字符串date
。这就是您需要做的所有事情。好的,我可以做到,但确实如此可能无法显示字符串中包含日期时间的列您的问题是如何在Gridview上显示它,不是吗?现在您不需要显示了吗?抱歉,我弄错了,当我按照您的过程进行操作时,它会创建另一列,这很好。现在有两列,一列带有字符串,另一列带有拆分字符串。