Я читаю строку, используя этот формат, с помощью устройства чтения данных. Как я могу читать дату с использованием аналогичного формата?
while (MyReader.Read())
{
TextBox1.Text = (string)MyReader["Note"];
}
Я читаю строку, используя этот формат, с помощью устройства чтения данных. Как я могу читать дату с использованием аналогичного формата?
while (MyReader.Read())
{
TextBox1.Text = (string)MyReader["Note"];
}
Попробуйте указать ниже:
while (MyReader.Read())
{
TextBox1.Text = Convert.ToDateTime(MyReader["DateField"]).ToString("dd/MM/yyyy");
}
в ToString()
вы можете изменить формат данных в соответствии с вашими требованиями.
Если столбец запроса имеет соответствующий тип, то
var dateString = MyReader.GetDateTime(MyReader.GetOrdinal("column")).ToString(myDateFormat)
Если столбец запроса фактически является строкой, то см. другие ответы.
Это может показаться слегка не относящимся к теме, но это был столбец, с которым я столкнулся, когда задавался вопросом, что происходит, когда вы читаете столбец как dateTime в С#. Сообщение отражает информацию, которую мне хотелось бы узнать об этом механизме. Если вы беспокоитесь о utc и timezones, тогда прочитайте
Я сделал немного больше исследований, так как я всегда очень опасаюсь DateTime как класса из-за его автоматических предположений о том, какой часовой пояс вы используете, и потому что слишком легко путать локальные времена и utc.
То, что я пытаюсь избежать здесь, - это DateTime going 'oh look the computer, на котором я запускаюсь, находится во временной области x, поэтому на этот раз также должен быть часовой пояс x, когда меня спрашивают о моих значениях. ответ, как будто я в этом часовом поясе
Я пытался прочитать столбец datetime2
.
Время, в которое вы вернетесь с сервера sql, будет Kind.Unspecified
, похоже, это означает, что он обрабатывается как UTC, и это то, что я хотел.
При чтении столбца date
вы также должны прочитать его как DateTime
, даже если у него нет времени, и он еще более подвержен зависанию по часам (как в полночь).
Я бы счел это более безопасным способом чтения DateTime, поскольку я подозреваю, что он, вероятно, может быть изменен с помощью настроек в sql-сервере или статических настроек в вашем С#:
var time = reader.GetDateTime(1);
var utcTime = new DateTime(time.Ticks, DateTimeKind.Utc);
Оттуда вы можете получить компоненты (День, Месяц, Год) и т.д. и отформатировать, как вам нравится.
Если то, что у вас есть на самом деле - дата + время, то Utc может не быть тем, что вы хотите там, так как вы набрасываетесь на клиента, вам может понадобиться сначала преобразовать его в локальное время (в зависимости от того, время). Однако это открывает целую банку червей. Если вам нужно это сделать, я бы рекомендовал использовать библиотеку, например noda time. В стандартной библиотеке есть TimeZoneInfo
, но после кратковременного изучения это не похоже на правильный набор часовых поясов. Вы можете увидеть список, предоставленный TimeZoneInfo
, используя метод TimeZoneInfo.GetSystemTimeZones();
Я также обнаружил, что студия управления сервером sql не конвертирует время в локальное время, прежде чем отображать их. Это облегчение!
(DateTime)MyReader["ColumnName"];
ИЛИ
Convert.ToDateTime(MyReader["ColumnName"]);
/// <summary>
/// Returns a new conContractorEntity instance filled with the DataReader current record data
/// </summary>
protected virtual conContractorEntity GetContractorFromReader(IDataReader reader)
{
return new conContractorEntity()
{
ConId = reader["conId"].ToString().Length > 0 ? int.Parse(reader["conId"].ToString()) : 0,
ConEmail = reader["conEmail"].ToString(),
ConCopyAdr = reader["conCopyAdr"].ToString().Length > 0 ? bool.Parse(reader["conCopyAdr"].ToString()) : true,
ConCreateTime = reader["conCreateTime"].ToString().Length > 0 ? DateTime.Parse(reader["conCreateTime"].ToString()) : DateTime.MinValue
};
}
ИЛИ
/// <summary>
/// Returns a new conContractorEntity instance filled with the DataReader current record data
/// </summary>
protected virtual conContractorEntity GetContractorFromReader(IDataReader reader)
{
return new conContractorEntity()
{
ConId = GetValue<int>(reader["conId"]),
ConEmail = reader["conEmail"].ToString(),
ConCopyAdr = GetValue<bool>(reader["conCopyAdr"], true),
ConCreateTime = GetValue<DateTime>(reader["conCreateTime"])
};
}
// Base methods
protected T GetValue<T>(object obj)
{
if (typeof(DBNull) != obj.GetType())
{
return (T)Convert.ChangeType(obj, typeof(T));
}
return default(T);
}
protected T GetValue<T>(object obj, object defaultValue)
{
if (typeof(DBNull) != obj.GetType())
{
return (T)Convert.ChangeType(obj, typeof(T));
}
return (T)defaultValue;
}
В моем случае я изменил поле datetime в базе данных SQL, чтобы не допускать null. Затем SqlDataReader разрешил мне использовать значение непосредственно в DateTime.
Я знаю, что это старый вопрос, но я удивлен, что ни один ответ не упоминает GetDateTime
:
Возвращает значение указанного столбца в качестве объекта
DateTime
.
Который вы можете использовать как:
while (MyReader.Read())
{
TextBox1.Text = MyReader.GetDateTime(columnPosition).ToString("dd/MM/yyyy");
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace Library
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\NIKHIL R\Documents\Library.mdf;Integrated Security=True;Connect Timeout=30");
string query = "INSERT INTO [Table] (BookName , AuthorName , Category) VALUES('" + textBox1.Text.ToString() + "' , '" + textBox2.Text.ToString() + "' , '" + textBox3.Text.ToString() + "')";
SqlCommand com = new SqlCommand(query, con);
con.Open();
com.ExecuteNonQuery();
con.Close();
MessageBox.Show("Entry Added");
}
private void button3_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\NIKHIL R\Documents\Library.mdf;Integrated Security=True;Connect Timeout=30");
string query = "SELECT * FROM [TABLE] WHERE BookName='" + textBox1.Text.ToString() + "' OR AuthorName='" + textBox2.Text.ToString() + "'";
string query1 = "SELECT BookStatus FROM [Table] where BookName='" + textBox1.Text.ToString() + "'";
string query2 = "SELECT DateOfReturn FROM [Table] where BookName='" + textBox1.Text.ToString() + "'";
SqlCommand com = new SqlCommand(query, con);
SqlDataReader dr, dr1,dr2;
con.Open();
com.ExecuteNonQuery();
dr = com.ExecuteReader();
if (dr.Read())
{
con.Close();
con.Open();
SqlCommand com1 = new SqlCommand(query1, con);
com1.ExecuteNonQuery();
dr1 = com1.ExecuteReader();
dr1.Read();
string i = dr1["BookStatus"].ToString();
if (i =="1" )
{
con.Close();
con.Open();
SqlCommand com2 = new SqlCommand(query2, con);
com2.ExecuteNonQuery();
dr2 = com2.ExecuteReader();
dr2.Read();
MessageBox.Show("This book is already issued\n " + "Book will be available by "+ dr2["DateOfReturn"] );
}
else
{
con.Close();
con.Open();
dr = com.ExecuteReader();
dr.Read();
MessageBox.Show("BookFound\n" + "BookName=" + dr["BookName"] + "\n AuthorName=" + dr["AuthorName"]);
}
con.Close();
}
else
{
MessageBox.Show("This Book is not available in the library");
}
}
private void button2_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\NIKHIL R\Documents\Library.mdf;Integrated Security=True;Connect Timeout=30");
string query = "SELECT * FROM [TABLE] WHERE BookName='" + textBox1.Text.ToString() + "'";
string dateofissue1 = DateTime.Today.ToString("dd-MM-yyyy");
string dateofreturn = DateTime.Today.AddDays(15).ToString("dd-MM-yyyy");
string query1 = "update [Table] set BookStatus=1,DateofIssue='"+ dateofissue1 +"',DateOfReturn='"+ dateofreturn +"' where BookName='" + textBox1.Text.ToString() + "'";
con.Open();
SqlCommand com = new SqlCommand(query, con);
SqlDataReader dr;
com.ExecuteNonQuery();
dr = com.ExecuteReader();
if (dr.Read())
{
con.Close();
con.Open();
string dateofissue = DateTime.Today.ToString("dd-MM-yyyy");
textBox4.Text = dateofissue;
textBox5.Text = DateTime.Today.AddDays(15).ToString("dd-MM-yyyy");
SqlCommand com1 = new SqlCommand(query1, con);
com1.ExecuteNonQuery();
MessageBox.Show("Book Isuued");
}
else
{
MessageBox.Show("Book Not Found");
}
con.Close();
}
private void button4_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\NIKHIL R\Documents\Library.mdf;Integrated Security=True;Connect Timeout=30");
string query1 = "update [Table] set BookStatus=0 WHERE BookName='"+textBox1.Text.ToString()+"'";
con.Open();
SqlCommand com = new SqlCommand(query1, con);
com.ExecuteNonQuery();
string today = DateTime.Today.ToString("dd-MM-yyyy");
DateTime today1 = DateTime.Parse(today);
string query = "SELECT dateofReturn from [Table] where BookName='" + textBox1.Text.ToString() + "'";
con.Close();
con.Open();
SqlDataReader dr;
SqlCommand cmd = new SqlCommand(query, con);
cmd.ExecuteNonQuery();
dr = cmd.ExecuteReader();
dr.Read();
string DOR = dr["DateOfReturn"].ToString();
DateTime dor = DateTime.Parse(DOR);
TimeSpan ts = today1.Subtract(dor);
string query2 = "update [Table] set DateOfIssue=NULL, DateOfReturn=NULL WHERE BookName='" + textBox1.Text.ToString() + "'";
con.Close();
con.Open();
SqlCommand com2 = new SqlCommand(query2, con);
com2.ExecuteNonQuery();
int x = int.Parse(ts.Days.ToString());
if (x > 0)
{
int fine = x * 5;
textBox6.Text = fine.ToString();
MessageBox.Show("Book Received\nFine=" + fine);
}
else
{
textBox6.Text = "0";
MessageBox.Show("Book Received\nFine=0");
}
con.Close();
}
}
}